<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.4.2 (Python 3.11.10 on linux)" generated="2026-04-10T00:48:15.884136" rpa="false" schemaversion="5">
<suite id="s1" name="openflowplugin-clustering-bulkomatic.txt" source="/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/suites/openflowplugin/Clustering_Bulkomatic">
<suite id="s1-s1" name="Cluster Reconcilliation Multi DPN" source="/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/suites/openflowplugin/Clustering_Bulkomatic/010__Cluster_Reconcilliation_Multi_DPN.robot">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils" type="SETUP">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.633100" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:16.628803" elapsed="0.004367"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-10T00:48:16.628007" elapsed="0.005250"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.638706" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-10T00:48:16.634859" elapsed="0.003880"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-10T00:48:16.639007" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:16.638864" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:16.638832" elapsed="0.000255"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.639671" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:16.639273" elapsed="0.000447"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.640254" level="INFO">${cluster_size} = 3</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-10T00:48:16.639906" elapsed="0.000377"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:48:16.640891" elapsed="0.000303"/>
</kw>
<msg time="2026-04-10T00:48:16.641303" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:16.641353" level="INFO">${possibly_int_of_members} = 3</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:16.640464" elapsed="0.000912"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.641957" level="INFO">${int_of_members} = 3</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:16.641566" elapsed="0.000419"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.643764" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:16.643461" elapsed="0.000333"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.644212" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:16.643950" elapsed="0.000288"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.644925" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:16.644401" elapsed="0.000554"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:16.648293" elapsed="0.000242"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.649055" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:16.648714" elapsed="0.000367"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:48:16.649235" elapsed="0.000320"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.650383" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:16.650077" elapsed="0.000333"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:16.650458" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:48:16.650651" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:16.649767" elapsed="0.000909"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:16.651433" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.165:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x72c8f35249d0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-10T00:48:16.650985" elapsed="0.000637"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:16.651791" elapsed="0.000192"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-10T00:48:16.647623" elapsed="0.004419"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:16.647404" elapsed="0.004682"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:16.653054" elapsed="0.000191"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.653751" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:16.653406" elapsed="0.000372"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:48:16.653937" elapsed="0.000222"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.654986" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:16.654673" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:16.655059" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:48:16.655218" level="INFO">${session_alias} = ClusterManagement__session_2</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:16.654352" elapsed="0.000892"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:16.655835" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.169:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x72c8f3526fd0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-10T00:48:16.655406" elapsed="0.000549"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:16.656117" elapsed="0.000190"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-10T00:48:16.652459" elapsed="0.003907"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:16.652259" elapsed="0.004152"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:16.657417" elapsed="0.000291"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.658283" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:16.657936" elapsed="0.000374"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:48:16.658463" elapsed="0.000308"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.659632" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:16.659321" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:16.659705" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:16.659868" level="INFO">${session_alias} = ClusterManagement__session_3</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:16.659021" elapsed="0.000872"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:16.660482" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.171.151:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x72c8f353c810&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-10T00:48:16.660048" elapsed="0.000569"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:16.660783" elapsed="0.000195"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-10T00:48:16.656702" elapsed="0.004334"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:16.656502" elapsed="0.004579"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-10T00:48:16.645015" elapsed="0.016099"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.661716" level="INFO">${ClusterManagement__member_index_list} = [1, 2, 3]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:16.661293" elapsed="0.000466"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.662311" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.165', 2: '10.30.170.169', 3: '10.30.171.151'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:16.661921" elapsed="0.000433"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.662930" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1', 'ClusterManagement__session_2', 'ClusterManagement__session_3']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:16.662513" elapsed="0.000460"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-10T00:48:16.642968" elapsed="0.020121"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-10T00:48:16.634405" elapsed="0.028745"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:16.663372" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:16.663232" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:16.663208" elapsed="0.000235"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.666531" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:16.666141" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.667096" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:16.666739" elapsed="0.000383"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:16.667166" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:48:16.667326" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:16.665814" elapsed="0.001536"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:16.668377" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:16.668113" elapsed="0.000290"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:16.669282" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:16.669077" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:16.674493" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:16.672038" elapsed="0.002636"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:16.672016" elapsed="0.002688"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:16.675045" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:16.674897" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.676300" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:16.675354" elapsed="0.000996"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:16.677189" level="INFO">${conn_id} = 1</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:16.676511" elapsed="0.000705"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:16.678798" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:48:16.679031" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:16.678066" elapsed="0.001016"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:16.679364" elapsed="0.000658"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:48:16.681632" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:48:17.048668" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:48:12 UTC 2026

  System load:  0.22               Processes:             121
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:48:16.681220" elapsed="0.367810"/>
</kw>
<msg time="2026-04-10T00:48:17.049172" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:16.680364" elapsed="0.368999"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:48:16.677446" elapsed="0.372275"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:48:17.050501" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-10T00:48:17.063767" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-10T00:48:17.064157" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:48:17.064249" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:48:17.050068" elapsed="0.014230"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.064729" elapsed="0.000535"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:17.066580" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:17.065670" elapsed="0.001001"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:17.067142" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:17.066830" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:17.066780" elapsed="0.000513"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:48:17.067716" elapsed="0.000067"/>
</return>
<status status="PASS" start="2026-04-10T00:48:17.067402" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:17.067370" elapsed="0.000532"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:17.067959" elapsed="0.000023"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:17.071977" elapsed="0.001052"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:17.073356" elapsed="0.000647"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.074242" 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-04-10T00:48:17.068433" elapsed="0.006227"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:48:16.671518" elapsed="0.403282"/>
</kw>
<msg time="2026-04-10T00:48:17.074890" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:16.670621" elapsed="0.404366"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:48:16.670119" elapsed="0.404988"/>
</kw>
<msg time="2026-04-10T00:48:17.075171" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:16.669598" elapsed="0.405647"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:17.079194" elapsed="0.000545"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:17.079972" elapsed="0.000216"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.080405" elapsed="0.000166"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:17.075744" elapsed="0.004905"/>
</kw>
<msg time="2026-04-10T00:48:17.080781" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:48:16.668633" elapsed="0.412182"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:17.081448" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:17.081102" elapsed="0.000413"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:48:17.081617" elapsed="0.000051"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:48:16.667757" elapsed="0.414063"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:16.667575" elapsed="0.414423"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:17.083431" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:17.083032" elapsed="0.000438"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:17.084586" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.084347" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:17.088913" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:17.088435" elapsed="0.000701"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:17.088402" elapsed="0.000779"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:17.089625" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.089398" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:17.091348" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:17.090055" elapsed="0.001365"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:17.092650" level="INFO">${conn_id} = 4</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:17.091713" elapsed="0.000974"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:17.094303" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:48:17.094542" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:17.093678" elapsed="0.000955"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:17.094949" elapsed="0.001141"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:48:17.099910" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:48:17.433522" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:48:13 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:48:17.098753" elapsed="0.335024"/>
</kw>
<msg time="2026-04-10T00:48:17.433904" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:17.096855" elapsed="0.337256"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:48:17.093001" elapsed="0.341416"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:48:17.435178" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-10T00:48:17.448211" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-10T00:48:17.448535" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:48:17.448638" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:48:17.434775" elapsed="0.013901"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.448964" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:17.450515" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:17.449683" elapsed="0.001034"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:17.451084" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:17.450844" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:17.450804" elapsed="0.000394"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:48:17.451460" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-10T00:48:17.451284" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:17.451256" elapsed="0.000354"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:17.451662" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:17.455946" elapsed="0.001105"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:17.457374" elapsed="0.000620"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.458264" elapsed="0.000272"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:17.452122" elapsed="0.006563"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:48:17.087743" elapsed="0.371080"/>
</kw>
<msg time="2026-04-10T00:48:17.458908" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:17.086444" elapsed="0.372551"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:48:17.085770" elapsed="0.373335"/>
</kw>
<msg time="2026-04-10T00:48:17.459166" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:17.085010" elapsed="0.374222"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:17.463058" 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-04-10T00:48:17.463752" elapsed="0.000214"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.464179" elapsed="0.000177"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:17.459682" elapsed="0.004748"/>
</kw>
<msg time="2026-04-10T00:48:17.464574" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:48:17.083825" elapsed="0.380783"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:17.465207" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:17.464863" elapsed="0.000402"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:48:17.465323" elapsed="0.000041"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:48:17.082438" elapsed="0.383059"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:17.082160" elapsed="0.383410"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:17.466862" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:17.466468" elapsed="0.000433"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:17.467888" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.467702" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:17.471588" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:17.471233" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:17.471209" elapsed="0.000590"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:17.472321" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.472007" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:17.473650" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:17.472675" elapsed="0.001044"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:17.474607" level="INFO">${conn_id} = 7</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:17.473897" elapsed="0.000747"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:17.476258" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:48:17.476513" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:17.475539" elapsed="0.001066"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:17.476984" elapsed="0.000866"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:48:17.479542" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:48:17.858370" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:48:14 UTC 2026

  System load:  0.32               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:48:17.479104" elapsed="0.379519"/>
</kw>
<msg time="2026-04-10T00:48:17.858733" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:17.478216" elapsed="0.380688"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:48:17.474933" elapsed="0.384214"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:48:17.859730" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-10T00:48:17.872409" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-10T00:48:17.872714" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:48:17.872762" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:48:17.859395" elapsed="0.013394"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.873064" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:17.874182" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:17.873654" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:17.874495" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:17.874320" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:17.874294" elapsed="0.000296"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:48:17.874775" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:48:17.874645" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:17.874629" elapsed="0.000237"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:17.874902" elapsed="0.000014"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:17.877971" elapsed="0.000746"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:17.878950" elapsed="0.000416"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.879571" 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-04-10T00:48:17.875256" elapsed="0.004593"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:48:17.470623" elapsed="0.409321"/>
</kw>
<msg time="2026-04-10T00:48:17.880068" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:17.469692" elapsed="0.410437"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:48:17.469032" elapsed="0.411178"/>
</kw>
<msg time="2026-04-10T00:48:17.880251" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:17.468303" elapsed="0.411993"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:17.883184" elapsed="0.000311"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:17.883676" elapsed="0.000185"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.884019" elapsed="0.000100"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:17.880609" elapsed="0.003562"/>
</kw>
<msg time="2026-04-10T00:48:17.884265" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:48:17.467205" elapsed="0.417086"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:17.884790" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:17.884491" elapsed="0.000343"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:48:17.884879" elapsed="0.000031"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:48:17.465976" elapsed="0.419081"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:17.465717" elapsed="0.419380"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:16.667408" elapsed="1.217735"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:48:16.663689" elapsed="1.221523"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-10T00:48:17.885375" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:17.899702" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:17.899570" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:17.899533" elapsed="0.000246"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:17.900137" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.899964" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:17.900746" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:17.900439" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:17.901259" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:17.900957" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:17.902116" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-10T00:48:17.901871" elapsed="0.000471">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-10T00:48:17.902458" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:48:17.902506" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:17.901466" elapsed="0.001063"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:17.902858" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:17.902626" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:17.902606" elapsed="0.000355"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:17.903845" level="INFO">${ip_address} = 10.30.170.165</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:17.903483" elapsed="0.000390"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:48:17.903922" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:48:17.904095" level="INFO">${odl_ip} = 10.30.170.165</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:17.903177" elapsed="0.000944"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:17.904281" elapsed="0.000493"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:17.905112" level="INFO">index=10
host=10.30.170.165
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.904964" 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-04-10T00:48:17.905398" elapsed="0.002225"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:48:17.908079" level="INFO">Logging into '10.30.170.165:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:48:18.964422" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:48:17.907794" elapsed="1.056995"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:18.971028" 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-04-10T00:48:18.971814" elapsed="0.000255"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:18.972289" elapsed="0.000142"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:18.967475" elapsed="0.005036"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:18.965662" elapsed="0.006945"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:48:17.899233" elapsed="1.073450"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:48:17.886456" elapsed="1.086296"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:17.886083" elapsed="1.086741"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:17.885932" elapsed="1.086949"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:18.988138" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:18.987959" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:18.987924" elapsed="0.000327"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:18.988793" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:18.988515" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:18.989591" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:18.989185" elapsed="0.000466"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:18.990166" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:18.989852" elapsed="0.000369"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:18.991491" level="FAIL">Dictionary does not contain key '2'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-10T00:48:18.991169" elapsed="0.000505">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-04-10T00:48:18.991821" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:48:18.991878" level="INFO">${old_connection_index} = Dictionary does not contain key '2'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:18.990593" elapsed="0.001316"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:18.992346" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:18.992025" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:18.991994" elapsed="0.000482"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:18.993501" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:18.993164" elapsed="0.000370"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:48:18.993617" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:48:18.993818" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:18.992793" elapsed="0.001057"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:18.994053" elapsed="0.000566"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:18.995035" level="INFO">index=12
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:48:18.999106" elapsed="1.103724"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:20.106425" elapsed="0.000335"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:20.106931" elapsed="0.000171"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:20.107255" elapsed="0.000103"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:20.104088" elapsed="0.003326"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:20.103322" elapsed="0.004139"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:48:18.987437" elapsed="1.120077"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:48:18.973806" elapsed="1.133771"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:18.973248" elapsed="1.134383"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:18.973036" elapsed="1.134636"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:20.120960" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:20.120840" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:20.120815" elapsed="0.000224"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:20.121338" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:20.121196" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:20.121920" level="INFO">{1: 10, 2: 12}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:20.121649" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:20.122362" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:20.122119" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:20.123193" level="FAIL">Dictionary does not contain key '3'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-10T00:48:20.122953" elapsed="0.000365">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-04-10T00:48:20.123430" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:48:20.123476" level="INFO">${old_connection_index} = Dictionary does not contain key '3'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:20.122581" elapsed="0.000917"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:20.123823" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:20.123591" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:20.123571" elapsed="0.000351"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:20.124894" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:20.124623" elapsed="0.000297"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:48:20.124972" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:48:20.125130" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:20.124124" elapsed="0.001031"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:20.125309" elapsed="0.000414"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:20.126002" level="INFO">index=14
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:48:20.128702" elapsed="0.902440"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:21.034949" elapsed="0.000332"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:21.035463" elapsed="0.000205"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:21.035911" elapsed="0.000113"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:21.032504" elapsed="0.003578"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:21.031591" elapsed="0.004539"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:48:20.120530" elapsed="0.915655"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:48:20.108417" elapsed="0.927815"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:20.108014" elapsed="0.928271"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:20.107865" elapsed="0.928462"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-10T00:48:17.885767" elapsed="3.150599"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-10T00:48:16.633715" elapsed="4.402723"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:21.039407" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:21.039281" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.039257" elapsed="0.000226"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:21.044493" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:21.044385" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.044365" elapsed="0.000232"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:21.045656" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:21.045179" elapsed="0.000508"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:21.046171" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:21.045853" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:21.046243" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:48:21.046410" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:21.044839" elapsed="0.001596"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:21.051725" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:21.051617" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.051599" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:21.052842" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:21.052735" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.052717" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:21.053341" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:21.053059" elapsed="0.000309"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:21.053847" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:21.053535" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:21.134284" 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 "p "e "[78Cn "[A[78Cf</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:21.054378" elapsed="0.080226"/>
</kw>
<msg time="2026-04-10T00:48:21.134822" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:21.134877" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.054039" elapsed="0.080905"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:21.288179" level="INFO">"l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "1 "0 "_ "_ "C "l "u "s "t "e "r "_ "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "_ "M "u "l "t "i "_ "D "P "N ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:21.135817" elapsed="0.152819"/>
</kw>
<msg time="2026-04-10T00:48:21.288824" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:21.288877" level="INFO">${message_wait} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.135262" elapsed="0.153654"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:21.289457" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:21.289086" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.289031" elapsed="0.000544"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:21.290181" level="INFO"> "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "1 "0 "_ "_ "C "l "u "s "t "e "r "_ "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "_ "M "u "l "t "i "_ "D "P "N ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:21.289745" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:21.290631" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:21.290358" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.290339" elapsed="0.000379"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:21.290758" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:21.292423" elapsed="0.000647"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:21.293383" elapsed="0.000545"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:21.294246" elapsed="0.000203"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:21.291722" elapsed="0.002888"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:21.291098" elapsed="0.003563"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:21.052464" elapsed="0.242298"/>
</kw>
<msg time="2026-04-10T00:48:21.294858" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:21.294903" level="INFO">${message} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.051944" elapsed="0.242996"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:21.295137" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:21.295024" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.295004" elapsed="0.000219"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:21.295682" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:21.296032" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:21.296107" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:21.051313" elapsed="0.244905"/>
</kw>
<msg time="2026-04-10T00:48:21.296313" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:21.296356" level="INFO">${output} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.046851" elapsed="0.249542"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:21.296754" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:21.296468" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.296451" elapsed="0.000384"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:21.046703" elapsed="0.250156"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:21.302359" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:21.302248" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.302230" elapsed="0.000247"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:21.303561" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:21.303433" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.303415" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:21.304060" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:21.303781" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:21.304510" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:21.304302" elapsed="0.000234"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:21.402405" 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 "p "e "[78Cn "[A[78Cf</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:21.305264" elapsed="0.097505"/>
</kw>
<msg time="2026-04-10T00:48:21.403002" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:21.403072" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.304920" elapsed="0.098204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:21.556073" level="INFO">"l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "1 "0 "_ "_ "C "l "u "s "t "e "r "_ "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "_ "M "u "l "t "i "_ "D "P "N ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:21.404116" elapsed="0.152325"/>
</kw>
<msg time="2026-04-10T00:48:21.556673" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:21.556733" level="INFO">${message_wait} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.403466" elapsed="0.153317"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:21.557364" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:21.556943" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.556895" elapsed="0.000580"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:21.558137" level="INFO"> "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "1 "0 "_ "_ "C "l "u "s "t "e "r "_ "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "_ "M "u "l "t "i "_ "D "P "N ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:21.557693" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:21.558701" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:21.558395" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.558372" elapsed="0.000431"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:21.558851" elapsed="0.000052"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:21.560593" 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-04-10T00:48:21.561715" elapsed="0.000614"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:21.562695" elapsed="0.000249"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:21.560020" elapsed="0.003090"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:21.559264" elapsed="0.003905"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:21.303177" elapsed="0.260117"/>
</kw>
<msg time="2026-04-10T00:48:21.563416" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:21.563470" level="INFO">${message} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.302654" elapsed="0.260865"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:21.563843" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:48:21.563705" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.563681" elapsed="0.000269"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:21.564477" elapsed="0.000032"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:21.565219" elapsed="0.000034"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:21.565313" 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-04-10T00:48:21.301923" elapsed="0.263529"/>
</kw>
<msg time="2026-04-10T00:48:21.565595" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:21.565652" level="INFO">${output} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.297139" elapsed="0.268563"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:21.566129" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:21.565799" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.565777" elapsed="0.000483"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:21.296994" elapsed="0.269299"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:21.573629" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:21.573475" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.573451" elapsed="0.000268"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:21.575087" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:21.574951" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.574929" elapsed="0.000251"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:21.575744" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:21.575379" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:21.576235" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:21.575997" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:21.660977" 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 "p "e "[78Cn "[A[78Cf</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:21.576952" elapsed="0.084382"/>
</kw>
<msg time="2026-04-10T00:48:21.661615" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:21.661690" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.576484" elapsed="0.085261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:21.843717" level="INFO">"l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "1 "0 "_ "_ "C "l "u "s "t "e "r "_ "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "_ "M "u "l "t "i "_ "D "P "N ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:21.662841" elapsed="0.181227"/>
</kw>
<msg time="2026-04-10T00:48:21.844267" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:21.844321" level="INFO">${message_wait} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.662109" elapsed="0.182251"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:21.844903" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:21.844503" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.844456" elapsed="0.000543"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:21.845582" level="INFO"> "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "1 "0 "_ "_ "C "l "u "s "t "e "r "_ "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "_ "M "u "l "t "i "_ "D "P "N ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:21.845154" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:21.846084" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:21.845853" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.845835" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:21.846203" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:21.847680" elapsed="0.000578"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:21.848612" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:21.849384" elapsed="0.000237"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:21.847196" elapsed="0.002567"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:21.846587" elapsed="0.003225"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:21.574631" elapsed="0.275283"/>
</kw>
<msg time="2026-04-10T00:48:21.850017" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:21.850063" level="INFO">${message} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.573924" elapsed="0.276176"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:21.850305" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:48:21.850186" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.850165" 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-04-10T00:48:21.850937" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:21.851311" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:21.851392" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:21.573099" elapsed="0.278413"/>
</kw>
<msg time="2026-04-10T00:48:21.851632" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:21.851678" level="INFO">${output} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.566666" elapsed="0.285052"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:21.852058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:21.851797" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.851780" elapsed="0.000356"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:21.566456" elapsed="0.285705"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:21.046495" elapsed="0.805704"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:48:21.044059" elapsed="0.808207"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-10T00:48:21.037071" elapsed="0.815258"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.036619" elapsed="0.815758"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-10T00:48:16.627536" elapsed="5.224912"/>
</kw>
<test id="s1-s1-t1" name="Check Shards Status And Initialize Variables" line="29">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:48:21.856562" elapsed="0.000271"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:48:21.856244" elapsed="0.000654"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:21.858038" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:21.857904" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.857881" elapsed="0.000238"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:21.863309" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:21.863113" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.863094" elapsed="0.000290"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:21.864453" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:21.864035" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:21.865031" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:21.864677" elapsed="0.000382"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:21.865106" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:48:21.865274" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:21.863647" elapsed="0.001653"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:21.870735" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:21.870617" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.870594" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:21.872021" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:21.871906" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:21.871889" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:21.872572" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:21.872240" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:21.872992" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:21.872767" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:21.932040" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:21.873524" elapsed="0.058771"/>
</kw>
<msg time="2026-04-10T00:48:21.932586" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:21.932639" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.873179" elapsed="0.059497"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:22.011789" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "n "[78Cd "[A[78C
 "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:21.933436" elapsed="0.078639"/>
</kw>
<msg time="2026-04-10T00:48:22.012327" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:22.012377" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.932952" elapsed="0.079464"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.012947" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:22.012542" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.012504" elapsed="0.000540"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.013630" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "n "[78Cd "[A[78C
 "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:22.013197" elapsed="0.000528"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.014023" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:22.013795" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.013777" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:22.014141" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:22.015833" elapsed="0.000806"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:22.016998" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:22.017779" elapsed="0.000361"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:22.015158" elapsed="0.003084"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:22.014472" elapsed="0.003834"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:21.871604" elapsed="0.146803"/>
</kw>
<msg time="2026-04-10T00:48:22.018504" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:22.018565" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.870964" elapsed="0.147640"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:22.018816" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:48:22.018684" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.018665" elapsed="0.000237"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.019322" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.019684" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:22.019758" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:21.870206" elapsed="0.149663"/>
</kw>
<msg time="2026-04-10T00:48:22.019967" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:22.020011" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.865729" elapsed="0.154319"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.020381" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:22.020124" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.020107" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:21.865577" elapsed="0.154905"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:22.026128" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:22.026017" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.025997" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:22.027415" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:22.027306" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.027288" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:22.027976" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:22.027659" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:22.028398" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:22.028176" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:22.103529" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:22.028953" elapsed="0.074873"/>
</kw>
<msg time="2026-04-10T00:48:22.104085" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:22.104134" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:22.028606" elapsed="0.075566"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:22.203065" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "n "[78Cd "[A[78C
 "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:22.104959" elapsed="0.098478"/>
</kw>
<msg time="2026-04-10T00:48:22.203709" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:22.203759" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:22.104456" elapsed="0.099356"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.204318" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:22.203958" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.203917" elapsed="0.000492"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.205002" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "n "[78Cd "[A[78C
 "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:22.204577" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.205390" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:22.205166" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.205148" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:22.205508" elapsed="0.000128"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:22.207628" elapsed="0.000953"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:22.208962" elapsed="0.000628"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:22.209955" elapsed="0.000452"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:22.206562" elapsed="0.003966"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:22.205944" elapsed="0.004674"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:22.026998" elapsed="0.183756"/>
</kw>
<msg time="2026-04-10T00:48:22.210886" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:22.211014" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:22.026353" elapsed="0.184720"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:22.211360" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T00:48:22.211204" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.211170" elapsed="0.000322"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.212089" elapsed="0.000036"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.212534" elapsed="0.000068"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:22.212669" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:22.025514" elapsed="0.187306"/>
</kw>
<msg time="2026-04-10T00:48:22.212954" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:22.213012" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:22.020785" elapsed="0.192282"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.213570" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:22.213176" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.213152" elapsed="0.000535"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:22.020637" elapsed="0.193086"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:22.221754" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:22.221538" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.221498" elapsed="0.000379"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:22.223941" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:22.223776" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.223748" elapsed="0.000306"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:22.224736" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:22.224272" elapsed="0.000506"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:22.225302" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:22.225016" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:22.280602" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:22.226109" elapsed="0.054707"/>
</kw>
<msg time="2026-04-10T00:48:22.281067" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:22.281116" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:22.225592" elapsed="0.055562"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:22.397845" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "n "[78Cd "[A[78C
 "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:22.281910" elapsed="0.116187"/>
</kw>
<msg time="2026-04-10T00:48:22.398329" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:22.398377" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:22.281424" elapsed="0.116991"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.398903" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:22.398539" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.398503" elapsed="0.000489"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.399612" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "n "[78Cd "[A[78C
 "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:22.399144" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.400022" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:22.399780" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.399761" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:22.400145" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:22.401733" 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-04-10T00:48:22.402823" elapsed="0.000542"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:22.403657" 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-04-10T00:48:22.401074" elapsed="0.003047"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:22.400467" elapsed="0.003718"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:22.223298" elapsed="0.180988"/>
</kw>
<msg time="2026-04-10T00:48:22.404383" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:22.404428" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:22.222269" elapsed="0.182196"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:22.404688" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:48:22.404558" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.404525" elapsed="0.000254"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.405195" elapsed="0.000149"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.405964" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:22.406040" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:22.220894" elapsed="0.185259"/>
</kw>
<msg time="2026-04-10T00:48:22.406249" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:22.406293" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:22.214104" elapsed="0.192226"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.406679" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:22.406407" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.406389" elapsed="0.000369"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:22.213898" elapsed="0.192883"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:21.865367" elapsed="0.541448"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:48:21.862731" elapsed="0.544145"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:48:21.857581" elapsed="0.549353"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:21.857055" elapsed="0.549924"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:48:21.853485" elapsed="0.553548"/>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:22.428712" elapsed="0.000236"/>
</kw>
<msg time="2026-04-10T00:48:22.428997" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:22.428064" elapsed="0.000987"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default', 'entity-ownership'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:48:22.427594" elapsed="0.001533"/>
</kw>
<msg time="2026-04-10T00:48:22.429173" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:22.418891" elapsed="0.010325"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:48:22.418480" elapsed="0.010809"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.429744" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:22.429472" elapsed="0.000315"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.435049" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:22.434653" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.435584" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:22.435255" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:22.435656" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:22.435815" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:22.434266" elapsed="0.001573"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:48:22.435993" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.436663" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:22.436311" elapsed="0.000379"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.437139" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:22.436893" elapsed="0.000271"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.437570" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:22.437316" elapsed="0.000281"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.440072" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:22.439747" elapsed="0.000352"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:22.440144" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:22.440293" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:22.439388" elapsed="0.000929"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.526391" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:22.525988" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:22.527289" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:22.526949" elapsed="0.000455">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:22.527501" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:22.526609" elapsed="0.000917"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.528099" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:22.527709" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:22.528436" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:22.528694" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:22.528291" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.529137" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:22.528882" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.530181" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:22.529925" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.530681" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:22.530389" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.531066" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.531273" elapsed="0.000023"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.531490" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:22.530927" elapsed="0.000636"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:22.530768" elapsed="0.000827"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:22.531645" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:48:22.531812" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:22.529591" elapsed="0.002246"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:22.529258" elapsed="0.002610"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.532043" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:22.531893" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.529236" elapsed="0.002883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.532736" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:22.532262" elapsed="0.000548"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:22.532862" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:22.525360" elapsed="0.007626"/>
</kw>
<msg time="2026-04-10T00:48:22.533040" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:22.512712" elapsed="0.020410"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.545680" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.558397" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.570776" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.571618" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.572376" 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-04-10T00:48:22.572980" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:22.572828" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:22.572809" 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-04-10T00:48:22.573228" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.573415" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.573615" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:22.572756" elapsed="0.000934"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:22.572500" elapsed="0.001230"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.574437" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:22.574570" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:48:22.574809" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:22.506149" elapsed="0.068766"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:22.578198" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:22.577867" elapsed="0.000433">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:22.578497" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:22.577366" elapsed="0.001191"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.579092" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:22.578696" elapsed="0.000466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.579903" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:22.579591" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:22.579202" elapsed="0.000774"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.578645" elapsed="0.001369"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.583152" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:22.580834" elapsed="0.002363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:22.583273" elapsed="0.000063"/>
</return>
<msg time="2026-04-10T00:48:22.583627" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:22.575938" elapsed="0.007795"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:22.586484" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:22.586231" elapsed="0.000336">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:22.586761" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:22.585794" elapsed="0.001010"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:22.587183" elapsed="0.000079"/>
</return>
<status status="PASS" start="2026-04-10T00:48:22.586934" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.586883" elapsed="0.000483"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:22.588156" 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-04-10T00:48:22.589028" elapsed="0.000035"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:22.589136" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:48:22.591353" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:22.584682" elapsed="0.006800"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.595299" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:22.594908" elapsed="0.000527"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:22.596703" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:22.596164" elapsed="0.000640"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:23.639464" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:23.644357" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0labrpeq6hvzrqou5cqfegtpr0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:48:23 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:23.645009" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:22.599043" elapsed="1.046020"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:22.596929" elapsed="1.048242"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.645710" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:23.645252" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.596879" elapsed="1.048994"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.652371" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:23.648480" elapsed="0.004407"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:23.648136" elapsed="0.004804"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.648103" elapsed="0.004871"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.655630" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:23.653306" elapsed="0.002370"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:23.653075" elapsed="0.002635"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.653057" elapsed="0.002677"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.659387" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:23.655942" elapsed="0.003473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.659775" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:23.659512" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.660376" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:23.660023" elapsed="0.000380"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:23.659857" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.659492" elapsed="0.000968"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.661067" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:23.660692" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.661423" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:23.661186" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.661980" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:23.661680" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:23.661504" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.661167" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:23.662238" elapsed="0.000373"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:23.663247" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:23.662799" elapsed="0.000474"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:23.663452" elapsed="0.002414"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:23.647018" elapsed="0.018976"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:23.666345" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:23.666126" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.666075" elapsed="0.000424"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:23.675936" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:23.667259" elapsed="0.008728"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:23.676067" elapsed="0.000070"/>
</return>
<msg time="2026-04-10T00:48:23.676398" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:22.592161" elapsed="1.084346"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:23.677043" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:23.677224" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:22.448693" elapsed="1.228558"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.677608" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:23.677336" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.677319" elapsed="0.000513"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:23.677866" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:22.444494" elapsed="1.233500"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:22.440386" elapsed="1.237652"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:22.440367" elapsed="1.237695"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:23.678706" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:23.678598" elapsed="0.000154"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:48:23.678874" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:48:23.678774" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.678579" elapsed="0.000375"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.679103" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:48:23.679223" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:23.678297" elapsed="0.000952"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.679813" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:23.679419" elapsed="0.000421"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.680458" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:23.679998" elapsed="0.000487"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.686306" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:23.685860" elapsed="0.000494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.687033" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:23.686511" 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-04-10T00:48:23.722486" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:23.722870" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:23 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:23 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":4,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":4,"Leader":"member-2-shard-inventory-operational","LastIndex":5,"RaftState":"Follower","LastApplied":5,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":5,"LastLeadershipChangeTime":"2026-04-10 00:45:27.749","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"1.682 ms","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":5,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":267},"timestamp":1775782103,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:23.723327" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:23.698239" elapsed="0.025362"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:23.687147" elapsed="0.037041"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.724742" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:23.724261" elapsed="0.001104"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.687129" elapsed="0.038284"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.732500" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":4,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":4,"Leader":"member-2-shard-inventory-operational","LastIndex":5,"RaftState":"Follower","LastApplied":5,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":5,"LastLeadershipChangeTime":"2026-04-10 00:45:27.749","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"1.682 ms","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":5,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":267},"timestamp":1775782103,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:23.728498" elapsed="0.004257"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:23.727163" elapsed="0.005666"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.727136" elapsed="0.005747"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.736742" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:23.733945" elapsed="0.002909"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:23.733013" elapsed="0.003893"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.732986" elapsed="0.003958"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.738433" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:23.737638" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.739158" elapsed="0.000174"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:23.738685" elapsed="0.000697"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.740358" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:23.739841" elapsed="0.000564"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:23.739435" elapsed="0.001020"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.738664" elapsed="0.001826"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.741976" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:23.741202" elapsed="0.000836"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.742694" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:23.742208" elapsed="0.000573"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.743745" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:23.743155" elapsed="0.000638"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:23.742820" elapsed="0.001023"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.742188" elapsed="0.001690"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:23.744106" elapsed="0.000676"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:23.745626" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:23.745098" elapsed="0.000590"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:23.745977" elapsed="0.002615"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:23.726149" elapsed="0.022672"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:23.749033" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:23.748898" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.748879" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:23.752995" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:23.749255" elapsed="0.003771"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:23.753078" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:48:23.753370" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:23.681473" elapsed="0.071923"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:23.753505" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:23.753677" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:23.680739" elapsed="0.072965"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.754771" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:23.754296" elapsed="0.000504"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:23.754849" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:23.755020" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:23.753939" elapsed="0.001108"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:23.755404" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 5, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitialS...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:23.755205" elapsed="0.000227"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:23.755884" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:23.755679" elapsed="0.000232"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:23.755958" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:23.756112" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:22.438753" elapsed="1.317384"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:23.756196" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:48:23.756346" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:22.438023" elapsed="1.318348"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:23.756743" elapsed="0.000208"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:23.756452" elapsed="0.000537"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.757161" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:23.757014" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.757380" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:23.757238" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.756435" elapsed="0.001019"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:22.437852" elapsed="1.319626"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.760168" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:23.759803" elapsed="0.000393"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:23.760244" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:23.760396" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:23.759378" elapsed="0.001044"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.849069" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:23.848635" elapsed="0.000466"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:23.849892" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:23.849625" elapsed="0.000419">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:23.850141" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:23.849273" elapsed="0.000894"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.850745" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:23.850334" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:23.851081" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:23.851240" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:23.850936" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.851697" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:23.851425" 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-04-10T00:48:23.852912" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:23.852633" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.853570" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:23.853119" elapsed="0.000479"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.853934" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.854145" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.854320" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:23.853797" elapsed="0.000580"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:23.853652" elapsed="0.000756"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:23.854457" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:48:23.854644" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:23.852132" elapsed="0.002537"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:23.851819" elapsed="0.002882"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.854881" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:23.854726" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.851797" elapsed="0.003161"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.855556" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:23.855104" elapsed="0.000481"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:23.855634" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:23.848002" elapsed="0.007756"/>
</kw>
<msg time="2026-04-10T00:48:23.855811" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:23.835101" elapsed="0.020794"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.868597" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.881255" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.893871" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.894665" elapsed="0.000047"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.895451" 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-04-10T00:48:23.896057" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:23.895902" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:23.895883" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.896305" 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-04-10T00:48:23.896498" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.896705" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:23.895831" elapsed="0.000989"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:23.895598" elapsed="0.001275"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.897619" elapsed="0.000037"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:23.897742" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:48:23.898022" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:23.828910" elapsed="0.069229"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:23.901236" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:23.900954" elapsed="0.000360">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:23.901509" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:23.900438" elapsed="0.001132"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.902095" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:23.901707" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.902813" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:23.902479" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:23.902202" elapsed="0.000689"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.901656" elapsed="0.001274"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.907468" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:23.903746" elapsed="0.003771"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:23.907616" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:48:23.907941" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:23.899307" elapsed="0.008745"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:23.910936" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:23.910669" elapsed="0.000335">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:23.911329" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:23.910192" elapsed="0.001184"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:23.911801" elapsed="0.000093"/>
</return>
<status status="PASS" start="2026-04-10T00:48:23.911516" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.911460" elapsed="0.000548"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.912784" elapsed="0.000081"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:23.913636" elapsed="0.000039"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:23.913748" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:48:23.915793" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:23.909070" elapsed="0.006830"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.919842" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:23.919409" elapsed="0.000536"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:23.921325" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:23.920943" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:24.723176" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:24.724218" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node013gawcwja405m14axcmgdzwrtx0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:48:24 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:24.724833" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:23.923723" elapsed="0.801177"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:23.921564" elapsed="0.803496"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.726329" elapsed="0.000102"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:24.725180" elapsed="0.001435"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.921498" elapsed="0.805211"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.733927" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:24.730716" elapsed="0.003595"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:24.730404" elapsed="0.003949"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.730376" elapsed="0.004005"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.737378" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:24.734787" elapsed="0.002651"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:24.734472" elapsed="0.003009"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.734450" elapsed="0.003060"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.738299" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:24.737835" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.738766" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:24.738428" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.739335" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:24.739019" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:24.738851" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.738406" elapsed="0.001016"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.739996" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:24.739622" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.740355" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:24.740116" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.740922" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:24.740615" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:24.740436" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.740096" elapsed="0.000911"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:24.741193" elapsed="0.000391"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:24.742162" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:24.741841" elapsed="0.000348"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:24.742589" elapsed="0.002376"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:24.728694" elapsed="0.016418"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:24.745489" elapsed="0.000070"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:24.745256" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.745201" elapsed="0.000516"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:24.755704" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:24.746490" elapsed="0.009278"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:24.755871" elapsed="0.000086"/>
</return>
<msg time="2026-04-10T00:48:24.756251" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:23.916641" elapsed="0.839724"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:24.756872" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:48:24.757060" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:23.768822" elapsed="0.988266"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.757534" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:24.757191" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.757170" elapsed="0.000734"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:24.757941" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:23.764529" elapsed="0.993548"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:23.760493" elapsed="0.997630"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:23.760475" elapsed="0.997672"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:24.759047" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:24.758929" elapsed="0.000170"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:48:24.759224" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:48:24.759122" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.758910" elapsed="0.000398"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.759486" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:48:24.759627" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:24.758610" elapsed="0.001044"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.760282" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:24.759847" elapsed="0.000462"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.760966" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:24.760472" elapsed="0.000522"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.767470" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:24.766911" elapsed="0.000620"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.768218" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:24.767740" elapsed="0.000525"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:24.810087" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:24.810330" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:24 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:24 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":3,"SnapshotIndex":4,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":4,"Leader":"member-2-shard-inventory-operational","LastIndex":5,"RaftState":"Leader","LastApplied":5,"LastCommittedTransactionTime":"2026-04-10 00:45:28.872","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational","LastLogIndex":5,"LastLeadershipChangeTime":"2026-04-10 00:45:27.740","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.420","active":true,"matchIndex":5,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":6},{"timeSinceLastActivity":"00:00:00.420","active":true,"matchIndex":5,"voting":true,"id":"member-3-shard-inventory-operational","nextIndex":6}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"13.37 ms","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":3,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-3-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":5,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":267},"timestamp":1775782104,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:24.810708" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:24.780081" elapsed="0.030791"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:24.768349" elapsed="0.042922"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.811653" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:24.811327" elapsed="0.000872"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.768326" elapsed="0.043914"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.819776" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":3,"SnapshotIndex":4,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":4,"Leader":"member-2-shard-inventory-operational","LastIndex":5,"RaftState":"Leader","LastApplied":5,"LastCommittedTransactionTime":"2026-04-10 00:45:28.872","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational","LastLogIndex":5,"LastLeadershipChangeTime":"2026-04-10 00:45:27.740","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.420","active":true,"matchIndex":5,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":6},{"timeSinceLastActivity":"00:00:00.420","active":true,"matchIndex":5,"voting":true,"id":"member-3-shard-inventory-operational","nextIndex":6}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"13.37 ms","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":3,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-3-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":5,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":267},"timestamp":1775782104,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:24.815691" elapsed="0.004272"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:24.814242" elapsed="0.005800"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.814212" elapsed="0.005889"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.825371" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:24.821602" elapsed="0.003920"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:24.820232" elapsed="0.005390"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.820203" elapsed="0.005479"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.827387" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:24.826543" elapsed="0.000910"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.828155" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:24.827661" elapsed="0.000585"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.829282" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:24.828755" elapsed="0.000575"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:24.828284" elapsed="0.001098"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.827638" elapsed="0.001780"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.830924" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:24.830116" elapsed="0.000871"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.831717" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:24.831198" elapsed="0.000610"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.832740" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:24.832196" elapsed="0.000592"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:24.831849" elapsed="0.000992"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.831176" elapsed="0.001701"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:24.833122" elapsed="0.000714"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:24.834703" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:24.834160" elapsed="0.000608"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:24.835063" elapsed="0.002914"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:24.813038" elapsed="0.025117"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:24.838375" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:24.838240" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.838219" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:24.842519" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:24.838616" elapsed="0.003951"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:24.842689" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:48:24.842874" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:24.762130" elapsed="0.080773"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:24.842965" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:24.843123" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:24.761240" elapsed="0.081910"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.844359" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:24.843837" elapsed="0.000554"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:24.844443" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:24.844721" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:24.843410" elapsed="0.001340"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:24.845153" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 5, 'CommittedTransactionsCount': 3, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'id...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:24.844935" elapsed="0.000247"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:24.845564" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:24.845342" elapsed="0.000251"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:24.845642" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:24.845827" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:23.758768" elapsed="1.087086"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:24.845915" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:24.846068" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:23.758025" elapsed="1.088069"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.846410" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:24.846185" elapsed="0.000284"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:24.846725" elapsed="0.000200"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:24.846495" elapsed="0.000469"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.847141" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:24.846989" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.846165" elapsed="0.001054"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:23.757669" elapsed="1.089575"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.850103" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:24.849694" elapsed="0.000438"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:24.850181" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:48:24.850335" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:24.849320" elapsed="0.001039"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.938276" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:24.937842" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:24.939252" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:24.938985" elapsed="0.000344">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:24.939425" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:24.938627" elapsed="0.000823"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.940024" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:24.939634" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:24.940358" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:24.940517" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:24.940214" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.940961" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:24.940715" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.942261" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:24.941999" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.942770" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:24.942474" elapsed="0.000323"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.943149" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.943371" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.943582" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:24.943006" elapsed="0.000637"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:24.942855" elapsed="0.000819"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:24.943722" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:48:24.943896" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:24.941433" elapsed="0.002488"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:24.941088" elapsed="0.002867"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.944138" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:24.943981" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.941063" elapsed="0.003153"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.944842" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:24.944361" elapsed="0.000510"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:24.944919" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:24.937094" elapsed="0.007950"/>
</kw>
<msg time="2026-04-10T00:48:24.945100" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:24.924356" elapsed="0.020850"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.957651" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.970278" elapsed="0.000051"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.982698" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.983510" elapsed="0.000056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.984313" 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-04-10T00:48:24.984933" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:24.984780" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:24.984761" 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-04-10T00:48:24.985182" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.985371" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.985574" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:24.984705" elapsed="0.000946"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:24.984445" elapsed="0.001248"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.986433" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:24.986571" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:48:24.986829" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:24.917891" elapsed="0.069048"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:24.990088" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:24.989724" elapsed="0.000444">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:24.990359" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:24.989212" elapsed="0.001192"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:24.990953" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:24.990537" elapsed="0.000484"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.991662" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:24.991337" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:24.991060" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.990485" elapsed="0.001289"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:24.995848" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:24.992524" elapsed="0.003395"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:24.996058" elapsed="0.000121"/>
</return>
<msg time="2026-04-10T00:48:24.996828" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:24.987983" elapsed="0.009007"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:25.000691" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:25.000274" elapsed="0.000492">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:25.000958" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:24.999814" elapsed="0.001188"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:25.001394" elapsed="0.000082"/>
</return>
<status status="PASS" start="2026-04-10T00:48:25.001141" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:25.001086" elapsed="0.000515"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:25.002364" 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-04-10T00:48:25.003135" elapsed="0.000035"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:25.003243" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:48:25.005390" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:24.998449" elapsed="0.007049"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:25.009475" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:25.009078" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:25.010746" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:25.010348" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:25.895526" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:25.896746" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01scfk5e5snymj1gtu4c77d4crx0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:48:25 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:25.897290" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:25.013271" elapsed="0.884084"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:25.010970" elapsed="0.886542"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:25.898383" elapsed="0.000083"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:25.897673" elapsed="0.000992"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:25.010919" elapsed="0.887841"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:25.908277" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:25.902849" elapsed="0.005822"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:25.902179" elapsed="0.006531"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:25.902133" elapsed="0.006604"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:25.911439" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:25.909069" elapsed="0.002418"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:25.908825" elapsed="0.002699"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:25.908805" elapsed="0.002758"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:25.912225" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:25.911789" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:25.912619" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:25.912350" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:25.913207" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:25.912873" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:25.912705" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:25.912330" elapsed="0.000963"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:25.913869" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:25.913478" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:25.914229" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:25.913988" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:25.914814" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:25.914492" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:25.914312" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:25.913969" elapsed="0.000930"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:25.915077" elapsed="0.000386"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:25.916022" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:25.915675" elapsed="0.000375"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:25.916233" elapsed="0.002394"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:25.900489" elapsed="0.018272"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:25.919120" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:25.918894" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:25.918843" elapsed="0.000428"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:25.928712" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:25.920025" elapsed="0.008743"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:25.928864" elapsed="0.000080"/>
</return>
<msg time="2026-04-10T00:48:25.929292" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:25.006262" elapsed="0.923198"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:25.930201" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:48:25.930509" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:24.859030" elapsed="1.071540"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:25.931089" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:25.930704" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:25.930677" elapsed="0.000685"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:25.931398" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:24.854623" elapsed="1.076905"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:24.850431" elapsed="1.081157"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:24.850413" elapsed="1.081201"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:25.932270" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:25.932158" elapsed="0.000158"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:48:25.932437" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:25.932338" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:25.932140" elapsed="0.000378"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:25.932700" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:48:25.932822" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:25.931854" elapsed="0.000994"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:25.933429" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:25.933026" elapsed="0.000429"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:25.934089" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:25.933628" elapsed="0.000488"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:25.940142" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:25.939676" elapsed="0.000516"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:25.940914" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:25.940353" elapsed="0.000606"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:25.984352" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:25.984786" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:25 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:25 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":4,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":4,"Leader":"member-2-shard-inventory-operational","LastIndex":5,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":5,"LastLogIndex":5,"LastLeadershipChangeTime":"2026-04-10 00:45:27.748","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"1.007 ms","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":5,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":267},"timestamp":1775782105,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:25.985278" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:25.961837" elapsed="0.023693"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:25.941031" elapsed="0.045138"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:25.986728" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:25.986249" elapsed="0.001220"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:25.941011" elapsed="0.046518"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:25.996680" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":4,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":4,"Leader":"member-2-shard-inventory-operational","LastIndex":5,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":5,"LastLogIndex":5,"LastLeadershipChangeTime":"2026-04-10 00:45:27.748","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"1.007 ms","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":5,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":267},"timestamp":1775782105,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:25.992790" elapsed="0.004013"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:25.990578" elapsed="0.006279"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:25.990503" elapsed="0.006395"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.000416" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:25.997957" elapsed="0.002567"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:25.996987" elapsed="0.003616"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:25.996968" elapsed="0.003681"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.002257" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.001334" elapsed="0.000987"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.003029" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.002527" elapsed="0.000595"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.004052" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.003506" elapsed="0.000595"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.003161" elapsed="0.000993"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.002506" elapsed="0.001685"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.005725" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.004863" elapsed="0.000926"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.006482" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.005960" elapsed="0.000630"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.007637" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.006992" elapsed="0.000700"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.006630" elapsed="0.001188"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.005940" elapsed="0.001923"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:26.008151" elapsed="0.000729"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:26.009979" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.009243" elapsed="0.000806"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.010384" elapsed="0.003409"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:25.988779" elapsed="0.025210"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.014235" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:26.014079" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.014056" elapsed="0.000254"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:26.018123" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:26.014510" elapsed="0.003642"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:26.018206" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:48:26.018372" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:25.935115" elapsed="0.083283"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:26.018561" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:26.018721" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:25.934331" elapsed="0.084415"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.019842" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.019360" elapsed="0.000510"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:26.019919" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:26.020089" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:26.018989" elapsed="0.001126"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:26.020469" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 5, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitialS...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.020272" elapsed="0.000224"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:26.020866" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.020667" elapsed="0.000224"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:26.020937" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:26.021091" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:24.848674" elapsed="1.172442"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:26.021177" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:48:26.021328" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:24.847640" elapsed="1.173713"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.021709" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.021436" elapsed="0.000503"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.022109" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.021963" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.022328" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.022186" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.021419" elapsed="0.000982"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:24.847425" elapsed="1.175027"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:22.437647" elapsed="3.584843"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:48:26.022537" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:48:26.022765" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:48:26.022813" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:48:22.433535" elapsed="3.589302"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.023511" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:48:26.023610" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:26.023015" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.023932" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.023709" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.023690" elapsed="0.000323"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.026246" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:48:26.024153" elapsed="0.002144"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:48:26.026809" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.026602" elapsed="0.000235"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:48:26.026888" 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="PASS" start="2026-04-10T00:48:22.430938" elapsed="3.596110"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:48:22.430580" elapsed="3.596516"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.031527" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:26.031140" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.032034" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:26.031731" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:26.032105" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:26.032266" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:26.030766" elapsed="0.001525"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:48:26.032445" elapsed="0.000172"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.033113" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:26.032778" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.033538" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:26.033298" elapsed="0.000282"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.033966" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:26.033730" elapsed="0.000262"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.036645" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.036145" elapsed="0.000529"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:26.036721" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:26.036873" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:26.035801" elapsed="0.001098"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.123713" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.123279" elapsed="0.000468"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:26.124524" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:26.124268" elapsed="0.000349">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:26.124737" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:26.123922" elapsed="0.000842"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.125319" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:26.124933" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:26.125675" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:26.125839" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:26.125509" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.126350" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.126096" 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-04-10T00:48:26.127413" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.127159" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.127921" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.127637" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.128286" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.128493" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.128696" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:26.128146" elapsed="0.000609"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.128002" elapsed="0.000784"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:26.128833" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:48:26.129001" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:26.126834" elapsed="0.002193"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.126476" elapsed="0.002583"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.129236" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.129084" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.126453" elapsed="0.002860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.129919" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.129459" elapsed="0.000488"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:26.129996" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:26.122574" elapsed="0.007547"/>
</kw>
<msg time="2026-04-10T00:48:26.130174" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:26.109796" elapsed="0.020470"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.143023" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.156115" elapsed="0.000153"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.168989" elapsed="0.000073"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.169903" 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-04-10T00:48:26.170740" 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-04-10T00:48:26.171611" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.171425" elapsed="0.000246"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:26.171406" elapsed="0.000290"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.171859" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.172047" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.172237" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:26.171345" elapsed="0.000969"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.171042" elapsed="0.001314"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.173101" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.173225" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:48:26.173498" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:26.103201" elapsed="0.070425"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:26.176757" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:26.176442" elapsed="0.000392">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:26.177028" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:26.175939" elapsed="0.001134"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.177632" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.177213" elapsed="0.000487"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.178329" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.178028" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.177741" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.177160" elapsed="0.001279"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.181781" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:26.179350" elapsed="0.002479"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:26.181912" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:48:26.182247" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:26.174736" elapsed="0.007616"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:26.185419" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:26.185118" elapsed="0.000380">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:26.185708" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:26.184646" elapsed="0.001108"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:26.186167" elapsed="0.000087"/>
</return>
<status status="PASS" start="2026-04-10T00:48:26.185894" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.185840" elapsed="0.000525"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.187292" 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-04-10T00:48:26.188074" elapsed="0.000039"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.188188" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:48:26.190838" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:26.183444" elapsed="0.007509"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.195338" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.194860" elapsed="0.000598"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.196637" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.196221" elapsed="0.000535"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:26.234812" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0labrpeq6hvzrqou5cqfegtpr0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:26.235914" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:26.236464" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:26.199321" elapsed="0.037214"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.196918" elapsed="0.039817"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.237621" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.236858" elapsed="0.000957"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.196857" elapsed="0.041050"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.247292" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.241955" elapsed="0.006108"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.241584" elapsed="0.006544"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.241525" elapsed="0.006645"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.252558" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.248759" elapsed="0.003890"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.248320" elapsed="0.004392"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.248286" elapsed="0.004466"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.253577" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.253106" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.253957" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.253707" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.254517" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.254206" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.254039" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.253685" elapsed="0.000933"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.255163" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.254802" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.255517" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.255281" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.256091" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.255789" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.255626" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.255262" elapsed="0.000917"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:26.256378" elapsed="0.000451"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:26.257327" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.257021" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.257530" elapsed="0.003843"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:26.239888" elapsed="0.021739"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.262009" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:26.261777" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.261720" elapsed="0.000450"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:26.271625" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:26.262948" elapsed="0.008772"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:26.271818" elapsed="0.000082"/>
</return>
<msg time="2026-04-10T00:48:26.272180" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:26.191730" elapsed="0.080562"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:26.272903" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:48:26.273087" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:26.045158" elapsed="0.227956"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.273531" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.273212" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.273193" elapsed="0.000644"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:26.273871" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:26.040947" elapsed="0.233053"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.036971" elapsed="0.237072"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.036952" elapsed="0.237115"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.274740" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:26.274626" elapsed="0.000160"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:48:26.274911" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:26.274809" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.274609" elapsed="0.000384"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.275161" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:48:26.275281" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:26.274308" elapsed="0.001000"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.275949" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.275494" elapsed="0.000482"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.276624" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.276134" elapsed="0.000518"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.282537" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.282065" elapsed="0.000539"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.283207" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.282763" elapsed="0.000489"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:26.305269" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:26.305483" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:26 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:26 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":1,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":1,"Leader":"member-2-shard-topology-operational","LastIndex":2,"RaftState":"Follower","LastApplied":2,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":2,"LastLeadershipChangeTime":"2026-04-10 00:45:27.717","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"662.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":2,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":260},"timestamp":1775782106,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:26.305813" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:26.294921" elapsed="0.011043"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.283356" elapsed="0.022974"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.306707" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.306381" elapsed="0.000771"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.283334" elapsed="0.023854"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.347785" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":1,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":1,"Leader":"member-2-shard-topology-operational","LastIndex":2,"RaftState":"Follower","LastApplied":2,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":2,"LastLeadershipChangeTime":"2026-04-10 00:45:27.717","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"662.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":2,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":260},"timestamp":1775782106,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.310299" elapsed="0.037629"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.308972" elapsed="0.039022"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.308944" elapsed="0.039097"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.352136" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.349574" elapsed="0.002665"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.348155" elapsed="0.004135"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.348126" elapsed="0.004204"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.354083" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.353088" elapsed="0.001057"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.354831" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.354324" elapsed="0.000598"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.355848" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.355304" elapsed="0.000593"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.354961" elapsed="0.000989"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.354302" elapsed="0.001684"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.357477" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.356651" elapsed="0.000980"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.358277" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.357805" elapsed="0.000560"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.359258" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.358755" elapsed="0.000550"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.358403" elapsed="0.000953"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.357785" elapsed="0.001607"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:26.359647" elapsed="0.000630"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:26.361195" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.360600" elapsed="0.000658"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.361665" elapsed="0.002507"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:26.307945" elapsed="0.056395"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.364580" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:26.364416" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.364397" elapsed="0.000257"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:26.368479" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:26.364806" elapsed="0.003703"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:26.368591" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:48:26.368765" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:26.277638" elapsed="0.091155"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:26.368911" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:26.369070" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:26.276870" elapsed="0.092227"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.370331" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.369841" elapsed="0.000520"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:26.370410" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:26.370606" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:26.369337" elapsed="0.001297"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:26.371001" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 2, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitialS...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.370795" elapsed="0.000234"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:26.371390" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.371187" elapsed="0.000228"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:26.371461" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:26.371631" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:26.035173" elapsed="0.336483"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:26.371713" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:26.371863" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:26.034440" elapsed="0.337447"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.372184" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.371967" elapsed="0.000540"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.372720" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.372568" elapsed="0.000208"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.372941" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.372798" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.371950" elapsed="0.001063"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:26.034249" elapsed="0.338788"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.375641" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.375290" elapsed="0.000379"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:26.375715" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:26.375868" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:26.374768" elapsed="0.001126"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.470857" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.470393" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:26.471729" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:26.471423" elapsed="0.000383">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:26.472033" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:26.471071" elapsed="0.000988"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.472646" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:26.472230" elapsed="0.000444"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:26.472996" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:26.473164" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:26.472849" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.473620" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.473348" 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-04-10T00:48:26.474712" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.474435" elapsed="0.000323"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.475195" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.474922" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.475571" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.475783" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.475959" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:26.475417" elapsed="0.000601"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.475274" elapsed="0.000775"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:26.476096" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:26.476267" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:26.474097" elapsed="0.002196"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.473748" elapsed="0.002577"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.476745" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.476351" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.473724" elapsed="0.003103"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.477429" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.476978" elapsed="0.000478"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:26.477505" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:26.469378" elapsed="0.008276"/>
</kw>
<msg time="2026-04-10T00:48:26.477710" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:26.452073" elapsed="0.025750"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.490426" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.504174" elapsed="0.000081"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.516976" elapsed="0.000066"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.517959" 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-04-10T00:48:26.518758" 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-04-10T00:48:26.519392" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.519236" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:26.519198" elapsed="0.000278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.519666" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.519858" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.520044" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:26.519140" elapsed="0.000979"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.518892" elapsed="0.001267"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.520892" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.521016" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:48:26.521277" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:26.445012" elapsed="0.076375"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:26.524492" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:26.524147" elapsed="0.000442">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:26.524786" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:26.523646" elapsed="0.001184"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.525368" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.524967" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.526076" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.525772" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.525477" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.524914" elapsed="0.001277"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.529590" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:26.527079" elapsed="0.002561"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:26.529725" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:48:26.530066" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:26.522423" elapsed="0.007758"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:26.533412" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:26.533130" elapsed="0.000355">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:26.533785" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:26.532653" elapsed="0.001179"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:26.534274" elapsed="0.000086"/>
</return>
<status status="PASS" start="2026-04-10T00:48:26.533981" elapsed="0.000452"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.533921" elapsed="0.000551"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.535407" elapsed="0.000040"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.536195" elapsed="0.000038"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.536309" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:48:26.538885" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:26.531332" elapsed="0.007667"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.543274" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.542825" elapsed="0.000561"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.544606" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.544189" elapsed="0.000519"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:26.566969" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node013gawcwja405m14axcmgdzwrtx0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:26.567942" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:26.568449" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:26.547222" elapsed="0.021288"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.544851" elapsed="0.023833"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.569392" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.568792" elapsed="0.000862"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.544796" elapsed="0.024940"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.580107" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.573725" elapsed="0.007203"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.573149" elapsed="0.007868"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.573102" elapsed="0.007970"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.584401" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.582008" elapsed="0.002441"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.581415" elapsed="0.003070"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.581366" elapsed="0.003142"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.585159" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.584742" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.585522" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.585280" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.586107" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.585797" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.585632" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.585261" elapsed="0.000929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.586752" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.586371" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.587110" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.586872" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.587682" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.587358" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.587195" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.586852" elapsed="0.000915"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:26.587948" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:26.588844" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.588496" elapsed="0.000376"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.589053" elapsed="0.002446"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:26.571455" elapsed="0.020192"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.592004" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:26.591779" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.591729" elapsed="0.000427"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:26.601398" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:26.592931" elapsed="0.008520"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:26.601535" elapsed="0.000090"/>
</return>
<msg time="2026-04-10T00:48:26.601899" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:26.539774" elapsed="0.062238"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:26.602488" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:26.602685" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:26.384262" elapsed="0.218451"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.603087" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.602803" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.602785" elapsed="0.000549"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:26.603368" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:26.380017" elapsed="0.223481"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.375964" elapsed="0.227646"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.375946" elapsed="0.227692"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.604285" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:26.604175" elapsed="0.000169"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:48:26.604470" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:48:26.604367" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.604157" elapsed="0.000423"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.604742" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:48:26.604863" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:26.603878" elapsed="0.001011"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.605475" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.605070" elapsed="0.000431"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.606139" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.605676" elapsed="0.000492"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.612071" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.611573" elapsed="0.000559"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.612761" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.612293" elapsed="0.000513"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:26.636058" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:26.636350" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:26 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:26 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":1,"SnapshotIndex":1,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":1,"Leader":"member-2-shard-topology-operational","LastIndex":2,"RaftState":"Leader","LastApplied":2,"LastCommittedTransactionTime":"2026-04-10 00:45:28.650","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":2,"LastLeadershipChangeTime":"2026-04-10 00:45:27.707","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.179","active":true,"matchIndex":2,"voting":true,"id":"member-1-shard-topology-operational","nextIndex":3},{"timeSinceLastActivity":"00:00:00.178","active":true,"matchIndex":2,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":3}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.113 ms","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":2,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":260},"timestamp":1775782106,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:26.636776" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:26.625133" elapsed="0.011818"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.612880" elapsed="0.024501"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.637857" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.637450" elapsed="0.000904"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.612860" elapsed="0.025653"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.646792" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":1,"SnapshotIndex":1,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":1,"Leader":"member-2-shard-topology-operational","LastIndex":2,"RaftState":"Leader","LastApplied":2,"LastCommittedTransactionTime":"2026-04-10 00:45:28.650","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":2,"LastLeadershipChangeTime":"2026-04-10 00:45:27.707","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.179","active":true,"matchIndex":2,"voting":true,"id":"member-1-shard-topology-operational","nextIndex":3},{"timeSinceLastActivity":"00:00:00.178","active":true,"matchIndex":2,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":3}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.113 ms","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":2,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":260},"timestamp":1775782106,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.642391" elapsed="0.004593"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.640917" elapsed="0.006153"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.640883" elapsed="0.006252"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.651239" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.648523" elapsed="0.002825"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.647303" elapsed="0.004098"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.647257" elapsed="0.004184"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.653237" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.652352" elapsed="0.000951"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.654007" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.653489" elapsed="0.000613"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.655114" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.654517" elapsed="0.000646"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.654149" elapsed="0.001068"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.653465" elapsed="0.001789"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.656865" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.655992" elapsed="0.000937"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.657609" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.657112" elapsed="0.000590"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.658711" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.658129" elapsed="0.000633"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.657742" elapsed="0.001073"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.657088" elapsed="0.001763"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:26.659107" elapsed="0.000736"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:26.660872" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.660181" elapsed="0.000756"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.661321" elapsed="0.004939"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:26.639591" elapsed="0.027189"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.667379" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:26.667036" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.666960" elapsed="0.000619"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:26.674894" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:26.668051" elapsed="0.006894"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:26.675128" elapsed="0.000059"/>
</return>
<msg time="2026-04-10T00:48:26.675416" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:26.607152" elapsed="0.068305"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:26.675576" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:48:26.675814" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:26.606383" elapsed="0.069472"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.677940" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.676972" elapsed="0.001019"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:26.678067" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:48:26.678353" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:26.676290" elapsed="0.002105"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:26.679089" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 2, 'CommittedTransactionsCount': 1, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'id...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.678712" elapsed="0.000423"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:26.679793" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.679430" elapsed="0.000403"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:26.679905" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:48:26.680135" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:26.374147" elapsed="0.306024"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:26.680301" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:48:26.680568" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:26.373382" elapsed="0.307227"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.681075" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.680738" elapsed="0.000432"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.681562" elapsed="0.000398"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.681211" elapsed="0.000810"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.682322" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.682057" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.680711" elapsed="0.001890"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:26.373211" elapsed="0.309434"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.686324" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.685820" elapsed="0.000545"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:26.686433" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:48:26.686691" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:26.685245" elapsed="0.001484"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.786831" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.786311" elapsed="0.000557"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:26.787881" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:26.787583" elapsed="0.000382">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:26.788063" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:26.787184" elapsed="0.000905"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.788675" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:26.788259" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:26.789054" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:26.789316" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:26.788889" elapsed="0.000461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.789811" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.789526" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.791057" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.790791" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.791639" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.791272" 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-04-10T00:48:26.792057" 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-04-10T00:48:26.792320" 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-04-10T00:48:26.792532" elapsed="0.000044"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:26.791885" elapsed="0.000739"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.791730" elapsed="0.000934"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:26.792723" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:48:26.792934" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:26.790370" elapsed="0.002597"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.789980" elapsed="0.003027"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.793210" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.793039" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.789950" elapsed="0.003337"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.793941" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.793432" elapsed="0.000537"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:26.794017" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:26.785373" elapsed="0.008772"/>
</kw>
<msg time="2026-04-10T00:48:26.794202" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:26.771901" elapsed="0.022420"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.807592" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.820515" elapsed="0.000083"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.833318" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.834152" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.834953" 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-04-10T00:48:26.835597" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.835426" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:26.835406" elapsed="0.000282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.835853" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.836043" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.836236" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:26.835349" elapsed="0.000968"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.835101" elapsed="0.001330"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.837262" elapsed="0.000039"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.837392" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:48:26.837675" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:26.763137" elapsed="0.074650"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:26.840957" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:26.840640" elapsed="0.000399">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:26.841241" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:26.840086" elapsed="0.001203"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.841846" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.841423" elapsed="0.000493"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.842666" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.842246" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.841956" elapsed="0.000785"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.841371" elapsed="0.001408"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.846201" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:26.843589" elapsed="0.002668"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:26.846335" elapsed="0.000066"/>
</return>
<msg time="2026-04-10T00:48:26.846819" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:26.838900" elapsed="0.008027"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:26.849862" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:26.849568" elapsed="0.000384">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:26.850153" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:26.849104" elapsed="0.001098"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:26.850693" elapsed="0.000080"/>
</return>
<status status="PASS" start="2026-04-10T00:48:26.850351" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.850299" elapsed="0.000583"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.851637" elapsed="0.000039"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.852566" elapsed="0.000045"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.852689" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:48:26.855050" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:26.847863" elapsed="0.007296"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.860122" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.859372" elapsed="0.000926"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.861918" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.861340" elapsed="0.000719"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:26.900118" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01scfk5e5snymj1gtu4c77d4crx0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:26.901145" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:26.901759" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:26.866310" elapsed="0.035516"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.862325" elapsed="0.039656"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.902824" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.902123" elapsed="0.000876"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.862216" elapsed="0.040863"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.911819" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.908124" elapsed="0.004056"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.907446" elapsed="0.004788"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.907385" elapsed="0.004881"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.914952" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.912634" elapsed="0.002366"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.912379" elapsed="0.002656"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.912356" elapsed="0.002704"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.915737" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.915273" elapsed="0.000492"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.916108" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.915861" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.916729" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.916384" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.916206" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.915840" elapsed="0.000975"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.917454" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.917013" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.917907" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.917636" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.918487" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.918157" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.917993" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.917613" elapsed="0.000976"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:26.918769" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:26.919645" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.919319" elapsed="0.000352"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.919849" elapsed="0.002722"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:26.905243" elapsed="0.017463"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.923079" elapsed="0.000061"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:26.922850" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.922792" elapsed="0.000454"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:26.933554" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:26.924035" elapsed="0.009592"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:26.933735" elapsed="0.000096"/>
</return>
<msg time="2026-04-10T00:48:26.934197" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:26.855959" elapsed="0.078387"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:26.935038" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:48:26.935285" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:26.699381" elapsed="0.235941"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.935795" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.935438" elapsed="0.000629"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.935414" elapsed="0.000702"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:26.936167" 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="PASS" start="2026-04-10T00:48:26.693315" elapsed="0.243054"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.686833" elapsed="0.249596"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.686805" elapsed="0.249662"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.937340" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:26.937195" elapsed="0.000214"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:48:26.937593" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:48:26.937449" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.937171" elapsed="0.000507"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.937831" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:48:26.937957" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:26.936809" elapsed="0.001174"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.938559" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.938157" elapsed="0.000432"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.939222" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.938747" elapsed="0.000505"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.945632" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.944941" elapsed="0.000743"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.946512" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.945843" elapsed="0.000733"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:26.968203" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:26.968410" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:26 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:26 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":1,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":1,"Leader":"member-2-shard-topology-operational","LastIndex":2,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":2,"LastLogIndex":2,"LastLeadershipChangeTime":"2026-04-10 00:45:27.716","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"798.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":2,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":260},"timestamp":1775782106,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:26.968943" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:26.958487" elapsed="0.010613"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.946653" elapsed="0.022826"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.969842" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.969525" elapsed="0.000891"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.946632" elapsed="0.023828"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.977919" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":1,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":1,"Leader":"member-2-shard-topology-operational","LastIndex":2,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":2,"LastLogIndex":2,"LastLeadershipChangeTime":"2026-04-10 00:45:27.716","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"798.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":2,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":260},"timestamp":1775782106,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.973886" elapsed="0.004207"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.972441" elapsed="0.005727"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.972414" elapsed="0.005812"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.982413" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:26.979891" elapsed="0.002625"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.978351" elapsed="0.004247"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.978324" elapsed="0.004315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.984240" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.983297" elapsed="0.001005"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.984964" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.984472" elapsed="0.000581"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.986035" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.985437" elapsed="0.000646"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.985092" elapsed="0.001042"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.984452" elapsed="0.001718"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.987800" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.986864" elapsed="0.001001"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:26.988601" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:26.988037" elapsed="0.000667"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:26.989644" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:26.989089" elapsed="0.000612"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:26.988750" elapsed="0.001003"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.988017" elapsed="0.001774"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:26.990072" elapsed="0.000797"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:26.991772" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:26.991210" elapsed="0.000625"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:26.992125" elapsed="0.002749"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:26.971364" elapsed="0.023702"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:26.995279" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:26.995144" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:26.995124" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:27.000241" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:26.995500" elapsed="0.004787"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:27.000367" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:48:27.000702" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:26.940307" elapsed="0.060436"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:27.000915" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:48:27.001164" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:26.939473" elapsed="0.061733"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.003031" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.002137" elapsed="0.000940"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:27.003152" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:48:27.003420" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:27.001586" elapsed="0.001875"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:27.004066" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 2, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitialS...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.003725" elapsed="0.000396"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:27.004705" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.004374" elapsed="0.000369"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:27.004812" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:48:27.005086" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:26.684315" elapsed="0.320809"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:27.005211" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:48:27.005492" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:26.683197" elapsed="0.322372"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.006054" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.005700" elapsed="0.000775"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.006856" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.006525" elapsed="0.000415"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.007187" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.006974" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.005671" elapsed="0.001623"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:26.682931" elapsed="0.324399"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:26.034042" elapsed="0.973336"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:48:27.007444" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:48:27.007770" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:48:27.007842" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:48:26.030005" elapsed="0.977872"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.008570" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:48:27.008692" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:27.008139" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.009180" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.008830" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.008804" elapsed="0.000514"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.012672" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:48:27.009530" elapsed="0.003213"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:48:27.013411" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.013079" elapsed="0.000382"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:48:27.013572" elapsed="0.000048"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:48:26.027425" elapsed="0.986401"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:48:26.027189" elapsed="0.986734"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.019101" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:27.018658" elapsed="0.000472"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.019633" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:27.019306" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:27.019703" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:27.019858" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:27.018238" elapsed="0.001644"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:48:27.020064" elapsed="0.000167"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.020749" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:27.020394" elapsed="0.000382"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.021183" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:27.020936" elapsed="0.000272"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.021611" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:27.021357" elapsed="0.000280"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.024215" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.023841" elapsed="0.000408"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:27.024298" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:27.024450" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:27.023477" elapsed="0.000997"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.117761" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.117309" elapsed="0.000488"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:27.118753" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:27.118450" elapsed="0.000384">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:27.118930" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:27.118058" elapsed="0.000898"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.119879" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:27.119177" elapsed="0.000745"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:27.120397" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:27.120658" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:27.120172" elapsed="0.000525"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.121420" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.121015" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.123142" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.122633" elapsed="0.000611"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.124053" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.123590" elapsed="0.000504"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.124622" 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-04-10T00:48:27.124923" elapsed="0.000035"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.125173" elapsed="0.000036"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:27.124399" elapsed="0.000874"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.124181" elapsed="0.001136"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:27.125385" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:48:27.125648" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:27.122103" elapsed="0.003581"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.121633" elapsed="0.004099"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.125978" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.125767" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.121599" elapsed="0.004488"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.127163" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.126314" elapsed="0.000890"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:27.127275" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:27.116635" elapsed="0.010820"/>
</kw>
<msg time="2026-04-10T00:48:27.127554" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:27.101609" elapsed="0.026062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.144506" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.161644" elapsed="0.000073"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.178790" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.179628" 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-04-10T00:48:27.180412" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.181146" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.180964" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:27.180945" elapsed="0.000288"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.181400" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.181638" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.181836" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:27.180891" elapsed="0.001023"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.180647" elapsed="0.001309"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.182765" elapsed="0.000039"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.182891" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:48:27.183135" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:27.094705" elapsed="0.088538"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:27.186299" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:27.186001" elapsed="0.000375">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:27.186650" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:27.185464" elapsed="0.001234"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.187235" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.186836" elapsed="0.000469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.187953" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.187643" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.187344" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.186784" elapsed="0.001282"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.191344" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:27.188831" elapsed="0.002561"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:27.191471" elapsed="0.000064"/>
</return>
<msg time="2026-04-10T00:48:27.191809" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:27.184272" elapsed="0.007643"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:27.194840" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:27.194431" elapsed="0.000475">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:27.195098" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:27.193984" elapsed="0.001159"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:27.195529" elapsed="0.000099"/>
</return>
<status status="PASS" start="2026-04-10T00:48:27.195276" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.195225" elapsed="0.000511"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.196478" 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-04-10T00:48:27.197277" elapsed="0.000038"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.197389" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:48:27.199799" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:27.192784" elapsed="0.007126"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.203913" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.203497" elapsed="0.000518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.205223" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.204778" elapsed="0.000563"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:27.230446" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0labrpeq6hvzrqou5cqfegtpr0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:27.231425" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:27.231977" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:27.207825" elapsed="0.024214"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.205471" elapsed="0.026699"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.232893" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.232272" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.205420" elapsed="0.027722"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.241645" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.237098" elapsed="0.004893"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.236586" elapsed="0.005442"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.236513" elapsed="0.005540"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.244835" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.242422" elapsed="0.002460"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.242140" elapsed="0.002778"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.242117" elapsed="0.002826"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.245607" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.245145" elapsed="0.000502"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.246036" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.245765" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.246728" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.246312" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.246134" elapsed="0.000659"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.245743" elapsed="0.001071"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.247428" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.247016" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.247832" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.247586" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.248383" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.248076" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.247916" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.247564" elapsed="0.000938"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:27.248716" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:27.249604" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.249280" elapsed="0.000351"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.249838" elapsed="0.002419"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:27.234865" elapsed="0.017520"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.252801" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:27.252556" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.252466" elapsed="0.000488"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:27.262795" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:27.253725" elapsed="0.009122"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:27.262927" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:48:27.263285" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:27.200640" elapsed="0.062758"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:27.263888" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:48:27.264074" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:27.034483" elapsed="0.229618"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.264498" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.264188" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.264169" elapsed="0.000600"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:27.264811" elapsed="0.000033"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:27.030212" elapsed="0.234756"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.024567" elapsed="0.240453"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.024528" elapsed="0.240521"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.265734" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:27.265623" elapsed="0.000158"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:48:27.265904" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:27.265803" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.265605" elapsed="0.000381"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.266135" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:48:27.266256" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:27.265323" elapsed="0.000958"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.266859" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.266450" elapsed="0.000436"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.267509" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.267044" elapsed="0.000492"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.273628" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.272959" elapsed="0.000718"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.274268" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.273834" elapsed="0.000746"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:27.294401" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:27.294561" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:27 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":34,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":34,"Leader":"member-2-shard-default-operational","LastIndex":35,"RaftState":"Follower","LastApplied":35,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":35,"LastLeadershipChangeTime":"2026-04-10 00:45:27.721","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"365.1 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":35,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":89676},"timestamp":1775782107,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:27.294767" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:27.286286" elapsed="0.008587"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.274657" elapsed="0.020473"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.295328" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.295166" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.274637" elapsed="0.021097"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.301709" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":34,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":34,"Leader":"member-2-shard-default-operational","LastIndex":35,"RaftState":"Follower","LastApplied":35,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":35,"LastLeadershipChangeTime":"2026-04-10 00:45:27.721","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"365.1 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":35,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":89676},"timestamp":1775782107,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.297958" elapsed="0.003912"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.296987" elapsed="0.004953"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.296968" elapsed="0.005026"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.306839" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.303335" elapsed="0.003645"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.302112" elapsed="0.004937"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.302086" elapsed="0.005017"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.309224" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.308134" elapsed="0.001206"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.310235" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.309612" elapsed="0.000710"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.311340" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.310827" elapsed="0.000560"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.310360" elapsed="0.001078"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.309582" elapsed="0.001891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.312951" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.312188" elapsed="0.000825"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.313698" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.313196" elapsed="0.000590"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.314676" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.314158" elapsed="0.000565"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.313824" elapsed="0.000999"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.313175" elapsed="0.001685"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:27.315092" elapsed="0.000684"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:27.316608" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.316085" elapsed="0.000585"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.316956" elapsed="0.002490"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:27.296263" elapsed="0.023464"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.319934" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:27.319803" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.319784" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:27.323819" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:27.320153" elapsed="0.003697"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:27.323905" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:48:27.324074" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:27.268509" elapsed="0.055592"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:27.324205" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:27.324364" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:27.267769" elapsed="0.056622"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.325486" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578210...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.325006" elapsed="0.000510"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:27.325588" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:27.325768" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578210...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:27.324641" elapsed="0.001153"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:27.326154" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 35, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.325953" elapsed="0.000228"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:27.326534" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.326337" elapsed="0.000237"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:27.326623" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:27.326777" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:27.022843" elapsed="0.303959"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:27.326860" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:48:27.327008" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:27.022093" elapsed="0.304940"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.327333" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.327115" elapsed="0.000528"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.327817" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.327668" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.328035" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.327894" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.327097" elapsed="0.001011"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:27.021896" elapsed="0.306236"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.330509" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.330183" elapsed="0.000353"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:27.330597" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:27.330745" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:27.329841" elapsed="0.000929"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.418862" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.418432" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:27.419697" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:27.419420" elapsed="0.000357">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:27.419942" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:27.419069" elapsed="0.000899"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.420540" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:27.420139" elapsed="0.000446"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:27.420899" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:27.421060" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:27.420750" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.421520" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.421247" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.422661" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.422364" elapsed="0.000343"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.423148" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.422872" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.423566" 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-04-10T00:48:27.423785" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.423960" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:27.423396" elapsed="0.000621"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.423230" elapsed="0.000817"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:27.424094" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:48:27.424260" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:27.422019" elapsed="0.002266"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.421690" elapsed="0.002626"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.424489" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.424341" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.421666" elapsed="0.002916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.425168" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.424728" elapsed="0.000467"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:27.425243" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:27.417776" elapsed="0.007591"/>
</kw>
<msg time="2026-04-10T00:48:27.425421" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:27.404013" elapsed="0.021490"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.438285" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.450767" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.463320" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.464123" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.465068" elapsed="0.000044"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.465713" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.465555" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:27.465522" 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-04-10T00:48:27.465958" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.466143" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.466325" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:27.465467" elapsed="0.000933"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.465221" elapsed="0.001221"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.467168" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.467289" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:48:27.467626" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:27.397799" elapsed="0.069962"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:27.471536" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:27.471141" elapsed="0.000542">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:27.471990" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:27.470081" elapsed="0.002002"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.472930" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.472287" elapsed="0.000761"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.473989" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.473516" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.473110" elapsed="0.000992"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.472210" elapsed="0.001949"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.479337" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:27.475667" elapsed="0.003738"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:27.479576" elapsed="0.000115"/>
</return>
<msg time="2026-04-10T00:48:27.480078" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:27.468851" elapsed="0.011632"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:27.483502" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:27.483242" elapsed="0.000351">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:27.483829" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:27.482792" elapsed="0.001083"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:27.484294" elapsed="0.000081"/>
</return>
<status status="PASS" start="2026-04-10T00:48:27.484006" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.483956" elapsed="0.000528"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.485255" elapsed="0.000046"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.486051" elapsed="0.000043"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.486174" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:48:27.488607" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:27.481664" elapsed="0.007059"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.493483" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.492855" elapsed="0.000801"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.495486" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.494911" elapsed="0.000872"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:27.511492" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node013gawcwja405m14axcmgdzwrtx0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:27.512469" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:27.512995" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:27.499277" elapsed="0.013781"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.495985" elapsed="0.017200"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.513907" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.513287" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.495907" elapsed="0.018254"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.522160" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.518390" elapsed="0.004098"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.517874" elapsed="0.004651"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.517822" elapsed="0.004768"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.525262" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.522924" elapsed="0.002389"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.522676" elapsed="0.002672"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.522657" elapsed="0.002715"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.526030" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.525621" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.526395" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.526152" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.527028" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.526692" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.526477" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.526133" elapsed="0.000980"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.527711" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.527295" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.528085" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.527834" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.528678" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.528352" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.528188" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.527814" elapsed="0.000974"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:27.528977" elapsed="0.000448"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:27.529956" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.529646" elapsed="0.000336"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.530160" elapsed="0.002485"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:27.515936" elapsed="0.016842"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.533146" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:27.532916" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.532863" elapsed="0.000440"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:27.542717" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:27.534144" elapsed="0.008624"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:27.542850" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:48:27.543194" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:27.489460" elapsed="0.053846"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:27.544035" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:27.544225" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:27.339264" elapsed="0.204989"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.544673" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.544340" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.544323" elapsed="0.000581"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:27.544938" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:27.335037" elapsed="0.210031"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.330837" elapsed="0.214276"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.330820" elapsed="0.214340"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.546114" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:27.545948" elapsed="0.000237"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:48:27.546498" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:48:27.546208" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.545929" elapsed="0.000673"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.546755" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:48:27.546876" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:27.545632" elapsed="0.001269"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.547453" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.547073" elapsed="0.000407"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.548114" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.547654" elapsed="0.000488"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.554064" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.553562" elapsed="0.000561"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.554797" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.554313" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:27.576710" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:27.576917" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:27 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":35,"InMemoryJournalLogSize":3,"ReplicatedToAllIndex":35,"Leader":"member-2-shard-default-operational","LastIndex":38,"RaftState":"Leader","LastApplied":36,"LastCommittedTransactionTime":"2026-04-10 00:45:29.867","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":38,"LastLeadershipChangeTime":"2026-04-10 00:45:27.710","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.076","active":true,"matchIndex":36,"voting":true,"id":"member-1-shard-default-operational","nextIndex":37},{"timeSinceLastActivity":"00:00:00.076","active":true,"matchIndex":36,"voting":true,"id":"member-3-shard-default-operational","nextIndex":37}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"806.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":9,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":36,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":5,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":89799},"timestamp":1775782107,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:27.577249" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:27.566417" elapsed="0.011004"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.554912" elapsed="0.022934"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.578149" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.577897" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.554894" elapsed="0.023820"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.585860" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":35,"InMemoryJournalLogSize":3,"ReplicatedToAllIndex":35,"Leader":"member-2-shard-default-operational","LastIndex":38,"RaftState":"Leader","LastApplied":36,"LastCommittedTransactionTime":"2026-04-10 00:45:29.867","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":38,"LastLeadershipChangeTime":"2026-04-10 00:45:27.710","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.076","active":true,"matchIndex":36,"voting":true,"id":"member-1-shard-default-operational","nextIndex":37},{"timeSinceLastActivity":"00:00:00.076","active":true,"matchIndex":36,"voting":true,"id":"member-3-shard-default-operational","nextIndex":37}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"806.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":9,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":36,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":5,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":89799},"timestamp":1775782107,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.581819" elapsed="0.004209"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.580499" elapsed="0.005599"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.580470" elapsed="0.005679"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.589723" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.587121" elapsed="0.002702"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.586234" elapsed="0.003638"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.586216" elapsed="0.003694"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.591455" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.590662" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.592242" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.591750" elapsed="0.000581"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.593370" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.592775" elapsed="0.000659"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.592370" elapsed="0.001121"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.591727" elapsed="0.001800"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.595028" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.594194" elapsed="0.000897"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.595827" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.595265" elapsed="0.000651"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.596909" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.596286" elapsed="0.000674"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.595954" elapsed="0.001059"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.595243" elapsed="0.001813"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:27.597295" elapsed="0.000697"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:27.598924" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.598308" elapsed="0.000681"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.599286" elapsed="0.002826"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:27.579433" elapsed="0.022900"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.602632" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:27.602442" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.602416" elapsed="0.000312"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:27.608098" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:27.602934" elapsed="0.005206"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:27.608268" elapsed="0.000078"/>
</return>
<msg time="2026-04-10T00:48:27.608562" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:27.549111" elapsed="0.059490"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:27.608683" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:48:27.608894" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:27.548356" elapsed="0.060576"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.610466" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578210...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.609775" elapsed="0.000733"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:27.610594" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:48:27.610843" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578210...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:27.609257" elapsed="0.001626"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:27.611380" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 36, 'CommittedTransactionsCount': 9, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 2, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.611100" elapsed="0.000319"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:27.611946" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.611673" elapsed="0.000309"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:27.612043" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:48:27.612271" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:27.329216" elapsed="0.283089"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:27.612383" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:48:27.612620" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:27.328470" elapsed="0.284186"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.613068" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.612770" elapsed="0.000377"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.613467" elapsed="0.000279"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.613181" elapsed="0.000617"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.614038" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.613829" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.612746" elapsed="0.001397"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:27.328300" elapsed="0.285876"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.617519" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.617071" elapsed="0.000502"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:27.617638" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:48:27.617843" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:27.616603" elapsed="0.001276"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.728252" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.727843" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:27.729220" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:27.728943" elapsed="0.000357">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:27.729396" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:27.728576" elapsed="0.000844"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.730062" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:27.729635" elapsed="0.000454"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:27.730396" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:27.730572" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:27.730254" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.731004" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.730757" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.732054" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.731801" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.732535" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.732265" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.732931" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.733136" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.733314" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:27.732792" elapsed="0.000579"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.732642" elapsed="0.000760"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:27.733453" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:48:27.733637" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:27.731459" elapsed="0.002204"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.731133" elapsed="0.002563"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.733877" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.733721" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.731108" elapsed="0.002847"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.734535" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.734099" elapsed="0.000480"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:27.734628" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:27.727190" elapsed="0.007562"/>
</kw>
<msg time="2026-04-10T00:48:27.734806" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:27.714470" elapsed="0.020418"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.747638" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.760424" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.773563" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.774370" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.775180" elapsed="0.000039"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.775881" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.775725" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:27.775707" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.776130" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.776320" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.776508" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:27.775648" elapsed="0.000956"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.775340" elapsed="0.001307"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.777433" elapsed="0.000040"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.777576" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:48:27.777827" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:27.707281" elapsed="0.070655"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:27.781004" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:27.780719" elapsed="0.000360">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:27.781274" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:27.780210" elapsed="0.001110"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.781871" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.781455" elapsed="0.000488"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.782685" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.782262" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.781982" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.781403" elapsed="0.001398"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.785966" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:27.783595" elapsed="0.002418"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:27.786092" elapsed="0.000066"/>
</return>
<msg time="2026-04-10T00:48:27.786417" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:27.778985" elapsed="0.007539"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:27.789500" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:27.789222" elapsed="0.000362">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:27.789779" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:27.788760" elapsed="0.001065"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:27.790210" elapsed="0.000083"/>
</return>
<status status="PASS" start="2026-04-10T00:48:27.789959" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.789908" elapsed="0.000498"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.791257" elapsed="0.000039"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.792048" elapsed="0.000039"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.792184" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:48:27.795916" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:27.787623" elapsed="0.008402"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.800317" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.799902" elapsed="0.000519"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.801570" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.801155" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:27.831694" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01scfk5e5snymj1gtu4c77d4crx0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:27.832663" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:27.833189" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:27.804272" elapsed="0.028978"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.801804" elapsed="0.031588"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.834195" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.833501" elapsed="0.000864"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.801752" elapsed="0.032690"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.844840" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.838522" elapsed="0.007276"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.838007" elapsed="0.007878"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.837958" elapsed="0.007985"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.848804" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.846410" elapsed="0.002442"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.846150" elapsed="0.002738"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.846131" elapsed="0.002782"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.849606" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.849170" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.849976" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.849730" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.850574" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.850236" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.850068" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.849709" elapsed="0.000954"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.851236" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.850852" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.851631" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.851361" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.852213" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.851882" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.851719" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.851341" elapsed="0.000957"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:27.852480" elapsed="0.000383"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:27.853446" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.853092" elapsed="0.000381"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.853682" elapsed="0.002433"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:27.836195" elapsed="0.020062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.856649" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:27.856395" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.856341" elapsed="0.000468"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:27.867023" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:27.857687" elapsed="0.009387"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:27.867154" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:48:27.867491" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:27.796736" elapsed="0.070879"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:27.868084" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:27.868261" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:27.629832" elapsed="0.238455"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.868709" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.868376" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.868358" elapsed="0.000594"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:27.868986" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:27.623770" elapsed="0.245345"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.617973" elapsed="0.251184"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.617946" elapsed="0.251235"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.869827" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:27.869718" elapsed="0.000154"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:48:27.869996" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:27.869895" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.869700" elapsed="0.000378"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.870234" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:48:27.870354" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:27.869414" elapsed="0.000965"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.870961" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.870572" elapsed="0.000416"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.871620" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.871144" elapsed="0.000504"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.877388" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.876942" elapsed="0.000495"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.878059" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.877626" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:27.897518" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:27.897912" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:27 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":35,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":35,"Leader":"member-2-shard-default-operational","LastIndex":36,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":36,"LastLogIndex":36,"LastLeadershipChangeTime":"2026-04-10 00:45:27.718","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"470.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":36,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":89717},"timestamp":1775782107,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:27.898108" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:27.889234" elapsed="0.008979"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.878172" elapsed="0.020293"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.898673" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.898497" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.878153" elapsed="0.020857"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.904282" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":35,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":35,"Leader":"member-2-shard-default-operational","LastIndex":36,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":36,"LastLogIndex":36,"LastLeadershipChangeTime":"2026-04-10 00:45:27.718","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"470.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":36,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":89717},"timestamp":1775782107,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.901177" elapsed="0.003236"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.900236" elapsed="0.004235"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.900216" elapsed="0.004299"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.908086" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:27.905571" elapsed="0.002619"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.904632" elapsed="0.003609"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.904609" elapsed="0.003671"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.909820" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.908970" elapsed="0.000912"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.910525" elapsed="0.000093"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.910051" elapsed="0.000620"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.911848" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.911047" elapsed="0.000856"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.910709" elapsed="0.001245"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.910031" elapsed="0.001973"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.914088" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.913216" elapsed="0.000935"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.914811" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.914320" elapsed="0.000577"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.915960" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.915392" elapsed="0.000617"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.914935" elapsed="0.001125"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.914300" elapsed="0.001794"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:27.916327" elapsed="0.000655"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:27.917932" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.917296" elapsed="0.000697"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.918287" elapsed="0.002534"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:27.899511" elapsed="0.021477"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:27.921199" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:27.921063" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.921045" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:27.924989" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:27.921417" elapsed="0.003602"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:27.925070" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:48:27.925276" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:27.872650" elapsed="0.052653"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:27.925425" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:27.925711" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:27.871862" elapsed="0.053876"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.926843" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578210...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:27.926342" elapsed="0.000530"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:27.926921" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:27.927097" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578210...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:27.925982" elapsed="0.001141"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:27.927482" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 36, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.927281" elapsed="0.000227"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:27.927943" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.927738" elapsed="0.000231"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:27.928016" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:27.928169" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:27.615750" elapsed="0.312443"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:27.928249" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:48:27.928397" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:27.614658" elapsed="0.313763"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.928735" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.928501" elapsed="0.000461"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.929131" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.928986" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.929350" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.929208" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.928484" elapsed="0.000938"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:27.614408" elapsed="0.315038"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:27.021689" elapsed="0.907790"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:48:27.929523" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:48:27.929744" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:48:27.929790" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:48:27.017447" elapsed="0.912366"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.930262" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:48:27.930340" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:27.929989" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:27.930669" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:27.930431" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.930414" elapsed="0.000331"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.933057" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:48:27.930882" elapsed="0.002223"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:48:27.933509" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:27.933318" elapsed="0.000217"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:48:27.933599" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:48:27.014573" elapsed="0.919181"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:48:27.014080" elapsed="0.919720"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:48:22.430417" elapsed="5.503415"/>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:48:22.430019" elapsed="5.503868"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.939082" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:27.938697" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.939589" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:27.939269" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:27.939661" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:27.939814" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:27.938226" elapsed="0.001613"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:48:27.939994" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.940655" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:27.940307" elapsed="0.000374"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.941076" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:27.940839" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.941481" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:27.941248" elapsed="0.000258"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:27.943993" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:27.943664" elapsed="0.000356"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:27.944066" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:27.944215" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:27.943300" elapsed="0.000940"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.034050" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.033643" elapsed="0.000442"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.034891" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:28.034620" elapsed="0.000353">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:28.035071" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:28.034264" elapsed="0.000831"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.035668" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:28.035262" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.036000" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:28.036237" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:28.035858" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.036691" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.036422" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.037767" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.037488" elapsed="0.000325"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.038251" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.037976" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.038635" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.038841" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.039018" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:28.038479" elapsed="0.000595"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.038333" elapsed="0.000774"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:28.039156" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:28.039326" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:28.037137" elapsed="0.002214"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.036820" elapsed="0.002562"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.039607" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.039408" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.036795" elapsed="0.002898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.040315" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.039871" elapsed="0.000472"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:28.040390" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:28.033001" elapsed="0.007513"/>
</kw>
<msg time="2026-04-10T00:48:28.040585" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:28.019922" elapsed="0.020745"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.053583" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.066298" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.078905" elapsed="0.000073"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.079894" 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-04-10T00:48:28.080690" 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-04-10T00:48:28.081326" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.081171" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:28.081151" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.081586" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.081774" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.081960" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:28.081090" elapsed="0.000943"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.080826" elapsed="0.001249"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.082835" elapsed="0.000037"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.082959" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:48:28.083225" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:28.013051" elapsed="0.070283"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.086503" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:28.086168" elapsed="0.000442">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:28.086801" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:28.085593" elapsed="0.001253"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.087374" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.086976" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.088073" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.087773" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.087480" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.086927" elapsed="0.001257"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.091396" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:28.089017" elapsed="0.002426"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:28.091519" elapsed="0.000080"/>
</return>
<msg time="2026-04-10T00:48:28.091851" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:28.084374" elapsed="0.007581"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.094737" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:28.094462" elapsed="0.000340">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:28.094990" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:28.094026" elapsed="0.001008"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:28.095414" elapsed="0.000079"/>
</return>
<status status="PASS" start="2026-04-10T00:48:28.095166" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.095113" elapsed="0.000622"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.096511" elapsed="0.000051"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.097287" elapsed="0.000035"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.097394" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:48:28.099755" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:28.092905" elapsed="0.006957"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.103745" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.103212" elapsed="0.000636"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.105003" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.104563" 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-04-10T00:48:28.131221" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0labrpeq6hvzrqou5cqfegtpr0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:28.132251" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:28.132810" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:28.107717" elapsed="0.025184"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.105332" elapsed="0.027770"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.134035" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.133257" elapsed="0.000955"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.105258" elapsed="0.029033"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.142694" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.138303" elapsed="0.004719"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.137790" elapsed="0.005269"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.137741" elapsed="0.005342"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.145703" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.143393" elapsed="0.002357"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.143166" elapsed="0.002619"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.143147" elapsed="0.002663"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.146406" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.146013" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.146824" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.146525" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.147378" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.147068" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.146906" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.146506" elapsed="0.000955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.148021" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.147658" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.148374" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.148139" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.149052" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.148637" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.148455" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.148120" elapsed="0.001019"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:28.149319" elapsed="0.000429"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:28.150285" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.149944" elapsed="0.000368"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.150492" elapsed="0.002492"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:28.136043" elapsed="0.017069"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.153469" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:28.153245" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.153193" elapsed="0.000447"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:28.163138" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:28.154401" elapsed="0.008787"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:28.163267" elapsed="0.000070"/>
</return>
<msg time="2026-04-10T00:48:28.163613" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:28.100521" elapsed="0.063201"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:28.164203" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:28.164389" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:27.952903" elapsed="0.211513"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.164784" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.164504" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.164486" elapsed="0.000522"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:28.165044" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:27.948539" elapsed="0.216634"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:27.944309" elapsed="0.220908"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:27.944291" elapsed="0.220951"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:48:28.166012" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:48:28.165874" elapsed="0.000216"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.166154" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:28.166115" elapsed="0.000079"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.165852" elapsed="0.000365"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.166370" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:48:28.166495" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:28.165505" elapsed="0.001016"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.167101" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.166721" elapsed="0.000407"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.167802" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.167310" elapsed="0.001154"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.174913" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.174319" elapsed="0.000655"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.175588" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.175135" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:28.197402" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:28.197630" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:28 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-inventory-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.738","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"639.1 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782108,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:28.197929" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:28.187145" elapsed="0.010942"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.175710" elapsed="0.022762"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.198790" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.198522" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.175690" elapsed="0.023623"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.206954" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-inventory-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.738","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"639.1 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782108,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.202578" elapsed="0.004711"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.201237" elapsed="0.006128"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.201208" elapsed="0.006212"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.212749" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.208921" elapsed="0.003987"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.207571" elapsed="0.005413"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.207517" elapsed="0.005523"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.215213" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.214036" elapsed="0.001240"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.215951" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.215446" elapsed="0.000597"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.216965" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.216418" elapsed="0.000596"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.216081" elapsed="0.000983"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.215424" elapsed="0.001676"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.218617" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.217812" elapsed="0.000868"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.219347" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.218859" elapsed="0.000578"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.220352" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.219832" elapsed="0.000566"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.219474" elapsed="0.000974"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.218839" elapsed="0.001646"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:28.220730" elapsed="0.000637"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:28.222271" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.221758" elapsed="0.000574"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.222652" elapsed="0.002638"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:28.200128" elapsed="0.025331"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.225710" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:28.225534" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.225516" elapsed="0.000267"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:28.229530" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:28.225931" elapsed="0.003767"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:28.229752" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:48:28.229920" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:28.169752" elapsed="0.060195"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:28.230052" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:48:28.230220" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:28.168929" elapsed="0.061318"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.231380" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782108, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.230892" elapsed="0.000517"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:28.231458" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:28.231651" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782108, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:28.230501" elapsed="0.001178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:28.232039" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.231838" elapsed="0.000228"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:28.232432" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.232232" elapsed="0.000225"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:28.232503" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:28.232678" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:27.942696" elapsed="0.290008"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:28.232761" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:48:28.232908" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:27.941939" elapsed="0.290993"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.233251" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.233013" elapsed="0.000470"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.233728" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.233507" elapsed="0.000278"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.233951" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.233808" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.232996" elapsed="0.001029"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:27.941770" elapsed="0.292279"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.236508" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.236170" elapsed="0.000364"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:28.236598" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:28.236747" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:28.235822" elapsed="0.000949"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.324984" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.324495" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.325928" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:28.325614" elapsed="0.000394">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:28.326278" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:28.325237" elapsed="0.001066"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.326887" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:28.326472" elapsed="0.000443"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.327217" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:28.327384" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:28.327077" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.327834" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.327585" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.328960" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.328705" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.329490" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.329199" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.329875" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.330081" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.330276" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:28.329735" elapsed="0.000614"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.329589" elapsed="0.000793"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:28.330432" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:28.330653" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:28.328353" elapsed="0.002331"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.327998" elapsed="0.002726"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.330929" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.330757" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.327973" elapsed="0.003051"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.331684" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.331201" elapsed="0.000517"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:28.331783" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:28.323697" elapsed="0.008217"/>
</kw>
<msg time="2026-04-10T00:48:28.331968" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:28.310467" elapsed="0.021604"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.345103" elapsed="0.000057"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.359342" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.375249" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.376119" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.376935" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.377669" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.377446" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:28.377426" elapsed="0.000366"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.378019" 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-04-10T00:48:28.378233" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.378422" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:28.377366" elapsed="0.001130"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.377091" elapsed="0.001490"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.379309" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.379429" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:48:28.379704" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:28.304118" elapsed="0.075699"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.383236" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:28.382907" elapsed="0.000411">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:28.383562" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:28.382087" elapsed="0.001543"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.384261" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.383811" elapsed="0.000519"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.384970" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.384665" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.384369" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.383743" elapsed="0.001339"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.389193" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:28.385865" elapsed="0.003393"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:28.389364" elapsed="0.000077"/>
</return>
<msg time="2026-04-10T00:48:28.389753" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:28.380869" elapsed="0.009007"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.393586" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:28.393230" elapsed="0.000445">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:28.393991" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:28.392618" elapsed="0.001514"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:28.394805" elapsed="0.000104"/>
</return>
<status status="PASS" start="2026-04-10T00:48:28.394330" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.394257" elapsed="0.000805"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.396040" elapsed="0.000049"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.397049" elapsed="0.000052"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.397202" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T00:48:28.399602" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:28.391153" elapsed="0.008558"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.403663" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.403248" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.404881" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.404480" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:28.422623" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node013gawcwja405m14axcmgdzwrtx0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:28.423613" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:28.424125" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:28.407407" elapsed="0.016780"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.405107" elapsed="0.019225"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.425098" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.424441" elapsed="0.000825"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.405056" elapsed="0.020310"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.434157" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.429721" elapsed="0.004970"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.428940" elapsed="0.005806"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.428891" elapsed="0.005891"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.438750" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.435239" elapsed="0.003580"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.434899" elapsed="0.003971"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.434872" elapsed="0.004034"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.439834" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.439201" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.440370" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.440014" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.441283" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.440756" elapsed="0.000558"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.440489" elapsed="0.000862"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.439985" elapsed="0.001387"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.441953" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.441582" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.442308" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.442074" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.442878" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.442575" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.442390" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.442054" elapsed="0.000906"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:28.443137" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:28.444028" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.443695" elapsed="0.000366"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.444258" elapsed="0.003950"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:28.427155" elapsed="0.021183"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.448722" elapsed="0.000056"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:28.448470" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.448419" elapsed="0.000461"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:28.458356" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:28.449695" elapsed="0.008712"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:28.458489" elapsed="0.000090"/>
</return>
<msg time="2026-04-10T00:48:28.458852" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:28.400387" elapsed="0.058582"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:28.459452" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:28.459706" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:28.245359" elapsed="0.214383"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.460127" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.459832" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.459813" elapsed="0.000585"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:28.460447" 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="PASS" start="2026-04-10T00:48:28.241108" elapsed="0.219525"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.236838" elapsed="0.223842"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.236821" elapsed="0.223883"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:48:28.461391" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:48:28.461283" elapsed="0.000170"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.461513" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:28.461477" elapsed="0.000094"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.461265" elapsed="0.000330"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.461776" elapsed="0.000027"/>
</kw>
<msg time="2026-04-10T00:48:28.461931" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:28.460991" elapsed="0.000968"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.462725" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.462139" elapsed="0.000614"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.463374" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.462910" elapsed="0.000492"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.469720" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.469221" elapsed="0.000563"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.470662" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.470107" 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-04-10T00:48:28.491415" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:28.491594" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:28 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-inventory-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.728","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.475","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.475","active":true,"matchIndex":-1,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":0}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"760.5 μs","CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782108,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:28.491812" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:28.482365" elapsed="0.009555"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.470781" elapsed="0.021404"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.492394" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.492221" elapsed="0.000647"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.470762" elapsed="0.022132"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.498799" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-inventory-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.728","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.475","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.475","active":true,"matchIndex":-1,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":0}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"760.5 μs","CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782108,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.495131" elapsed="0.003840"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.494242" elapsed="0.004801"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.494222" elapsed="0.004881"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.504564" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.500675" elapsed="0.004034"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.499244" elapsed="0.005533"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.499206" elapsed="0.005624"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.506888" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.505792" elapsed="0.001184"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.508020" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.507266" elapsed="0.000880"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.509052" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.508523" elapsed="0.000575"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.508189" elapsed="0.000960"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.507236" elapsed="0.001947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.510629" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.509861" elapsed="0.000831"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.511340" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.510859" elapsed="0.000568"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.512374" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.511879" elapsed="0.000541"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.511464" elapsed="0.001006"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.510839" elapsed="0.001665"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:28.512750" elapsed="0.000627"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:28.514210" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.513704" elapsed="0.000568"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.514571" elapsed="0.002680"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:28.493504" elapsed="0.023961"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.517713" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:28.517564" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.517528" elapsed="0.000258"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:28.521786" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:28.517934" elapsed="0.003883"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:28.521871" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:48:28.522097" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:28.464757" elapsed="0.057367"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:28.522185" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:28.522337" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:28.463634" elapsed="0.058729"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.523878" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782108, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.523169" elapsed="0.000739"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:28.523959" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:48:28.524210" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782108, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:28.522705" elapsed="0.001546"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:28.524771" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.524473" elapsed="0.000333"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:28.525268" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.525010" elapsed="0.000291"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:28.525360" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:48:28.525567" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:28.235201" elapsed="0.290393"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:28.525664" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:28.525829" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:28.234436" elapsed="0.291430"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.526266" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.525970" elapsed="0.000377"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.526673" elapsed="0.000257"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.526377" elapsed="0.000602"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.527204" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.527004" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.525950" elapsed="0.001360"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:28.234238" elapsed="0.293101"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.530162" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.529786" elapsed="0.000404"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:28.530238" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:28.530394" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:28.529416" elapsed="0.001003"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.619973" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.619519" elapsed="0.000488"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.620974" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:28.620687" elapsed="0.000367">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:28.621170" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:28.620217" elapsed="0.000992"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.621792" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:28.621384" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.622126" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:28.622467" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:28.621982" elapsed="0.000511"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.622918" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.622671" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.624018" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.623716" elapsed="0.000369"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.624563" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.624261" elapsed="0.000332"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.624952" 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-04-10T00:48:28.625208" elapsed="0.000030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.625460" elapsed="0.000025"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:28.624797" elapsed="0.000726"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.624652" elapsed="0.000917"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:28.625620" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:28.625792" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:28.623367" elapsed="0.002450"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.623047" elapsed="0.002802"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.626026" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.625874" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.623021" elapsed="0.003080"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.626706" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.626245" elapsed="0.000490"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:28.626783" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:28.618838" elapsed="0.008071"/>
</kw>
<msg time="2026-04-10T00:48:28.626964" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:28.605497" elapsed="0.021557"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.639805" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.652470" elapsed="0.000104"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.665154" elapsed="0.000048"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.665959" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.666739" 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-04-10T00:48:28.667338" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.667183" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:28.667165" 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-04-10T00:48:28.667603" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.667827" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.668019" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:28.667112" elapsed="0.000982"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.666865" elapsed="0.001271"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.668929" elapsed="0.000043"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.669068" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:48:28.669350" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:28.598826" elapsed="0.070640"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.672565" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:28.672262" elapsed="0.000381">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:28.672832" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:28.671777" 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-04-10T00:48:28.673399" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.673007" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.674102" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.673801" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.673507" elapsed="0.000668"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.672957" elapsed="0.001255"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.677737" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:28.675121" elapsed="0.002661"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:28.677859" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:48:28.678177" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:28.670594" elapsed="0.007687"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.681187" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:28.680918" elapsed="0.000334">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:28.681449" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:28.680397" elapsed="0.001098"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:28.681929" elapsed="0.000080"/>
</return>
<status status="PASS" start="2026-04-10T00:48:28.681676" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.681624" elapsed="0.000514"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.682942" elapsed="0.000038"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.683722" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.683862" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T00:48:28.686157" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:28.679230" elapsed="0.007221"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.690731" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.690233" elapsed="0.000608"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.691973" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.691584" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:28.718610" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01scfk5e5snymj1gtu4c77d4crx0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:28.719579" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:28.720073" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:28.694654" elapsed="0.025482"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.692211" elapsed="0.028053"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.720979" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.720366" elapsed="0.000813"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.692156" elapsed="0.029107"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.730828" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.725359" elapsed="0.005796"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.724849" elapsed="0.006342"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.724800" elapsed="0.006416"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.733877" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.731525" elapsed="0.002398"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.731297" elapsed="0.002661"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.731278" elapsed="0.002704"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.734610" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.734187" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.734989" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.734736" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.735559" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.735235" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.735071" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.734716" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.736187" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.735825" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.736540" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.736304" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.737118" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.736800" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.736638" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.736284" elapsed="0.000922"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:28.737384" elapsed="0.000379"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:28.738256" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.737952" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.738459" elapsed="0.002478"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:28.723185" elapsed="0.017906"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.741443" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:28.741223" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.741172" elapsed="0.000448"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:28.750979" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:28.742388" elapsed="0.008641"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:28.751108" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:48:28.751443" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:28.687185" elapsed="0.064382"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:28.752043" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:28.752223" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:28.539380" elapsed="0.212870"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.752607" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.752337" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.752319" elapsed="0.000553"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:28.752907" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:28.535035" elapsed="0.218001"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.530490" elapsed="0.222591"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.530471" elapsed="0.222635"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:48:28.753746" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:28.753639" elapsed="0.000167"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.753867" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:28.753830" elapsed="0.000077"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.753620" elapsed="0.000309"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.754078" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:48:28.754198" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:28.753341" elapsed="0.000883"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.754793" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.754396" elapsed="0.000424"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.755442" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.754980" elapsed="0.000491"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.761318" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.760760" elapsed="0.000607"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.762101" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.761579" 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-04-10T00:48:28.782491" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:28.782646" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:28 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-inventory-config","LastIndex":-1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.737","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"546.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782108,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:28.782844" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:28.773781" elapsed="0.009168"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.762257" elapsed="0.020946"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.783396" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.783234" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.762234" elapsed="0.021516"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.788928" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-inventory-config","LastIndex":-1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.737","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"546.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782108,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.785992" elapsed="0.003171"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.785077" elapsed="0.004156"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.785059" elapsed="0.004228"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.794533" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.790662" elapsed="0.004036"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.789404" elapsed="0.005362"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.789378" elapsed="0.005441"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.796933" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.795743" elapsed="0.001277"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.798038" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.797303" elapsed="0.000862"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.799415" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.798711" elapsed="0.000825"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.798219" elapsed="0.001408"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.797270" elapsed="0.002406"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.801276" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.800458" elapsed="0.000879"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.802022" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.801504" elapsed="0.000609"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.803006" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.802486" elapsed="0.000566"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.802151" elapsed="0.000951"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.801484" elapsed="0.001653"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:28.803384" elapsed="0.000657"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:28.804967" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.804357" elapsed="0.000676"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.805322" elapsed="0.002508"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:28.784268" elapsed="0.023724"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.808193" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:28.808067" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.808047" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:28.811970" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:28.808408" elapsed="0.003591"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:28.812050" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:48:28.812211" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:28.756437" elapsed="0.055800"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:28.812332" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:28.812484" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:28.755704" elapsed="0.056806"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.813708" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782108, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.813221" elapsed="0.000515"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:28.813785" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:28.813957" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782108, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:28.812875" elapsed="0.001108"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:28.814339" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.814139" elapsed="0.000227"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:28.814735" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.814520" elapsed="0.000241"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:28.814807" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:28.814959" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:28.528721" elapsed="0.286263"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:28.815058" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:48:28.815215" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:28.527912" elapsed="0.287327"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.815560" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.815319" elapsed="0.000471"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.815959" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.815814" elapsed="0.000197"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.816177" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.816034" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.815302" elapsed="0.000947"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:28.527652" elapsed="0.288620"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:27.941568" elapsed="0.874737"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:48:28.816350" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:48:28.816615" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:48:28.816665" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:48:27.937500" elapsed="0.879189"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.817132" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:48:28.817208" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:28.816865" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.817511" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.817299" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.817281" elapsed="0.000323"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.819774" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:48:28.817741" elapsed="0.002081"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:48:28.820208" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.820021" elapsed="0.000213"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:48:28.820280" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:48:27.934940" elapsed="0.885494"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:48:27.934714" elapsed="0.885767"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.824940" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:28.824559" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.825429" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:28.825126" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:28.825498" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:28.825668" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:28.824172" elapsed="0.001521"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:48:28.825848" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.826495" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:28.826165" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.826951" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:28.826700" elapsed="0.000277"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.827358" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:28.827125" elapsed="0.000258"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.829852" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.829501" elapsed="0.000378"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:28.829925" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:28.830073" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:28.829155" elapsed="0.000943"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.916093" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.915642" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.916980" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:28.916699" elapsed="0.000361">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:28.917153" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:28.916297" elapsed="0.000883"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.917765" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:28.917346" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.918104" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:28.918263" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:28.917959" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.918713" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.918445" 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-04-10T00:48:28.919790" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.919517" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.920282" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:28.920000" 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-04-10T00:48:28.920663" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.920877" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.921054" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:28.920499" elapsed="0.000612"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.920360" elapsed="0.000781"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:28.921191" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:28.921352" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:28.919196" elapsed="0.002181"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.918886" elapsed="0.002523"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.921597" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.921433" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.918865" elapsed="0.002807"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.922249" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:28.921815" elapsed="0.000461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:28.922323" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:28.915008" elapsed="0.007439"/>
</kw>
<msg time="2026-04-10T00:48:28.922499" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:28.902352" elapsed="0.020251"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.935193" elapsed="0.000049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.947535" elapsed="0.000094"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.960061" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.960910" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.961715" 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-04-10T00:48:28.962322" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.962168" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:28.962148" 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-04-10T00:48:28.962651" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.962840" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.963026" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:28.962090" elapsed="0.001011"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.961847" elapsed="0.001329"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.963942" elapsed="0.000037"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.964066" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:48:28.964321" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:28.895914" elapsed="0.068517"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.967455" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:28.967155" elapsed="0.000400">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:28.967750" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:28.966635" elapsed="0.001159"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.968323" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:28.967926" elapsed="0.000466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.969082" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:28.968770" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.968431" elapsed="0.000724"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.967876" elapsed="0.001318"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.972599" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:28.970133" elapsed="0.002513"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:28.972728" elapsed="0.000070"/>
</return>
<msg time="2026-04-10T00:48:28.973056" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:28.965445" elapsed="0.007718"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:28.976340" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:28.976060" elapsed="0.000351">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:28.976618" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:28.975531" elapsed="0.001132"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:28.977055" elapsed="0.000082"/>
</return>
<status status="PASS" start="2026-04-10T00:48:28.976799" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.976747" elapsed="0.000502"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:28.978035" 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-04-10T00:48:28.978934" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:28.979045" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:48:28.981284" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:28.974163" elapsed="0.007286"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.985743" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.985149" elapsed="0.000698"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:28.987153" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:28.986769" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:29.014163" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0labrpeq6hvzrqou5cqfegtpr0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:29.015127" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:29.015627" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:28.989532" elapsed="0.026158"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.987379" elapsed="0.028504"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.016606" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.015988" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.987328" elapsed="0.029526"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.024007" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.019955" elapsed="0.004570"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.019613" elapsed="0.004985"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.019581" elapsed="0.005054"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.028534" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.025077" elapsed="0.003547"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.024748" elapsed="0.003927"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.024722" elapsed="0.003988"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.029652" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.028998" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.030172" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.029830" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.030742" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.030415" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.030253" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.029802" elapsed="0.001024"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.031368" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.031006" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.031737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.031485" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.032294" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.031976" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.031817" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.031466" elapsed="0.000925"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:29.032608" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:29.033498" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.033178" elapsed="0.000359"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.033732" elapsed="0.002404"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:29.018483" elapsed="0.017784"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.036631" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:29.036396" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.036346" elapsed="0.000435"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:29.046073" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:29.037583" elapsed="0.008540"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:29.046207" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:48:29.046539" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:28.982259" elapsed="0.064402"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:29.047128" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:29.047306" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:28.838428" elapsed="0.208906"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.047706" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.047420" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.047403" elapsed="0.000533"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:29.047971" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:28.834236" elapsed="0.213864"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:28.830167" elapsed="0.217977"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:28.830149" elapsed="0.218020"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:48:29.048803" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:29.048696" elapsed="0.000167"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.048924" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:29.048887" elapsed="0.000077"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.048679" elapsed="0.000307"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.049154" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:48:29.049277" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:29.048403" elapsed="0.000900"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.049891" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.049478" elapsed="0.000440"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.050597" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.050073" elapsed="0.000554"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.056250" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.055798" elapsed="0.000512"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.056948" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.056468" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:29.076936" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:29.077080" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:29 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.806","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"330.2 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782109,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:29.077285" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:29.068708" elapsed="0.008683"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.057062" elapsed="0.020825"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.078094" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.077923" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.057044" elapsed="0.021388"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.084785" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.806","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"330.2 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782109,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.080674" elapsed="0.004278"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.079757" elapsed="0.005246"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.079737" elapsed="0.005304"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.090349" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.086500" elapsed="0.004012"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.085125" elapsed="0.005643"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.085107" elapsed="0.005724"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.093164" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.091893" elapsed="0.001383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.094322" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.093625" elapsed="0.000824"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.095796" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.095015" elapsed="0.000850"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.094504" elapsed="0.001437"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.093536" elapsed="0.002510"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.098043" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.097247" elapsed="0.000857"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.098964" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.098274" elapsed="0.000778"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.100025" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.099426" elapsed="0.000662"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.099090" elapsed="0.001062"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.098254" elapsed="0.001943"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:29.100447" elapsed="0.000775"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:29.102235" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.101715" elapsed="0.000581"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.102599" elapsed="0.002636"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:29.078969" elapsed="0.026436"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.105628" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:29.105480" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.105461" elapsed="0.000238"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:29.109499" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:29.105847" elapsed="0.003683"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:29.109600" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:48:29.109807" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:29.051579" elapsed="0.058263"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:29.109920" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:48:29.110115" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:29.050842" elapsed="0.059299"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.111323" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782109, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.110842" elapsed="0.000512"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:29.111470" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:29.111685" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782109, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:29.110422" elapsed="0.001292"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:29.112076" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.111873" elapsed="0.000231"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:29.112460" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.112260" elapsed="0.000228"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:29.112535" elapsed="0.000126"/>
</return>
<msg time="2026-04-10T00:48:29.112790" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:28.828555" elapsed="0.284260"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:29.112873" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:48:29.113019" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:28.827825" elapsed="0.285219"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.113342" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.113125" elapsed="0.000464"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.113761" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.113613" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.113979" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.113837" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.113107" elapsed="0.000944"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:28.827657" elapsed="0.286418"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.116500" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.116167" elapsed="0.000361"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:29.116612" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:29.116764" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:29.115817" elapsed="0.000972"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.205137" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.204740" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:29.205999" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:29.205725" elapsed="0.000349">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:29.206170" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:29.205343" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.206765" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:29.206363" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:29.207142" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:29.207432" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:29.206995" elapsed="0.000529"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.207961" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.207708" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.209049" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.208787" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.209837" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.209259" elapsed="0.000611"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.210231" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.210437" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.210627" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:29.210081" elapsed="0.000605"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.209931" elapsed="0.000788"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:29.210768" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:48:29.210944" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:29.208409" elapsed="0.002560"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.208085" elapsed="0.002915"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.211174" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.211025" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.208062" elapsed="0.003188"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.211853" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.211393" elapsed="0.000488"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:29.211928" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:29.204085" elapsed="0.007968"/>
</kw>
<msg time="2026-04-10T00:48:29.212113" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:29.191413" elapsed="0.020794"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.225047" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.237802" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.250656" elapsed="0.000066"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.251522" elapsed="0.000070"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.252386" elapsed="0.000041"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.253132" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.252975" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:29.252955" 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-04-10T00:48:29.253380" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.253589" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.253779" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:29.252897" elapsed="0.000956"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.252646" elapsed="0.001250"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.254633" elapsed="0.000037"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.254755" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:48:29.255021" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:29.184961" elapsed="0.070167"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:29.258353" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:29.258026" elapsed="0.000409">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:29.258649" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:29.257508" elapsed="0.001200"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.259249" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.258849" elapsed="0.000467"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.259948" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.259647" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.259355" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.258796" elapsed="0.001264"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.263306" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:29.260933" elapsed="0.002419"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:29.263430" elapsed="0.000066"/>
</return>
<msg time="2026-04-10T00:48:29.263771" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:29.256219" elapsed="0.007658"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:29.266701" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:29.266435" elapsed="0.000332">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:29.266956" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:29.265995" elapsed="0.001006"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:29.267380" elapsed="0.000080"/>
</return>
<status status="PASS" start="2026-04-10T00:48:29.267133" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.267082" elapsed="0.000503"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.268336" 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-04-10T00:48:29.269264" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.269447" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:48:29.271716" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:29.264867" elapsed="0.006958"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.275913" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.275462" elapsed="0.000551"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.277264" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.276882" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:29.295620" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node013gawcwja405m14axcmgdzwrtx0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:29.296568" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:29.297036" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:29.279753" elapsed="0.017344"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.277487" elapsed="0.019738"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.297930" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.297324" elapsed="0.000774"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.277437" elapsed="0.020740"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.305516" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.301455" elapsed="0.004565"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.301116" elapsed="0.004957"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.301084" elapsed="0.005025"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.310144" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.306619" elapsed="0.003595"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.306228" elapsed="0.004039"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.306200" elapsed="0.004103"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.311282" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.310670" elapsed="0.000652"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.311844" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.311457" elapsed="0.000474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.312508" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.312194" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.311966" elapsed="0.000697"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.311430" elapsed="0.001258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.313241" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.312875" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.313622" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.313359" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.314172" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.313868" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.313705" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.313340" elapsed="0.000915"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:29.314433" elapsed="0.000382"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:29.315316" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.315018" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.315519" elapsed="0.002481"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:29.299957" elapsed="0.018169"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.318477" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:29.318257" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.318206" elapsed="0.000438"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:29.327908" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:29.319396" elapsed="0.008562"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:29.328039" elapsed="0.000070"/>
</return>
<msg time="2026-04-10T00:48:29.328374" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:29.272648" elapsed="0.055835"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:29.328967" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:29.329149" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:29.125486" elapsed="0.203692"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.329534" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.329270" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.329252" elapsed="0.000545"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:29.329831" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:29.121212" elapsed="0.208751"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.116859" elapsed="0.213148"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.116840" elapsed="0.213191"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:48:29.330690" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:29.330580" elapsed="0.000170"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.330812" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:29.330774" elapsed="0.000078"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.330537" elapsed="0.000338"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.331027" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:48:29.331149" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:29.330274" elapsed="0.000901"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.331751" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.331351" elapsed="0.000428"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.332402" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.331938" elapsed="0.000493"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.338250" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.337797" elapsed="0.000502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.338941" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.338473" elapsed="0.000514"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:29.359810" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:29.360044" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:29 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.797","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.203","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.204","active":true,"matchIndex":-1,"voting":true,"id":"member-3-shard-topology-config","nextIndex":0}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"732.5 μs","CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782109,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:29.360376" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:29.350159" elapsed="0.010376"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.339056" elapsed="0.021893"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.361290" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.361002" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.339037" elapsed="0.022802"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.369372" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.797","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.203","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.204","active":true,"matchIndex":-1,"voting":true,"id":"member-3-shard-topology-config","nextIndex":0}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"732.5 μs","CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782109,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.365264" elapsed="0.004300"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.363948" elapsed="0.005749"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.363918" elapsed="0.005867"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.375286" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.371465" elapsed="0.003970"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.369936" elapsed="0.005572"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.369905" elapsed="0.005680"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.377772" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.376572" elapsed="0.001290"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.378661" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.378113" elapsed="0.000638"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.379658" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.379127" elapsed="0.000579"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.378789" elapsed="0.000968"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.378083" elapsed="0.001851"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.381354" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.380603" elapsed="0.000836"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.382112" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.381637" elapsed="0.000562"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.383143" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.382640" elapsed="0.000551"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.382237" elapsed="0.001004"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.381617" elapsed="0.001659"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:29.383508" elapsed="0.000686"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:29.385067" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.384534" elapsed="0.000595"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.385445" elapsed="0.002603"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:29.362815" elapsed="0.025399"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.388423" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:29.388293" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.388273" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:29.392591" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:29.388663" elapsed="0.003959"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:29.392676" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:29.392898" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:29.333417" elapsed="0.059508"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:29.392985" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:48:29.393151" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:29.332664" elapsed="0.060514"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.394328" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782109, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.393829" elapsed="0.000529"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:29.394407" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:29.394694" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782109, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:29.393434" elapsed="0.001289"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:29.395091" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.394884" elapsed="0.000235"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:29.395481" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.395281" elapsed="0.000226"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:29.395569" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:29.395724" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:29.115160" elapsed="0.280589"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:29.395807" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:48:29.395956" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:29.114418" elapsed="0.281563"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.396289" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.396064" elapsed="0.000282"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.396593" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.396369" elapsed="0.000454"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.396995" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.396847" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.396046" elapsed="0.001044"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:29.114244" elapsed="0.282870"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.399590" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.399247" elapsed="0.000370"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:29.399663" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:29.399811" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:29.398845" elapsed="0.000991"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.488212" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.487799" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:29.489135" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:29.488874" elapsed="0.000337">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:29.489307" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:29.488419" elapsed="0.000913"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.489902" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:29.489498" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:29.490232" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:29.490386" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:29.490091" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.490829" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.490583" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.491896" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.491640" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.492443" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.492146" elapsed="0.000325"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.492846" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.493071" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.493252" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:29.492702" elapsed="0.000614"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.492537" elapsed="0.000812"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:29.493398" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:48:29.493581" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:29.491297" elapsed="0.002311"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.490974" elapsed="0.002666"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.493813" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.493665" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.490951" elapsed="0.002936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.494467" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.494029" elapsed="0.000465"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:29.494556" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:29.487128" elapsed="0.007555"/>
</kw>
<msg time="2026-04-10T00:48:29.494737" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:29.474310" elapsed="0.020543"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.507662" elapsed="0.000049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.520189" elapsed="0.000177"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.532972" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.533810" elapsed="0.000049"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.534644" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.535260" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.535101" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:29.535082" 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-04-10T00:48:29.535503" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.535708" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.535892" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:29.535024" elapsed="0.000943"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.534779" elapsed="0.001230"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.536777" elapsed="0.000037"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.536899" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:48:29.537166" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:29.467963" elapsed="0.069315"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:29.540478" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:29.540157" elapsed="0.000427">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:29.540780" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:29.539658" elapsed="0.001166"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.541356" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.540956" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.542100" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.541799" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.541463" elapsed="0.000708"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.540905" elapsed="0.001305"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.545472" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:29.542987" elapsed="0.002531"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:29.545621" elapsed="0.000067"/>
</return>
<msg time="2026-04-10T00:48:29.545947" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:29.538348" elapsed="0.007706"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:29.548954" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:29.548694" elapsed="0.000328">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:29.549213" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:29.548239" elapsed="0.001019"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:29.549681" elapsed="0.000079"/>
</return>
<status status="PASS" start="2026-04-10T00:48:29.549390" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.549339" elapsed="0.000532"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.550642" 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-04-10T00:48:29.551415" elapsed="0.000035"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.551523" elapsed="0.000151"/>
</return>
<msg time="2026-04-10T00:48:29.553919" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:29.546984" elapsed="0.007044"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.558027" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.557630" elapsed="0.000499"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.559299" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.558908" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:29.584957" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01scfk5e5snymj1gtu4c77d4crx0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:29.585950" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:29.586615" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:29.561839" elapsed="0.024842"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.559668" elapsed="0.027165"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.587597" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.586944" elapsed="0.000824"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.559502" elapsed="0.028346"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.595331" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.591858" elapsed="0.003815"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.591321" elapsed="0.004388"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.591273" elapsed="0.004461"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.598537" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.596105" elapsed="0.002504"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.595844" elapsed="0.002801"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.595817" elapsed="0.002852"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.599285" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.598879" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.599663" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.599406" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.600219" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.599911" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.599747" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.599386" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.600959" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.600516" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.601317" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.601078" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.601873" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.601571" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.601396" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.601059" elapsed="0.000896"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:29.602131" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:29.602979" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.602680" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.603180" elapsed="0.002498"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:29.589661" elapsed="0.016147"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.606166" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:29.605943" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.605889" elapsed="0.000428"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:29.615614" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:29.607080" elapsed="0.008587"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:29.615747" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:48:29.616123" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:29.554736" elapsed="0.061496"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:29.616735" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:29.616915" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:29.408296" elapsed="0.208645"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.617338" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.617031" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.617013" elapsed="0.000594"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:29.617641" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:29.404119" elapsed="0.213652"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.399904" elapsed="0.217910"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.399887" elapsed="0.217952"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:48:29.618465" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:29.618358" elapsed="0.000167"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.618604" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:29.618566" elapsed="0.000078"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.618341" elapsed="0.000325"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.618820" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:48:29.618938" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:29.618075" elapsed="0.000888"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.619568" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.619140" elapsed="0.000457"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.620245" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.619757" elapsed="0.000515"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.626190" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.625735" elapsed="0.000506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.626861" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.626397" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:29.646960" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:29.647172" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:29 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.805","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"548.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782109,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:29.647500" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:29.638703" elapsed="0.008991"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.626973" elapsed="0.021107"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.648377" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.648128" elapsed="0.000747"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.626955" elapsed="0.021958"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.656286" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.805","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"548.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782109,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.652137" elapsed="0.004323"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.650756" elapsed="0.005757"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.650729" elapsed="0.005839"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.660146" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.657561" elapsed="0.002686"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.656657" elapsed="0.003640"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.656638" elapsed="0.003697"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.661957" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.661160" elapsed="0.000858"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.662849" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.662187" elapsed="0.000805"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.663984" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.663435" elapsed="0.000597"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.663037" elapsed="0.001046"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.662167" elapsed="0.001951"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.666225" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.665106" elapsed="0.001210"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.667996" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.666582" elapsed="0.001569"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.669625" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.668733" elapsed="0.000963"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.668209" elapsed="0.001565"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.666533" elapsed="0.003296"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:29.670187" elapsed="0.000994"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:29.672639" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.671861" elapsed="0.000870"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.673155" elapsed="0.003877"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:29.649690" elapsed="0.027543"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.677454" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:29.677316" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.677296" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:29.681333" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:29.677711" elapsed="0.003652"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:29.681417" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:48:29.681636" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:29.621300" elapsed="0.060374"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:29.681737" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:29.681896" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:29.620486" elapsed="0.061436"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.683095" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782109, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.682599" elapsed="0.000525"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:29.683260" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:48:29.683443" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782109, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:29.682164" elapsed="0.001306"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:29.683901" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.683694" elapsed="0.000234"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:29.684283" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.684084" elapsed="0.000224"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:29.684354" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:29.684511" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:29.398204" elapsed="0.286333"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:29.684615" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:29.684771" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:29.397455" elapsed="0.287342"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.685106" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.684882" elapsed="0.000457"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.685512" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.685363" elapsed="0.000226"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.685776" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.685622" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.684864" elapsed="0.000989"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:29.397282" elapsed="0.288596"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:28.827433" elapsed="0.858479"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:48:29.685958" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:29.686168" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:48:29.686222" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:48:28.823440" elapsed="0.862806"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.686863" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:48:29.686943" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:29.686508" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.687256" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.687038" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.687021" elapsed="0.000313"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.689689" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:48:29.687472" elapsed="0.002268"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:48:29.690098" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.689910" elapsed="0.000213"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:48:29.690170" 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="PASS" start="2026-04-10T00:48:28.820879" elapsed="0.869473"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:48:28.820649" elapsed="0.869752"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.695104" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:29.694708" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.695685" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:29.695347" elapsed="0.000365"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:29.695758" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:48:29.695919" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:29.694241" elapsed="0.001703"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:48:29.696100" elapsed="0.000161"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.696778" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:29.696424" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.697207" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:29.696965" elapsed="0.000268"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.697652" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:29.697384" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.700291" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.699952" elapsed="0.000367"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:29.700366" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:29.700519" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:29.699601" elapsed="0.000965"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.800055" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.799049" elapsed="0.001078"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:29.801866" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:29.801313" elapsed="0.000709">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:29.802230" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:29.800514" elapsed="0.001769"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.803524" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:29.802682" elapsed="0.000946"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:29.804331" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:29.804672" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:29.804023" elapsed="0.000706"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.805657" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.805079" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.808095" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.807457" elapsed="0.000729"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.808637" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.808347" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.809011" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.809217" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.809393" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:29.808872" elapsed="0.000650"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.808723" elapsed="0.000846"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:29.809622" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:48:29.809795" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:29.806735" elapsed="0.003086"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.805926" elapsed="0.003927"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.810031" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.809879" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.805877" elapsed="0.004232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.810717" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.810257" elapsed="0.000488"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:29.810793" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:29.797305" elapsed="0.013612"/>
</kw>
<msg time="2026-04-10T00:48:29.810972" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:29.776204" elapsed="0.034877"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.823850" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.836485" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.849065" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.849873" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.850691" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.851257" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.851107" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:29.851091" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.851498" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.851704" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.851889" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:29.851041" elapsed="0.000922"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.850815" elapsed="0.001188"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.852745" elapsed="0.000070"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.852902" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:48:29.853131" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:29.769290" elapsed="0.083953"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:29.856245" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:29.855986" elapsed="0.000327">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:29.856505" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:29.855507" elapsed="0.001085"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.857130" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.856740" elapsed="0.000459"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.857845" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.857526" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.857240" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.856689" elapsed="0.001271"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.861229" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:29.858844" elapsed="0.002434"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:29.861357" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:48:29.861700" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:29.854266" elapsed="0.007543"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:29.864795" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:29.864525" elapsed="0.000336">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:29.865054" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:29.864050" elapsed="0.001050"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:29.865492" elapsed="0.000097"/>
</return>
<status status="PASS" start="2026-04-10T00:48:29.865238" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.865182" elapsed="0.000521"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.866483" elapsed="0.000040"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.867355" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.867467" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:48:29.869721" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:29.862910" elapsed="0.006921"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.873779" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.873336" elapsed="0.000547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.875326" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.874907" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:29.900841" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0labrpeq6hvzrqou5cqfegtpr0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:29.901935" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:29.902387" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:29.877955" elapsed="0.024494"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.875741" elapsed="0.026866"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.903280" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.902713" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.875691" elapsed="0.027839"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.911819" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.907713" elapsed="0.004430"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.907134" elapsed="0.005045"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.907068" elapsed="0.005136"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.914914" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.912514" elapsed="0.002449"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.912285" elapsed="0.002713"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.912266" elapsed="0.002756"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.915706" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.915224" elapsed="0.000510"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.916073" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.915830" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.916665" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.916318" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.916155" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.915810" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.917350" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.916933" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.917739" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.917472" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.918296" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.917985" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.917822" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.917452" elapsed="0.000928"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:29.918572" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:29.919424" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.919119" elapsed="0.000332"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.919644" elapsed="0.002388"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:29.905379" elapsed="0.016789"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.922566" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:29.922310" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.922258" elapsed="0.000462"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:29.932019" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:29.923445" elapsed="0.008623"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:29.932146" elapsed="0.000066"/>
</return>
<msg time="2026-04-10T00:48:29.932496" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:29.870624" elapsed="0.062097"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:29.933182" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:29.933361" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:29.710447" elapsed="0.222940"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.933754" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.933473" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.933455" elapsed="0.000524"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:29.934014" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:29.706074" elapsed="0.228068"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.700641" elapsed="0.233545"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.700622" elapsed="0.233588"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:48:29.934845" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:29.934739" elapsed="0.000166"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.934965" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:29.934929" elapsed="0.000074"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.934721" elapsed="0.000304"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.935174" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:48:29.935292" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:29.934441" elapsed="0.000876"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.935875" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.935485" elapsed="0.000417"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.936577" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.936066" elapsed="0.000541"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.942408" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.941963" elapsed="0.000492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.943064" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.942627" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:29.962016" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:29.962364" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:29 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-config","LastIndex":74,"RaftState":"Follower","LastApplied":74,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:45:27.706","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"590.5 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":10671},"timestamp":1775782109,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:29.962898" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:29.954433" elapsed="0.008729"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.943176" elapsed="0.020656"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.964319" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.963976" elapsed="0.000896"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.943158" elapsed="0.021751"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.971952" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-config","LastIndex":74,"RaftState":"Follower","LastApplied":74,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:45:27.706","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"590.5 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":10671},"timestamp":1775782109,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.967962" elapsed="0.004225"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.966710" elapsed="0.005548"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.966682" elapsed="0.005630"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.976979" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:29.973687" elapsed="0.003415"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.972430" elapsed="0.004722"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.972403" elapsed="0.004790"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.978704" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.977876" elapsed="0.000888"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.979402" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.978931" elapsed="0.000558"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.980468" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.979967" elapsed="0.000546"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.979526" elapsed="0.001056"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.978911" elapsed="0.001707"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.981989" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.981238" elapsed="0.000812"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.982885" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.982234" elapsed="0.000747"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.983909" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:29.983366" elapsed="0.000589"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.983018" elapsed="0.000987"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.982211" elapsed="0.001830"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:29.984270" elapsed="0.000753"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:29.985990" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.985462" elapsed="0.000588"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.986336" elapsed="0.002573"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:29.965666" elapsed="0.023415"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:29.989294" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:29.989162" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.989141" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:29.993321" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:29.989727" elapsed="0.003627"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:29.993411" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:48:29.993612" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:29.937561" elapsed="0.056078"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:29.993708" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:29.993861" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:29.936821" elapsed="0.057065"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:29.995444" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782109, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:29.994885" elapsed="0.000600"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:29.995658" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:48:29.995861" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782109, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:29.994155" elapsed="0.001733"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:29.996267" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 74, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.996047" elapsed="0.000249"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:29.996699" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.996473" elapsed="0.000252"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:29.996783" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:29.996948" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:29.698916" elapsed="0.298058"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:29.997033" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:48:29.997182" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:29.698165" elapsed="0.299041"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:29.997735" elapsed="0.000201"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:29.997299" elapsed="0.000674"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.998176" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.997999" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:29.998626" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:29.998278" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:29.997278" elapsed="0.001425"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:29.697952" elapsed="0.300777"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.001443" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.001057" elapsed="0.000415"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:30.001519" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:48:30.001695" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:30.000705" elapsed="0.001017"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.092822" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.092353" elapsed="0.000505"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:30.093823" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:30.093450" elapsed="0.000454">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:30.094004" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:30.093044" elapsed="0.000985"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.094640" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:30.094207" elapsed="0.000462"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:30.094984" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:30.095151" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:30.094834" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.095722" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.095429" 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-04-10T00:48:30.096880" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.096613" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.097429" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.097098" elapsed="0.000359"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.097837" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.098059" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.098241" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:30.097691" elapsed="0.000610"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.097513" elapsed="0.001010"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:30.098603" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:48:30.098784" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:30.096224" elapsed="0.002587"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.095856" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.099030" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.098873" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.095829" elapsed="0.003282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.099770" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.099261" elapsed="0.000538"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:30.099850" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:30.091517" elapsed="0.008464"/>
</kw>
<msg time="2026-04-10T00:48:30.100040" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:30.078122" elapsed="0.022048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.113824" elapsed="0.000091"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.127384" elapsed="0.000092"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.141185" elapsed="0.000086"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.142125" 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-04-10T00:48:30.142924" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.143671" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.143495" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:30.143474" elapsed="0.000286"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.143926" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.144117" 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-04-10T00:48:30.144332" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:30.143413" elapsed="0.001004"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.143148" elapsed="0.001314"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.145250" elapsed="0.000038"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.145378" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:48:30.145677" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:30.071376" elapsed="0.074412"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:30.149022" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:30.148671" elapsed="0.000430">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:30.149306" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:30.148088" elapsed="0.001264"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.149922" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.149490" elapsed="0.000501"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.150788" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.150321" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.150032" elapsed="0.000831"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.149436" elapsed="0.001467"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.154192" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:30.151665" elapsed="0.002579"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:30.154326" elapsed="0.000069"/>
</return>
<msg time="2026-04-10T00:48:30.154864" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:30.146876" elapsed="0.008094"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:30.157773" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:30.157467" elapsed="0.000372">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:30.158035" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:30.157014" elapsed="0.001068"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:30.158470" elapsed="0.000133"/>
</return>
<status status="PASS" start="2026-04-10T00:48:30.158217" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.158163" elapsed="0.000555"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.159463" 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-04-10T00:48:30.160293" elapsed="0.000039"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.160471" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:48:30.162825" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:30.155830" elapsed="0.007106"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.167023" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.166460" elapsed="0.000668"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.168259" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.167867" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:30.185859" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node013gawcwja405m14axcmgdzwrtx0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:30.186795" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:30.187242" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:30.170768" elapsed="0.016533"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.168489" elapsed="0.018956"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.188160" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.187605" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.168437" elapsed="0.019966"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.196251" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.192247" elapsed="0.004553"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.191774" elapsed="0.005080"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.191729" elapsed="0.005162"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.200860" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.197342" elapsed="0.003586"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.197008" elapsed="0.003971"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.196981" elapsed="0.004033"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.202015" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.201298" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.202536" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.202186" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.203413" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.202919" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.202679" elapsed="0.000828"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.202158" elapsed="0.001410"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.204317" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.203841" elapsed="0.000503"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.204686" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.204434" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.205230" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.204930" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.204767" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.204416" elapsed="0.000898"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:30.205486" elapsed="0.000381"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:30.206347" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.206054" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.206561" elapsed="0.002437"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:30.190081" elapsed="0.019043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.209472" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:30.209254" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.209203" elapsed="0.000440"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:30.218889" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:30.210379" elapsed="0.008558"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:30.219014" elapsed="0.000069"/>
</return>
<msg time="2026-04-10T00:48:30.219340" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:30.163647" elapsed="0.055798"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:30.219922" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:30.220101" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:30.010749" elapsed="0.209378"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.220459" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.220217" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.220197" elapsed="0.000497"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:30.220729" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:30.006281" elapsed="0.214576"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.001793" elapsed="0.219109"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.001774" elapsed="0.219152"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:48:30.221533" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-10T00:48:30.221428" elapsed="0.000181"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.221670" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:30.221633" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.221411" elapsed="0.000320"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.221877" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:48:30.221997" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:30.221159" elapsed="0.000863"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.222582" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.222190" elapsed="0.000419"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.223259" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.222799" elapsed="0.000487"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.228903" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.228448" elapsed="0.000502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.229535" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.229107" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:30.250497" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:30.250659" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:30 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":21,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-config","LastIndex":74,"RaftState":"Leader","LastApplied":74,"LastCommittedTransactionTime":"2026-04-10 00:45:28.914","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:45:27.691","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.152","active":true,"matchIndex":74,"voting":true,"id":"member-1-shard-default-config","nextIndex":75},{"timeSinceLastActivity":"00:00:00.153","active":true,"matchIndex":74,"voting":true,"id":"member-3-shard-default-config","nextIndex":75}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"853.0 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":3,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":18,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":10671},"timestamp":1775782110,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:30.250857" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:30.240680" elapsed="0.010281"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.229662" elapsed="0.021551"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.251403" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.251245" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.229644" elapsed="0.022120"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.257117" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":21,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-config","LastIndex":74,"RaftState":"Leader","LastApplied":74,"LastCommittedTransactionTime":"2026-04-10 00:45:28.914","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:45:27.691","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.152","active":true,"matchIndex":74,"voting":true,"id":"member-1-shard-default-config","nextIndex":75},{"timeSinceLastActivity":"00:00:00.153","active":true,"matchIndex":74,"voting":true,"id":"member-3-shard-default-config","nextIndex":75}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"853.0 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":3,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":18,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":10671},"timestamp":1775782110,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.253891" elapsed="0.003391"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.253018" elapsed="0.004334"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.252999" elapsed="0.004406"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.262459" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.258820" elapsed="0.003807"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.257522" elapsed="0.005177"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.257496" elapsed="0.005256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.264868" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.263775" elapsed="0.001178"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.265912" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.265181" elapsed="0.000858"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.267018" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.266478" elapsed="0.000587"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.266092" elapsed="0.001024"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.265153" elapsed="0.001998"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.268651" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.267884" elapsed="0.000828"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.269345" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.268880" elapsed="0.000552"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.270341" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.269838" elapsed="0.000550"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.269470" elapsed="0.000968"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.268859" elapsed="0.001615"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:30.270728" elapsed="0.000623"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:30.272248" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.271743" elapsed="0.000565"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.272606" elapsed="0.002517"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:30.252307" elapsed="0.022983"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.275497" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:30.275367" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.275349" elapsed="0.000372"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:30.279407" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:30.275870" elapsed="0.003566"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:30.279488" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:48:30.279875" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:30.224249" elapsed="0.055654"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:30.279963" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:48:30.280116" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:30.223501" elapsed="0.056641"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.281236" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782110, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.280755" elapsed="0.000509"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:30.281312" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:30.281505" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782110, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:30.280381" elapsed="0.001179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:30.281924" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 74, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 3, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.281721" elapsed="0.000230"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:30.282303" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.282105" elapsed="0.000224"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:30.282375" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:30.282527" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:30.000046" elapsed="0.282522"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:30.282627" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:48:30.282778" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:29.999122" elapsed="0.283680"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.283100" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.282883" elapsed="0.000274"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.283387" elapsed="0.000258"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.283180" elapsed="0.000504"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.283855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.283708" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.282866" elapsed="0.001064"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:29.998914" elapsed="0.285040"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.286344" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.286020" elapsed="0.000351"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:30.286417" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:30.286581" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:30.285674" elapsed="0.000933"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.373182" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.372777" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:30.374144" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:30.373839" elapsed="0.000381">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:30.374316" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:30.373391" elapsed="0.000950"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.374909" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:30.374507" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:30.375239" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:30.375402" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:30.375097" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.375857" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.375610" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.376894" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.376639" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.377366" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.377099" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.377739" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.377945" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.378120" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:30.377600" elapsed="0.000577"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.377445" elapsed="0.000766"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:30.378259" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:48:30.378424" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:30.376303" elapsed="0.002147"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.375981" elapsed="0.002502"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.378669" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.378507" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.375957" elapsed="0.002789"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.379328" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.378888" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:30.379405" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:30.372100" elapsed="0.007483"/>
</kw>
<msg time="2026-04-10T00:48:30.379640" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:30.359257" elapsed="0.020471"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.392261" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.404668" elapsed="0.000104"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.417093" elapsed="0.000063"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.417981" elapsed="0.000041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.418827" 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-04-10T00:48:30.419462" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.419306" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:30.419286" elapsed="0.000279"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.419730" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.419915" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.420100" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:30.419226" elapsed="0.000949"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.418962" elapsed="0.001259"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.420972" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.421095" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:48:30.421364" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:30.352600" elapsed="0.068876"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:30.424686" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:30.424362" elapsed="0.000402">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:30.424957" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:30.423864" elapsed="0.001137"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.425534" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.425133" elapsed="0.000486"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.426251" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.425949" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.425659" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.425081" elapsed="0.001280"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.429667" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:30.427264" elapsed="0.002449"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:30.429790" elapsed="0.000066"/>
</return>
<msg time="2026-04-10T00:48:30.430111" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:30.422531" elapsed="0.007687"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:30.433199" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:30.432943" elapsed="0.000323">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:30.433459" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:30.432489" elapsed="0.001015"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:30.433904" elapsed="0.000082"/>
</return>
<status status="PASS" start="2026-04-10T00:48:30.433654" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.433602" elapsed="0.000493"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.434950" elapsed="0.000038"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.435734" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.435844" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:48:30.439754" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:30.431339" elapsed="0.008531"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.444158" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.443708" elapsed="0.000573"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.445447" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.445048" elapsed="0.000514"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:30.472336" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01scfk5e5snymj1gtu4c77d4crx0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:30.473322" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:30.473881" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:30.448157" elapsed="0.025786"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.445706" elapsed="0.028376"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.474831" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.474189" elapsed="0.000812"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.445651" elapsed="0.029428"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.483005" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.478781" elapsed="0.004716"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.478408" elapsed="0.005200"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.478375" elapsed="0.005273"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.487649" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.484119" elapsed="0.003603"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.483770" elapsed="0.004005"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.483742" elapsed="0.004069"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.488953" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.488119" elapsed="0.000875"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.489565" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.489131" elapsed="0.000524"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.490362" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.489929" elapsed="0.000462"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.489690" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.489103" elapsed="0.001349"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.491038" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.490663" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.491397" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.491160" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.492002" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.491664" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.491482" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.491141" elapsed="0.000947"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:30.492275" elapsed="0.000404"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:30.493239" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.492907" elapsed="0.000360"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.493446" elapsed="0.002399"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:30.476812" elapsed="0.019163"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.496330" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:30.496108" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.496057" elapsed="0.000425"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:30.505978" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:30.497253" elapsed="0.008779"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:30.506118" elapsed="0.000075"/>
</return>
<msg time="2026-04-10T00:48:30.506461" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:30.440700" elapsed="0.065885"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:30.507055" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:30.507233" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:30.294984" elapsed="0.212276"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.507733" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.507350" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.507332" elapsed="0.000638"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:30.508004" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:30.290845" elapsed="0.217284"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.286675" elapsed="0.221498"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.286657" elapsed="0.221540"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:48:30.508844" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T00:48:30.508736" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.508987" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:30.508949" elapsed="0.000078"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.508718" elapsed="0.000332"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.509209" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:48:30.509330" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:30.508431" elapsed="0.000925"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.509960" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.509556" elapsed="0.000430"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.510621" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.510143" elapsed="0.000505"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.516425" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.515979" elapsed="0.000495"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.517107" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.516647" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:30.537604" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:30.537820" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:30 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-config","LastIndex":74,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":74,"LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:45:27.707","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"667.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":10671},"timestamp":1775782110,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:30.538127" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:30.528808" elapsed="0.009481"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.517224" elapsed="0.021477"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.539015" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.538752" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.517205" elapsed="0.022399"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.547215" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-config","LastIndex":74,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":74,"LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:45:27.707","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"667.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":10671},"timestamp":1775782110,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.543034" elapsed="0.004436"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.541676" elapsed="0.005895"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.541644" elapsed="0.006001"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.553251" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.549331" elapsed="0.004077"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.547781" elapsed="0.005703"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.547751" elapsed="0.005812"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.555801" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.554584" elapsed="0.001311"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.556813" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.556225" elapsed="0.000681"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.557829" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.557284" elapsed="0.000595"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.556944" elapsed="0.000987"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.556192" elapsed="0.001776"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.559415" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.558622" elapsed="0.000859"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.560236" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.559682" elapsed="0.000647"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.561284" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.560781" elapsed="0.000550"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.560369" elapsed="0.001012"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.559659" elapsed="0.001757"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:30.561676" elapsed="0.000629"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:30.563151" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.562634" elapsed="0.000580"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.563500" elapsed="0.002864"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:30.540437" elapsed="0.026156"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.566852" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:30.566688" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.566665" elapsed="0.000281"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:30.571138" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:30.567102" elapsed="0.004066"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:30.571220" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:48:30.571387" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:30.511619" elapsed="0.059795"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:30.571471" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:48:30.571661" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:30.510864" elapsed="0.060824"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.572854" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782110, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:30.572283" elapsed="0.000600"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:30.573003" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:30.573185" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782110, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:30.571926" elapsed="0.001286"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:30.573591" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 74, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.573371" elapsed="0.000249"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:30.573980" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.573780" elapsed="0.000227"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:30.574054" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:30.574208" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:30.285030" elapsed="0.289202"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:30.574289" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:48:30.574436" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:30.284296" elapsed="0.290165"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.574775" elapsed="0.000191"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:30.574556" elapsed="0.000447"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.575175" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.575028" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.575400" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.575255" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.574524" elapsed="0.000949"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:30.284128" elapsed="0.291369"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:29.697733" elapsed="0.877832"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:48:30.575612" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:48:30.575814" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:48:30.575860" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:48:29.693447" elapsed="0.882437"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.576334" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:48:30.576412" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:30.576061" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.576760" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.576506" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.576487" elapsed="0.000350"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.579011" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:48:30.576975" elapsed="0.002084"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:48:30.579412" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.579225" elapsed="0.000212"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:48:30.579521" elapsed="0.000056"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:48:29.690780" elapsed="0.888926"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:48:29.690511" elapsed="0.889242"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:48:27.934575" elapsed="2.645208"/>
</for>
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:48:27.934122" elapsed="2.645717"/>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:48:22.407309" elapsed="8.172640"/>
</kw>
<kw name="Set DPN And Flow Count In Json Add" owner="BulkomaticKeywords">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:30.580871" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_add_bulk_flow_config.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_add_bulk_flow_config.json&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:30.581057" level="INFO">${body} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true",...</msg>
<var>${body}</var>
<arg>/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/openflowplugin/${json_config}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:30.580716" elapsed="0.000368"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.581527" level="INFO">${get_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.581265" elapsed="0.000304"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.582038" level="INFO">${put_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "${dpn_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.581747" elapsed="0.000317"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:48:30.582624" level="INFO">${str} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true",...</msg>
<var>${str}</var>
<arg>${body}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.582243" elapsed="0.000408"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.583089" level="INFO">${get_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "1000"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.582834" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.583630" level="INFO">${put_string} = "sal-bulk-flow:flows-per-dpn" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.583294" elapsed="0.000362"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:48:30.584185" level="INFO">${json_body_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true"...</msg>
<var>${json_body_add}</var>
<arg>${str}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.583833" elapsed="0.000379"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.584658" level="INFO">${get_string} = "sal-bulk-flow:batch-size" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:batch-size" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.584391" elapsed="0.000293"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.585145" level="INFO">${put_string} = "sal-bulk-flow:batch-size" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:batch-size" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.584857" elapsed="0.000314"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:48:30.585713" level="INFO">${json_body_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "t...</msg>
<var>${json_body_add}</var>
<arg>${json_body_add}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.585347" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.586161" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${json_body_add}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.585917" elapsed="0.000291"/>
</kw>
<return>
<value>${json_body_add}</value>
<status status="PASS" start="2026-04-10T00:48:30.586250" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:30.586408" level="INFO">${temp_json_config_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "t...</msg>
<var>${temp_json_config_add}</var>
<arg>${orig_json_config_add}</arg>
<arg>${switch_count}</arg>
<arg>${flow_count_per_switch}</arg>
<doc>Set new DPN count and flows count per DPN in the Bulkomatic Add json file.</doc>
<status status="PASS" start="2026-04-10T00:48:30.580233" elapsed="0.006202"/>
</kw>
<kw name="Set DPN And Flow Count In Json Get" owner="BulkomaticKeywords">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:30.587263" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_get_bulk_flow_config.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_get_bulk_flow_config.json&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:30.587409" level="INFO">${body} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-t...</msg>
<var>${body}</var>
<arg>/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/openflowplugin/${json_config}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:30.587122" elapsed="0.000314"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.587895" level="INFO">${get_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.587639" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.588425" level="INFO">${put_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "${dpn_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.588132" elapsed="0.000320"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:48:30.588907" level="INFO">${str} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-t...</msg>
<var>${str}</var>
<arg>${body}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.588644" elapsed="0.000290"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.589366" level="INFO">${get_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "1000"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.589113" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.589874" level="INFO">${put_string} = "sal-bulk-flow:flows-per-dpn" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.589583" elapsed="0.000317"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:48:30.590339" level="INFO">${json_body_get} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-...</msg>
<var>${json_body_get}</var>
<arg>${str}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.590078" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.590794" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${json_body_get}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.590538" elapsed="0.000302"/>
</kw>
<return>
<value>${json_body_get}</value>
<status status="PASS" start="2026-04-10T00:48:30.590882" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:30.591039" level="INFO">${temp_json_config_get} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-...</msg>
<var>${temp_json_config_get}</var>
<arg>${orig_json_config_get}</arg>
<arg>${switch_count}</arg>
<arg>${flow_count_after_add}</arg>
<doc>Set new DPN count and flows count per DPN in the Bulkomatic Get json file.</doc>
<status status="PASS" start="2026-04-10T00:48:30.586713" elapsed="0.004352"/>
</kw>
<kw name="Set DPN And Flow Count In Json Del" owner="BulkomaticKeywords">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:30.591957" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_del_bulk_flow_config.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_del_bulk_flow_config.json&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:30.592084" level="INFO">${body} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true"...</msg>
<var>${body}</var>
<arg>/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/openflowplugin/${json_config}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:30.591815" elapsed="0.000296"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.592554" level="INFO">${get_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.592285" elapsed="0.000297"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.593049" level="INFO">${put_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "${dpn_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.592755" elapsed="0.000321"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:48:30.593511" level="INFO">${str} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true"...</msg>
<var>${str}</var>
<arg>${body}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.593251" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.594017" level="INFO">${get_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "1000"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.593735" elapsed="0.000309"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.594719" level="INFO">${put_string} = "sal-bulk-flow:flows-per-dpn" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.594218" elapsed="0.000528"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:48:30.595228" level="INFO">${json_body_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true...</msg>
<var>${json_body_del}</var>
<arg>${str}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.594927" elapsed="0.000329"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.595716" level="INFO">${get_string} = "sal-bulk-flow:batch-size" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:batch-size" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.595434" elapsed="0.000308"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.596203" level="INFO">${put_string} = "sal-bulk-flow:batch-size" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:batch-size" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:30.595914" elapsed="0.000317"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:48:30.596770" level="INFO">${json_body_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "...</msg>
<var>${json_body_del}</var>
<arg>${json_body_del}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.596479" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.597216" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${json_body_del}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.596973" elapsed="0.000289"/>
</kw>
<return>
<value>${json_body_del}</value>
<status status="PASS" start="2026-04-10T00:48:30.597304" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:30.597462" level="INFO">${temp_json_config_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "...</msg>
<var>${temp_json_config_del}</var>
<arg>${orig_json_config_del}</arg>
<arg>${switch_count}</arg>
<arg>${flow_count_per_switch}</arg>
<doc>Set new DPN count and flows count per DPN in the Bulkomatic Del json file.</doc>
<status status="PASS" start="2026-04-10T00:48:30.591373" elapsed="0.006115"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.598017" level="INFO">${temp_json_config_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "t...</msg>
<arg>${temp_json_config_add}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:30.597694" elapsed="0.000367"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.598585" level="INFO">${temp_json_config_get} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-...</msg>
<arg>${temp_json_config_get}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:30.598240" elapsed="0.000391"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.599161" level="INFO">${temp_json_config_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "...</msg>
<arg>${temp_json_config_del}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:30.598813" elapsed="0.000406"/>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:48:21.852565" elapsed="8.746777"/>
</test>
<test id="s1-s1-t2" name="Get Inventory Follower and Leader Before Cluster Restart" line="48">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:48:30.602824" elapsed="0.000255"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:48:30.602537" elapsed="0.000599"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.604155" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:30.604045" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.604026" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.609183" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:30.609078" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.609060" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.610242" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:30.609866" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.610747" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:30.610429" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:30.610834" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:30.610995" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:30.609478" elapsed="0.001542"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.616517" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:30.616411" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.616392" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.617755" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:30.617649" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.617632" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:30.618265" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.617966" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:30.618791" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:30.618507" elapsed="0.000311"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:30.680719" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:30.619330" elapsed="0.061502"/>
</kw>
<msg time="2026-04-10T00:48:30.681001" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:30.681048" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:30.618985" elapsed="0.062100"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:30.781648" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "G "e "t "[C "I "n "v "e "n "t "o "r "y "[C "F "o "l "l "o "w "e "r "[78C[C "[A[78Ca
 "n "d "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:30.681683" elapsed="0.100105"/>
</kw>
<msg time="2026-04-10T00:48:30.781954" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:30.782001" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:30.681272" elapsed="0.100767"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.782370" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.782125" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.782104" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.782944" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "G "e "t "[C "I "n "v "e "n "t "o "r "y "[C "F "o "l "l "o "w "e "r "[78C[C "[A[78Ca
 "n "d "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.782634" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.783356" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.783104" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.783086" elapsed="0.000350"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:30.783471" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:30.784965" elapsed="0.000982"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.786283" elapsed="0.000614"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:30.787197" elapsed="0.000443"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:30.784323" elapsed="0.003435"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:30.783777" elapsed="0.004061"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:30.617325" elapsed="0.170616"/>
</kw>
<msg time="2026-04-10T00:48:30.788048" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:30.788094" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:30.616754" elapsed="0.171379"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:30.788321" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:48:30.788212" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.788193" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.788841" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.789182" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.789300" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:30.616073" elapsed="0.173343"/>
</kw>
<msg time="2026-04-10T00:48:30.789513" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:30.789575" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:30.611390" elapsed="0.178224"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.789955" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.789693" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.789675" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:30.611246" elapsed="0.178812"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.795805" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:30.795691" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.795670" 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-04-10T00:48:30.797079" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:30.796971" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.796954" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:30.797610" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.797292" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:30.798010" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:30.797797" elapsed="0.000238"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:30.862337" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:30.798537" elapsed="0.063912"/>
</kw>
<msg time="2026-04-10T00:48:30.862641" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:30.862689" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:30.798195" elapsed="0.064532"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:30.978526" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "G "e "t "[C "I "n "v "e "n "t "o "r "y "[C "F "o "l "l "o "w "e "r "[78C[C "[A[78Ca
 "n "d "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:30.863261" elapsed="0.115416"/>
</kw>
<msg time="2026-04-10T00:48:30.978840" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:30.978886" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:30.862908" elapsed="0.116015"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.979248" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.979009" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.978987" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:30.979830" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "G "e "t "[C "I "n "v "e "n "t "o "r "y "[C "F "o "l "l "o "w "e "r "[78C[C "[A[78Ca
 "n "d "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:30.979494" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.980205" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.979987" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.979969" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:30.980317" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:30.981798" elapsed="0.000786"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.983003" elapsed="0.000599"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:30.983951" 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-04-10T00:48:30.981154" elapsed="0.003366"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:30.980618" elapsed="0.004001"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:30.796670" elapsed="0.188076"/>
</kw>
<msg time="2026-04-10T00:48:30.984846" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:30.984908" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:30.796059" elapsed="0.188902"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:30.985201" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:48:30.985063" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.985038" 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 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.985838" elapsed="0.000032"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.986269" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.986358" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:30.795206" elapsed="0.191292"/>
</kw>
<msg time="2026-04-10T00:48:30.986637" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:30.986694" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:30.790333" elapsed="0.196410"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:30.987162" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:30.986841" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.986819" elapsed="0.000440"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:30.790188" elapsed="0.197138"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.995365" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:30.995187" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.995153" elapsed="0.000323"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:30.997236" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:30.997092" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:30.997069" elapsed="0.000259"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:30.997933" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:30.997525" elapsed="0.000444"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:30.998450" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:30.998182" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:31.059984" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:30.999224" elapsed="0.060979"/>
</kw>
<msg time="2026-04-10T00:48:31.060456" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:31.060504" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:30.998715" elapsed="0.061854"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:31.156354" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "G "e "t "[C "I "n "v "e "n "t "o "r "y "[C "F "o "l "l "o "w "e "r "[78C[C "[A[78Ca
 "n "d "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:31.061261" elapsed="0.095522"/>
</kw>
<msg time="2026-04-10T00:48:31.157036" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:31.157085" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:31.060830" elapsed="0.096308"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.157661" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.157266" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.157229" elapsed="0.000532"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.158382" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "G "e "t "[C "I "n "v "e "n "t "o "r "y "[C "F "o "l "l "o "w "e "r "[78C[C "[A[78Ca
 "n "d "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.157959" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.158790" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.158565" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.158527" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:31.158905" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:31.160508" elapsed="0.000842"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:31.161658" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:31.162401" elapsed="0.000389"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:31.159836" elapsed="0.003058"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:31.159237" elapsed="0.003721"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:30.996701" elapsed="0.166358"/>
</kw>
<msg time="2026-04-10T00:48:31.163157" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:31.163201" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:30.995770" elapsed="0.167470"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:31.163427" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:48:31.163319" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.163301" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.163946" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.164311" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.164384" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:30.994522" elapsed="0.169972"/>
</kw>
<msg time="2026-04-10T00:48:31.164618" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:31.164663" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:30.987718" elapsed="0.176982"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.165031" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.164778" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.164761" elapsed="0.000348"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:30.987490" elapsed="0.177642"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:30.611074" elapsed="0.554094"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:48:30.608721" elapsed="0.556509"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:48:30.603754" elapsed="0.561572"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:30.603294" elapsed="0.562081"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:48:30.600418" elapsed="0.565014"/>
</kw>
<kw name="Get InventoryConfig Shard Status" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.172928" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:31.172518" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.173427" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:31.173117" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:31.173498" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:31.173671" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:31.172142" elapsed="0.001554"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:48:31.173852" elapsed="0.000173"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.174520" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:31.174186" elapsed="0.000379"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.174964" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:31.174727" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.175372" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:31.175139" elapsed="0.000258"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.177865" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.177565" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:31.177938" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:31.178087" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:31.177200" elapsed="0.000911"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.252617" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.252211" elapsed="0.000435"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:31.253412" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:31.253152" elapsed="0.000339">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:31.253602" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:31.252815" elapsed="0.000813"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.254203" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:31.253796" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:31.254574" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:31.254736" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:31.254393" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.255185" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.254932" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.256312" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.256042" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.256860" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:31.256538" elapsed="0.000358"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.257235" 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-04-10T00:48:31.257464" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.257666" elapsed="0.000024"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:31.257097" elapsed="0.000631"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.256948" elapsed="0.000811"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:31.257803" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:31.257966" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:31.255713" elapsed="0.002279"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.255359" elapsed="0.002667"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.258214" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.258050" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.255338" elapsed="0.002963"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.259000" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.258504" elapsed="0.000524"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:31.259080" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:31.251509" elapsed="0.007743"/>
</kw>
<msg time="2026-04-10T00:48:31.259326" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:31.237795" elapsed="0.021675"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.273796" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.287340" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.301163" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.301526" elapsed="0.000090"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.301892" elapsed="0.000073"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.302705" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.302456" elapsed="0.000354"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:31.302428" elapsed="0.000423"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.303115" elapsed="0.000035"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.303425" elapsed="0.000034"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.303758" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:31.302363" elapsed="0.001477"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.302107" elapsed="0.001804"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.304218" elapsed="0.000078"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.304463" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:48:31.304675" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:31.227415" elapsed="0.077286"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:31.306674" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:31.306344" elapsed="0.000400">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:31.306892" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:31.305554" elapsed="0.001377"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.308286" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.307077" elapsed="0.001295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.309287" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.308796" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.308412" elapsed="0.000969"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.307058" elapsed="0.002357"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.312317" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:31.309644" elapsed="0.002714"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:31.312490" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:31.312791" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:31.305084" elapsed="0.007732"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:31.314751" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:31.314433" elapsed="0.000382">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:31.314963" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:31.313672" elapsed="0.001330"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:31.315436" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-10T00:48:31.315148" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.315128" elapsed="0.000507"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.315834" elapsed="0.000076"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.316151" elapsed="0.000075"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.316344" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:48:31.330390" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:31.313165" elapsed="0.017254"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.333226" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.332372" elapsed="0.000987"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.334201" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.333621" 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-04-10T00:48:31.359687" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0labrpeq6hvzrqou5cqfegtpr0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:31.360680" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:31.361720" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:31.337828" elapsed="0.024000"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.334505" elapsed="0.027453"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.364320" elapsed="0.000083"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.362049" elapsed="0.002484"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.334484" elapsed="0.030178"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.371871" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.369140" elapsed="0.003059"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.368850" elapsed="0.003416"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.368817" elapsed="0.003497"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.375130" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.372764" elapsed="0.002412"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.372442" elapsed="0.002793"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.372380" elapsed="0.002903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.376165" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.375639" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.376687" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.376320" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.377338" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.377030" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.376816" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.376289" elapsed="0.001179"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.378341" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.377830" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.378865" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.378495" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.379519" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.379202" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.378990" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.378464" elapsed="0.001201"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:31.379987" elapsed="0.000450"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:31.381232" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.380802" elapsed="0.000476"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:31.381626" elapsed="0.003666"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:31.366537" elapsed="0.018835"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.385757" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:31.385538" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.385518" elapsed="0.000399"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:31.396738" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:31.386114" elapsed="0.010670"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:31.396923" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:31.397169" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:31.330845" elapsed="0.066352"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:31.397269" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:48:31.397451" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:31.186908" elapsed="0.210576"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.397923" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.397610" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.397586" elapsed="0.000507"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:31.398140" 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="PASS" start="2026-04-10T00:48:31.182368" elapsed="0.215929"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.178180" elapsed="0.220175"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.178163" elapsed="0.220223"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:48:31.399072" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:48:31.398963" elapsed="0.000171"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.399195" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:31.399157" elapsed="0.000078"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.398946" elapsed="0.000311"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.399406" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:48:31.399526" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:31.398689" elapsed="0.000880"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.400178" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.399758" elapsed="0.000449"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.400856" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.400367" elapsed="0.000517"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.406793" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.406387" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.407270" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.407000" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:31.416946" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:31.417056" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:31 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:31 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-inventory-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.738","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"228.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782111,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:31.417210" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:31.409435" elapsed="0.007803"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.407383" elapsed="0.009899"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.417492" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.417310" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.407365" elapsed="0.010237"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.421851" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-inventory-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.738","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"228.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782111,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.418900" elapsed="0.003154"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.418586" elapsed="0.003565"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.418567" elapsed="0.003620"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.425841" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.422595" elapsed="0.003431"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.422264" elapsed="0.003888"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.422241" elapsed="0.003950"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.427237" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.426428" elapsed="0.000848"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.428343" elapsed="0.000107"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.427425" elapsed="0.001188"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.430421" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.429321" elapsed="0.001159"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.428653" elapsed="0.001987"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.427397" elapsed="0.003279"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.431721" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.430907" elapsed="0.000852"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.432782" elapsed="0.000107"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.431903" elapsed="0.001137"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.434941" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.433769" elapsed="0.001230"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.433079" elapsed="0.002057"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.431876" elapsed="0.003294"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:31.435446" elapsed="0.001011"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:31.437211" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.436694" elapsed="0.000543"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:31.437431" elapsed="0.002743"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:31.418110" elapsed="0.022155"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.440443" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:31.440337" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.440319" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:31.456390" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:31.440683" elapsed="0.015737"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:31.456473" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:31.456650" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:31.401806" elapsed="0.054872"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:31.456771" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:31.456925" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:31.401099" elapsed="0.055852"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.457998" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782111, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.457525" elapsed="0.000505"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:31.458079" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:31.458255" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782111, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:31.457178" elapsed="0.001104"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:31.458679" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:31.458449" elapsed="0.000257"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:31.459100" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:31.458898" elapsed="0.000227"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:31.459173" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:31.459323" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:31.176594" elapsed="0.282753"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:31.459405" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:48:31.459604" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:31.175845" elapsed="0.283785"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:31.459928" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.459712" elapsed="0.000445"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.460327" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.460181" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.460864" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.460404" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.459694" elapsed="0.001256"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:31.175674" elapsed="0.285300"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.463477" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.463178" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:31.463569" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:31.463718" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:31.462829" elapsed="0.000914"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.537274" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.536882" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:31.538132" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:31.537871" elapsed="0.000338">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:31.538352" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:31.537470" elapsed="0.000907"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.538953" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:31.538558" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:31.539283" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:31.539438" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:31.539144" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.539883" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.539638" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.540899" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.540643" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.541373" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:31.541104" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.541786" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.541990" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.542166" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:31.541646" elapsed="0.000579"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.541465" elapsed="0.000790"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:31.542302" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:31.542463" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:31.540293" elapsed="0.002195"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.539999" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.542711" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.542559" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.539978" elapsed="0.002809"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.543363" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.542930" elapsed="0.000460"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:31.543440" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:31.536185" elapsed="0.007437"/>
</kw>
<msg time="2026-04-10T00:48:31.543694" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:31.522761" elapsed="0.021073"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.557734" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.571226" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.590990" elapsed="0.000056"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.591592" elapsed="0.000084"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.591931" elapsed="0.000076"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.592867" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.592625" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:31.592588" elapsed="0.000391"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.593251" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.593576" 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-04-10T00:48:31.593871" elapsed="0.000034"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:31.592443" elapsed="0.001509"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.592161" elapsed="0.001864"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.594344" elapsed="0.000076"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.594609" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:48:31.594827" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:31.512329" elapsed="0.082526"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:31.597151" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:31.596776" elapsed="0.000458">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:31.597397" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:31.595748" elapsed="0.001691"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.598875" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.597612" elapsed="0.001366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.599847" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.599327" elapsed="0.000566"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.599018" elapsed="0.000925"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.597592" elapsed="0.002386"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.603113" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:31.600182" elapsed="0.002973"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:31.603299" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:48:31.603539" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:31.595246" elapsed="0.008337"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:31.605824" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:31.605462" elapsed="0.000430">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:31.606099" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:31.604676" elapsed="0.001466"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:31.606627" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-04-10T00:48:31.606304" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.606283" elapsed="0.000537"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.607036" elapsed="0.000078"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.607373" elapsed="0.000078"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.607593" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:48:31.621517" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:31.603954" elapsed="0.017639"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.624319" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.623692" elapsed="0.000761"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.625519" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.624940" elapsed="0.000725"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:31.644344" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node013gawcwja405m14axcmgdzwrtx0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:31.645291" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:31.646002" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:31.629138" elapsed="0.016964"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.625791" elapsed="0.020437"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.648582" elapsed="0.000084"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.646318" elapsed="0.002478"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.625770" elapsed="0.023103"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.657662" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.653473" elapsed="0.004671"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.653044" elapsed="0.005192"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.652998" elapsed="0.005310"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.662595" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.658906" elapsed="0.003760"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.658449" elapsed="0.004305"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.658405" elapsed="0.004419"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.664207" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.663370" elapsed="0.000890"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.664690" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.664370" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.665341" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.665031" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.664818" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.664339" elapsed="0.001131"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.666317" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.665818" elapsed="0.000543"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.666785" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.666468" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.667434" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.667119" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.666911" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.666438" elapsed="0.001161"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:31.667923" elapsed="0.000431"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:31.669136" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.668711" elapsed="0.000469"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:31.669514" elapsed="0.002583"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:31.650726" elapsed="0.021451"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.672567" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:31.672350" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.672329" elapsed="0.000403"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:31.683197" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:31.672931" elapsed="0.010311"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:31.683378" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:31.683689" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:31.621962" elapsed="0.061754"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:31.683781" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:48:31.683935" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:31.472411" elapsed="0.211551"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.684286" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.684045" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.684027" elapsed="0.000394"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:31.684455" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:48:31.468166" elapsed="0.216435"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.463810" elapsed="0.220836"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.463793" elapsed="0.220876"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:48:31.685273" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:31.685167" elapsed="0.000166"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.685393" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:31.685356" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.685149" elapsed="0.000305"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.685618" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:48:31.685739" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:31.684900" elapsed="0.000865"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.686296" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.685933" elapsed="0.000390"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.686984" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.686479" elapsed="0.000532"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.692573" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.692290" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.693040" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.692777" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:31.704186" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:31.704322" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:31 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:31 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-inventory-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.728","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.047","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.047","active":true,"matchIndex":-1,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":0}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.191 ms","CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782111,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:31.704475" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:31.695185" elapsed="0.009317"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.693149" elapsed="0.011453"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.704791" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.704632" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.693132" elapsed="0.011744"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.711827" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-inventory-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.728","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.047","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.047","active":true,"matchIndex":-1,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":0}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.191 ms","CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782111,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.706203" elapsed="0.005951"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.705904" elapsed="0.006453"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.705886" elapsed="0.006532"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.719429" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.713266" elapsed="0.006360"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.712580" elapsed="0.007138"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.712510" elapsed="0.007235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.720484" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.719922" elapsed="0.000590"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.721229" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.720634" elapsed="0.000769"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.722679" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.721917" elapsed="0.000805"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.721430" elapsed="0.001391"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.720614" elapsed="0.002230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.723567" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.723009" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.724291" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.723697" elapsed="0.000768"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.725731" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.724999" elapsed="0.000773"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.724491" elapsed="0.001379"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.723679" elapsed="0.002215"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:31.726048" elapsed="0.000764"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:31.727570" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.727036" elapsed="0.000561"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:31.727799" elapsed="0.002820"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:31.705431" elapsed="0.025281"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.730890" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:31.730784" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.730765" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:31.746653" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:31.731105" elapsed="0.015578"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:31.746736" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:48:31.746936" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:31.687941" elapsed="0.059022"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:31.747020" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:48:31.747169" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:31.687225" elapsed="0.059970"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.748236" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782111, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.747796" elapsed="0.000468"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:31.748312" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:31.748485" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782111, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:31.747426" elapsed="0.001085"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:31.748886" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:31.748684" elapsed="0.000229"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:31.749265" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:31.749067" elapsed="0.000223"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:31.749336" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:31.749490" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:31.462193" elapsed="0.287322"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:31.749864" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:31.750018" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:31.461315" elapsed="0.288727"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.750349" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.750124" elapsed="0.000282"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:31.750655" elapsed="0.000188"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.750430" elapsed="0.000450"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.751051" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.750904" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.750106" elapsed="0.001019"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:31.461141" elapsed="0.290010"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.753466" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.753169" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:31.753537" elapsed="0.000335"/>
</return>
<msg time="2026-04-10T00:48:31.753998" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:31.752829" elapsed="0.001194"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.829408" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.829008" elapsed="0.000435"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:31.830314" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:31.830050" elapsed="0.000344">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:31.830489" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:31.829636" elapsed="0.000878"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.831093" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:31.830703" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:48:31.831427" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:48:31.831601" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:48:31.831285" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.832032" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.831783" 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-04-10T00:48:31.833087" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.832834" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.833588" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:48:31.833292" elapsed="0.000324"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.833952" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.834157" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.834338" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:48:31.833813" elapsed="0.000581"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.833671" elapsed="0.000754"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:48:31.834474" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:31.834657" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:48:31.832485" elapsed="0.002197"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.832157" elapsed="0.002558"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.834887" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.834740" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.832133" elapsed="0.002829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.835539" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.835104" elapsed="0.000480"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:48:31.835632" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:48:31.828280" elapsed="0.007519"/>
</kw>
<msg time="2026-04-10T00:48:31.835870" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:31.814420" elapsed="0.021591"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.849882" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.863267" elapsed="0.000101"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.876714" elapsed="0.000052"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.877076" elapsed="0.000075"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.877392" elapsed="0.000072"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.878229" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.878000" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:48:31.877971" elapsed="0.000365"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.878613" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.878920" 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-04-10T00:48:31.879213" elapsed="0.000034"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:48:31.877903" elapsed="0.001392"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.877642" elapsed="0.001722"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.879731" elapsed="0.000073"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.879972" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:48:31.880155" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:48:31.803558" elapsed="0.076624"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:31.882188" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:31.881865" elapsed="0.000402">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:31.882427" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:31.881050" elapsed="0.001417"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.883906" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.882633" elapsed="0.001361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.884848" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.884336" elapsed="0.000558"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.884032" elapsed="0.000911"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.882613" elapsed="0.002365"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.888051" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:31.885179" elapsed="0.002912"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:48:31.888225" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:48:31.888454" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:31.880590" elapsed="0.007890"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:48:31.890562" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:48:31.890241" elapsed="0.000387">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:48:31.890777" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:48:31.889339" elapsed="0.001478"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:48:31.891276" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-10T00:48:31.890964" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.890945" elapsed="0.000508"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.891677" elapsed="0.000075"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.891997" elapsed="0.000074"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.892190" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:48:31.905914" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:48:31.888886" elapsed="0.017058"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.908476" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.907895" elapsed="0.000760"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.909464" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.908888" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:31.935609" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01scfk5e5snymj1gtu4c77d4crx0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:31.936531" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:48:31.937244" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:31.913386" elapsed="0.024123"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.909899" elapsed="0.027781"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.940017" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.937775" elapsed="0.002451"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.909879" elapsed="0.030429"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.949280" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.945731" elapsed="0.003913"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.944924" elapsed="0.004781"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.944854" elapsed="0.004899"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.952570" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.950136" elapsed="0.002482"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.949849" elapsed="0.002827"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.949819" elapsed="0.002905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.953612" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.953070" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.954068" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.953766" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.954767" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.954424" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.954212" elapsed="0.000641"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.953735" elapsed="0.001163"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.955745" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.955231" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.956199" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.955900" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.956857" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.956541" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.956329" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.955870" elapsed="0.001116"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:31.957310" elapsed="0.000452"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:31.958606" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.958147" elapsed="0.000505"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:31.958978" elapsed="0.002487"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:31.942163" elapsed="0.019394"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.961921" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:31.961723" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.961703" elapsed="0.000396"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:31.972580" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:31.962294" elapsed="0.010331"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:31.972770" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:48:31.973010" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:31.906304" elapsed="0.066733"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:31.973101" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:48:31.973254" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:48:31.762464" elapsed="0.210815"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.973620" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.973361" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.973344" elapsed="0.000410"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:31.973788" 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="PASS" start="2026-04-10T00:48:31.758237" elapsed="0.215695"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.754090" elapsed="0.219885"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.754073" elapsed="0.219926"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:48:31.974645" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:31.974494" elapsed="0.000211"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:48:31.974765" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:31.974728" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.974477" elapsed="0.000350"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.974974" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:48:31.975093" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:48:31.974227" elapsed="0.000890"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.975669" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:31.975284" elapsed="0.000411"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.976310" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:31.975852" elapsed="0.000484"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.981869" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.981558" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:31.982338" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.982073" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:31.992733" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:31.992905" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:31 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:31 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-inventory-config","LastIndex":-1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.737","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"243.4 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782111,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:31.993139" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:31.984560" elapsed="0.008617"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.982447" elapsed="0.010797"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:31.993595" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:31.993287" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.982429" elapsed="0.011297"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.000690" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-inventory-config","LastIndex":-1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.737","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"243.4 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782111,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:31.995810" elapsed="0.005185"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:31.995323" elapsed="0.005813"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:31.995295" elapsed="0.005888"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.004752" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:32.001858" elapsed="0.003035"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:32.001281" elapsed="0.003706"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.001251" elapsed="0.003765"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.005891" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:32.005228" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.006749" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:32.006029" elapsed="0.000898"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.008201" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:32.007442" elapsed="0.000803"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:32.006954" elapsed="0.001389"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.006008" elapsed="0.002358"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.009112" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:32.008532" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.009908" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:32.009243" elapsed="0.000846"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.011410" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:32.010687" elapsed="0.000764"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:32.010116" elapsed="0.001453"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.009224" elapsed="0.002370"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:32.011769" elapsed="0.000729"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:32.013330" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:32.012737" elapsed="0.000620"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:32.013579" elapsed="0.002830"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:31.994497" elapsed="0.022018"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:32.016746" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:32.016628" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.016605" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:32.033801" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:32.016976" elapsed="0.016869"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:32.033925" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:48:32.034126" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:31.977247" elapsed="0.056906"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:32.034289" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:32.034447" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:48:31.976565" elapsed="0.057908"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.036085" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782111, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:32.035569" elapsed="0.000547"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:32.036165" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:32.036361" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782111, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:32.035131" elapsed="0.001259"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:32.036786" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:32.036574" elapsed="0.000288"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:32.037233" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:32.037029" elapsed="0.000231"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:48:32.037310" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:32.037467" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:31.752216" elapsed="0.285278"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:48:32.037577" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:32.037734" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:48:31.751493" elapsed="0.286267"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:32.038087" elapsed="0.000202"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:32.037855" elapsed="0.000472"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.038502" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:32.038353" elapsed="0.000277"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.038806" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:32.038657" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.037834" elapsed="0.001049"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:31.751324" elapsed="0.287586"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:31.175448" elapsed="0.863497"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:48:32.038994" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:32.039206" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:48:32.039255" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:48:31.171388" elapsed="0.867892"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.039866" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:48:32.039949" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:32.039464" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.040261" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:32.040043" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.040025" elapsed="0.000313"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.045077" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:48:32.040475" elapsed="0.004663"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:48:32.045629" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:32.045404" elapsed="0.000252"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:48:32.045708" elapsed="0.000036"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:48:31.168818" elapsed="0.877062"/>
</kw>
<msg time="2026-04-10T00:48:32.045988" level="INFO">${inv_conf_leader} = 2</msg>
<msg time="2026-04-10T00:48:32.046038" level="INFO">${inv_conf_followers_list} = [1, 3]</msg>
<var>${inv_conf_leader}</var>
<var>${inv_conf_followers_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Get_Leader_And_Followers_For_Shard</arg>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:48:31.168181" elapsed="0.877881"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.046613" level="INFO">config inventory Leader is 2 and followers are [1, 3]</msg>
<arg>config inventory Leader is ${inv_conf_leader} and followers are ${inv_conf_followers_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:32.046281" elapsed="0.000378"/>
</kw>
<return>
<value>${inv_conf_leader}</value>
<value>${inv_conf_followers_list}</value>
<status status="PASS" start="2026-04-10T00:48:32.046703" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:32.046909" level="INFO">${inventory_leader} = 2</msg>
<msg time="2026-04-10T00:48:32.046958" level="INFO">${inventory_followers} = [1, 3]</msg>
<var>${inventory_leader}</var>
<var>${inventory_followers}</var>
<doc>Check Status for Inventory Config shard in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:48:31.165690" elapsed="0.881292"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:48:32.047353" level="INFO">${Follower_Node_1} = 1</msg>
<var>${Follower_Node_1}</var>
<arg>${Inventory_Followers}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:32.047163" elapsed="0.000216"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:48:32.047754" level="INFO">${Follower_Node_2} = 3</msg>
<var>${Follower_Node_2}</var>
<arg>${Inventory_Followers}</arg>
<arg>1</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:32.047570" elapsed="0.000211"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.048251" level="INFO">${Inventory_Leader_List} = [2]</msg>
<var>${Inventory_Leader_List}</var>
<arg>${inventory_leader}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:32.047956" elapsed="0.000321"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.048791" level="INFO">${Inventory_Follower_Node1_List} = [1]</msg>
<var>${Inventory_Follower_Node1_List}</var>
<arg>${Follower_Node_1}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:32.048449" elapsed="0.000367"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.049322" level="INFO">${Follower_Node_1} = 1</msg>
<arg>${Follower_Node_1}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:32.049005" elapsed="0.000359"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.049866" level="INFO">${Follower_Node_2} = 3</msg>
<arg>${Follower_Node_2}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:32.049559" elapsed="0.000349"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.050392" level="INFO">${Inventory_Leader} = 2</msg>
<arg>${Inventory_Leader}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:32.050088" elapsed="0.000345"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.050939" level="INFO">${Inventory_Leader_List} = [2]</msg>
<arg>${Inventory_Leader_List}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:32.050631" elapsed="0.000349"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.051470" level="INFO">${Inventory_Follower_Node1_List} = [1]</msg>
<arg>${Inventory_Follower_Node1_List}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:32.051160" elapsed="0.000351"/>
</kw>
<doc>Find a follower in the inventory config shard</doc>
<status status="PASS" start="2026-04-10T00:48:30.599801" elapsed="1.451845"/>
</test>
<test id="s1-s1-t3" name="Start Mininet Connect To Follower Node1" line="61">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:48:32.055215" elapsed="0.000235"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:48:32.054944" elapsed="0.000564"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:32.056621" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:32.056442" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.056420" elapsed="0.000276"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:32.061912" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:32.061780" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.061757" elapsed="0.000236"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.063119" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:32.062681" elapsed="0.000467"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.063644" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:32.063315" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:32.063715" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:32.063880" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:32.062265" elapsed="0.001726"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:32.069889" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:32.069758" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.069735" 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-04-10T00:48:32.071274" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:32.071167" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.071149" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:32.071841" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:32.071494" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:32.072255" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:32.072038" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:32.119475" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:32.072885" elapsed="0.046936"/>
</kw>
<msg time="2026-04-10T00:48:32.120072" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:32.120123" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:32.072503" elapsed="0.047659"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:32.191630" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:32.120982" elapsed="0.070909"/>
</kw>
<msg time="2026-04-10T00:48:32.192126" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:32.192181" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:32.120475" elapsed="0.071745"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.192704" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:32.192345" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.192310" elapsed="0.000486"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.193338" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:32.192954" elapsed="0.000474"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.193747" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:32.193501" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.193482" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:32.193865" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:32.195512" elapsed="0.000865"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:32.196686" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:32.197460" elapsed="0.000396"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:32.194853" elapsed="0.003109"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:32.194200" elapsed="0.003829"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:32.070860" elapsed="0.127272"/>
</kw>
<msg time="2026-04-10T00:48:32.198324" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:32.198375" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:32.070161" elapsed="0.128254"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:32.198639" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:48:32.198499" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.198479" elapsed="0.000252"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.199149" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.199504" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:32.199600" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:32.069316" elapsed="0.130402"/>
</kw>
<msg time="2026-04-10T00:48:32.199821" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:32.199870" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:32.064385" elapsed="0.135524"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.200250" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:32.199989" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.199971" elapsed="0.000527"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:32.064237" elapsed="0.136285"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:32.206511" elapsed="0.000046"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:32.206377" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.206357" 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-04-10T00:48:32.207893" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:32.207783" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.207765" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:32.208419" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:32.208111" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:32.208852" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:32.208630" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:32.253973" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:32.209391" elapsed="0.044766"/>
</kw>
<msg time="2026-04-10T00:48:32.254419" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:32.254480" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:32.209044" elapsed="0.045484"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:32.332694" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:32.255368" elapsed="0.077521"/>
</kw>
<msg time="2026-04-10T00:48:32.333087" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:32.333156" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:32.254850" elapsed="0.078353"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.333701" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:32.333318" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.333284" elapsed="0.000518"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.334407" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:32.334034" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.334806" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:32.334581" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.334561" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:32.334922" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:32.336516" elapsed="0.000808"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:32.337630" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:32.338369" elapsed="0.000402"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:32.335848" elapsed="0.003032"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:32.335245" elapsed="0.003708"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:32.207447" elapsed="0.131608"/>
</kw>
<msg time="2026-04-10T00:48:32.339152" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:32.339198" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:32.206786" elapsed="0.132449"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:32.339422" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:48:32.339314" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.339296" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.339930" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.340297" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:32.340518" elapsed="0.000037"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:32.205935" elapsed="0.134718"/>
</kw>
<msg time="2026-04-10T00:48:32.340749" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:32.340794" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:32.200825" elapsed="0.140007"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.341168" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:32.340917" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.340900" elapsed="0.000344"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:32.200678" elapsed="0.140589"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:32.347145" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:32.347037" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.347018" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:32.348410" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:32.348295" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.348278" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:32.348995" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:32.348682" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:32.349399" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:32.349188" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:32.393392" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:32.350006" elapsed="0.043509"/>
</kw>
<msg time="2026-04-10T00:48:32.393719" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:32.393766" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:32.349657" elapsed="0.044145"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:32.469477" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:32.394369" elapsed="0.075357"/>
</kw>
<msg time="2026-04-10T00:48:32.469959" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:32.470020" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:32.394003" elapsed="0.076090"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.470636" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:32.470227" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.470189" elapsed="0.000557"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.471535" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:32.470945" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.472042" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:32.471758" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.471736" elapsed="0.000405"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:32.472188" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:32.474140" elapsed="0.000982"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:32.475479" elapsed="0.000582"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:32.476395" elapsed="0.000455"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:32.473299" elapsed="0.003679"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:32.472594" elapsed="0.004463"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:32.347993" elapsed="0.129189"/>
</kw>
<msg time="2026-04-10T00:48:32.477303" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:32.477359" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:32.347367" elapsed="0.130043"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:32.477664" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:48:32.477511" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.477488" elapsed="0.000284"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.478311" elapsed="0.000033"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.478784" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:32.478876" 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-04-10T00:48:32.346676" elapsed="0.132338"/>
</kw>
<msg time="2026-04-10T00:48:32.479136" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:32.479256" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:32.341576" elapsed="0.137732"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.479762" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:32.479408" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.479386" elapsed="0.000475"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:32.341408" elapsed="0.138484"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:32.064053" elapsed="0.415883"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:48:32.061323" elapsed="0.418690"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:48:32.056139" elapsed="0.423950"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:32.055690" elapsed="0.424459"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:48:32.052720" elapsed="0.427500"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.484669" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:32.484370" elapsed="0.000360"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:32.487484" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:32.487213" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:32.487195" elapsed="0.000392"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:32.487881" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:32.487741" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.488573" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:32.488171" elapsed="0.000452"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:32.489156" level="INFO">${conn_id} = 28</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:32.488785" elapsed="0.000399"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:32.490152" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:48:32.490232" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:32.489868" elapsed="0.000392"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:32.490426" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:48:32.491655" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:48:33.185052" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:48:32.491317" elapsed="0.693878"/>
</kw>
<msg time="2026-04-10T00:48:33.185278" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:32.490945" elapsed="0.694413"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:48:32.489411" elapsed="0.696058"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:48:33.186057" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:48:34.401811" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:48:34.402243" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:48:34.402387" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:48:33.185814" elapsed="1.216636"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:34.403074" elapsed="0.000764"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:34.405064" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:34.404293" elapsed="0.000924"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:34.405973" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:34.405623" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:34.405386" elapsed="0.000755"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:48:34.406508" elapsed="0.000100"/>
</return>
<status status="PASS" start="2026-04-10T00:48:34.406261" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:34.406228" elapsed="0.000523"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:34.406858" elapsed="0.000037"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:34.411653" elapsed="0.000462"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:34.412353" elapsed="0.000250"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:34.412818" elapsed="0.000140"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:34.407752" elapsed="0.005281"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:48:32.486675" elapsed="1.926491"/>
</kw>
<msg time="2026-04-10T00:48:34.413245" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:32.486091" elapsed="1.927228"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:48:32.485445" elapsed="1.927986"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:34.416422" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:34.416036" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:34.416011" elapsed="0.000525"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:34.416962" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:34.416771" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:34.417915" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:34.417357" elapsed="0.000624"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:34.418757" level="INFO">${conn_id} = 30</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:34.418203" elapsed="0.000590"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:34.420233" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:48:34.420340" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:34.419742" elapsed="0.000623"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:34.420528" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:48:34.421755" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:48:34.745721" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:48:33 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:48:34.421413" elapsed="0.324492"/>
</kw>
<msg time="2026-04-10T00:48:34.746016" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:34.421044" elapsed="0.325078"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:48:34.419108" elapsed="0.327168"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:48:34.746978" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:48:34.789488" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:48:34.789842" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:48:34.789969" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:48:34.746648" elapsed="0.043381"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:34.790583" elapsed="0.000560"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:34.792245" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:34.791609" elapsed="0.000730"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:34.792854" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:34.792520" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:34.792467" elapsed="0.000551"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:48:34.793369" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-04-10T00:48:34.793136" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:34.793103" elapsed="0.000486"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:34.793670" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:34.798344" elapsed="0.000512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:34.799093" elapsed="0.000222"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:34.799467" 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-04-10T00:48:34.794385" elapsed="0.005265"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:48:34.415250" elapsed="0.384493"/>
</kw>
<msg time="2026-04-10T00:48:34.799798" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:34.414429" elapsed="0.385421"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:48:34.413707" elapsed="0.386224"/>
</kw>
<arg>${mininet}</arg>
<status status="PASS" start="2026-04-10T00:48:32.484996" elapsed="2.314996"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:34.805075" level="INFO">${tools_connection} = 32</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:34.804703" elapsed="0.000399"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:34.806957" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:48:34.807037" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:34.806606" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:34.807226" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:48:34.808410" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:48:35.134348" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:48:34 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:48:34.808093" elapsed="0.326565"/>
</kw>
<msg time="2026-04-10T00:48:35.134803" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:34.807734" elapsed="0.327211"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:48:34.806075" elapsed="0.329084"/>
</kw>
<msg time="2026-04-10T00:48:35.135224" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:34.805682" elapsed="0.329599"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:48:34.805285" elapsed="0.330089"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-10T00:48:35.135459" elapsed="0.000104"/>
</return>
<msg time="2026-04-10T00:48:35.135820" level="INFO">${mininet_conn_id} = 32</msg>
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-10T00:48:34.804194" elapsed="0.331660"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.136911" level="INFO">${mininet_conn_id} = 32</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:35.136295" elapsed="0.000676"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.139969" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.137091" elapsed="0.002943"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.137056" elapsed="0.003007"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.140615" level="INFO">Start mininet --topo linear,1 to 10.30.170.165</msg>
<arg>Start mininet ${options} to ${controller}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.140234" elapsed="0.000435"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:35.144342" level="INFO">sudo mn --controller 'remote,ip=10.30.170.165,port=6633' --topo linear,1 --switch ovsk,protocols=OpenFlow13</msg>
<arg>sudo mn --controller 'remote,ip=${controller},port=${ofport}' ${options} --switch ovsk,protocols=OpenFlow${ofversion}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:35.140861" elapsed="0.003581"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:48:35.314441" level="INFO">[?2004l*** Creating network
*** Adding controller
*** Adding hosts:
h1 
*** Adding switches:
s1 
*** Adding links:
(h1, s1) 
*** Configuring hosts
h1 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:48:35.144747" elapsed="0.169879"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.315350" level="INFO">Check OVS configuratiom</msg>
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.314979" elapsed="0.000418"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:35.317058" level="INFO">sh ovs-vsctl show</msg>
<arg>sh ovs-vsctl show</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:35.315594" elapsed="0.001522"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:48:35.334376" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Bridge s1
        Controller "ptcp:6654"
        Controller "tcp:10.30.170.165:6633"
        fail_mode: secure
        Port s1-eth1
            Interface s1-eth1
        Port s1
            Interface s1
                type: internal
    ovs_version: "2.17.11"
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:48:35.317283" elapsed="0.017244"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="PASS" start="2026-04-10T00:48:35.334683" elapsed="0.000091"/>
</return>
<msg time="2026-04-10T00:48:35.335133" level="INFO">${mininet_conn_id} = 32</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${Follower_Node_1}_IP}</arg>
<arg>--topo linear,${switch_count}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="PASS" start="2026-04-10T00:48:32.480643" elapsed="2.854545"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.336435" level="INFO">${mininet_conn_id} = 32</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:35.335674" elapsed="0.000853"/>
</kw>
<doc>Start mininet with connection to Follower Node1.</doc>
<status status="PASS" start="2026-04-10T00:48:32.052078" elapsed="3.284855"/>
</test>
<test id="s1-s1-t4" name="Add Bulk Flow From Follower" line="69">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:48:35.340899" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:48:35.340588" elapsed="0.000583"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:35.342257" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:35.342113" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.342091" 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-04-10T00:48:35.347579" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:35.347444" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.347426" elapsed="0.000224"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.348735" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:35.348267" elapsed="0.000496"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.349231" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:35.348926" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:35.349300" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:35.349456" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:35.347886" elapsed="0.001595"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:35.355630" elapsed="0.000293"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:35.355494" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.355473" elapsed="0.000514"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:35.357437" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:35.357321" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.357298" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:35.358003" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:35.357691" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:35.358482" level="INFO">${current_connection_index} = 32</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:35.358246" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:35.400854" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:35.359038" elapsed="0.041933"/>
</kw>
<msg time="2026-04-10T00:48:35.401146" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:35.401194" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:35.358696" elapsed="0.042536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:35.458506" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "A "d "d "[C "B "u "l "k "[C "F "l "o "w "[C "F "r "o "m "[C "F "o "l "[78Cl "[A[78Co
 "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:35.401808" elapsed="0.056924"/>
</kw>
<msg time="2026-04-10T00:48:35.458968" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:35.459019" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:35.401415" elapsed="0.057643"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.459489" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.459185" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.459144" elapsed="0.000488"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.460154" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "A "d "d "[C "B "u "l "k "[C "F "l "o "w "[C "F "r "o "m "[C "F "o "l "[78Cl "[A[78Co
 "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.459784" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.460640" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.460394" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.460374" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:35.460759" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:35.463779" elapsed="0.000183"/>
</kw>
<msg time="2026-04-10T00:48:35.464032" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:35.462384" elapsed="0.001790"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.464464" elapsed="0.000104"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.464837" 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-04-10T00:48:35.461710" elapsed="0.003352"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:35.461087" elapsed="0.004045"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:35.356937" elapsed="0.108297"/>
</kw>
<msg time="2026-04-10T00:48:35.465343" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:35.465395" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:35.356258" elapsed="0.109189"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:35.465680" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:48:35.465562" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.465523" elapsed="0.000246"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.466188" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.466569" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:35.466670" elapsed="0.000026"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:35.355088" elapsed="0.111724"/>
</kw>
<msg time="2026-04-10T00:48:35.466912" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:35.466957" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:35.349881" elapsed="0.117113"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.467339" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.467074" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.467055" elapsed="0.000379"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:35.349735" elapsed="0.117765"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:35.473428" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:35.473314" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.473294" 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-04-10T00:48:35.474883" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:35.474770" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.474747" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:35.475436" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:35.475103" elapsed="0.000362"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:35.475875" level="INFO">${current_connection_index} = 32</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:35.475654" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:35.519906" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:35.476402" elapsed="0.043861"/>
</kw>
<msg time="2026-04-10T00:48:35.520508" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:35.520590" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:35.476062" elapsed="0.044569"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:35.585961" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "A "d "d "[C "B "u "l "k "[C "F "l "o "w "[C "F "r "o "m "[C "F "o "l "[78Cl "[A[78Co
 "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:35.521403" elapsed="0.064832"/>
</kw>
<msg time="2026-04-10T00:48:35.586582" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:35.586637" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:35.520923" elapsed="0.065753"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.587228" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.586828" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.586787" elapsed="0.000551"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.587960" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "A "d "d "[C "B "u "l "k "[C "F "l "o "w "[C "F "r "o "m "[C "F "o "l "[78Cl "[A[78Co
 "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.587504" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.588352" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.588124" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.588105" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:35.588490" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:35.591431" elapsed="0.000182"/>
</kw>
<msg time="2026-04-10T00:48:35.591678" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:35.590242" elapsed="0.001575"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.592109" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.592454" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:35.589491" elapsed="0.003175"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:35.588855" elapsed="0.003878"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:35.474414" elapsed="0.118417"/>
</kw>
<msg time="2026-04-10T00:48:35.592932" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:35.592983" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:35.473851" elapsed="0.119179"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:35.593223" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:48:35.593114" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.593095" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.593746" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.594140" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:35.594218" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:35.472954" elapsed="0.121378"/>
</kw>
<msg time="2026-04-10T00:48:35.594435" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:35.594481" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:35.467814" elapsed="0.126787"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.594946" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.594687" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.594669" elapsed="0.000364"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:35.467669" elapsed="0.127388"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:35.600908" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:35.600798" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.600779" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:35.602196" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:35.602073" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.602054" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:35.602751" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:35.602412" elapsed="0.000366"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:35.603169" level="INFO">${current_connection_index} = 32</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:35.602938" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:35.645252" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:35.603735" elapsed="0.041764"/>
</kw>
<msg time="2026-04-10T00:48:35.645799" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:35.645847" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:35.603361" elapsed="0.042524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:35.726014" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "A "d "d "[C "B "u "l "k "[C "F "l "o "w "[C "F "r "o "m "[C "F "o "l "[78Cl "[A[78Co
 "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:35.646636" elapsed="0.079601"/>
</kw>
<msg time="2026-04-10T00:48:35.726475" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:35.726525" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:35.646151" elapsed="0.080450"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.727088" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.726751" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.726710" elapsed="0.000469"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.727743" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "A "d "d "[C "B "u "l "k "[C "F "l "o "w "[C "F "r "o "m "[C "F "o "l "[78Cl "[A[78Co
 "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.727325" elapsed="0.000505"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.728124" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.727900" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.727881" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:35.728241" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:35.731129" elapsed="0.000153"/>
</kw>
<msg time="2026-04-10T00:48:35.731345" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:35.729972" elapsed="0.001520"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.731798" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.732136" elapsed="0.000148"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:35.729252" elapsed="0.003156"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:35.728600" elapsed="0.003876"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:35.601733" elapsed="0.130862"/>
</kw>
<msg time="2026-04-10T00:48:35.732721" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:35.732768" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:35.601146" elapsed="0.131661"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:35.732997" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:48:35.732887" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.732867" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.733488" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.733909" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:35.733987" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:35.600425" elapsed="0.133677"/>
</kw>
<msg time="2026-04-10T00:48:35.734200" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:35.734244" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:35.595342" elapsed="0.138938"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.734635" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.734359" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.734341" elapsed="0.000384"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:35.595196" elapsed="0.139557"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:35.349537" elapsed="0.385251"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:48:35.347034" elapsed="0.387816"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:48:35.341811" elapsed="0.393099"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:35.341331" elapsed="0.393626"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:48:35.338309" elapsed="0.396704"/>
</kw>
<kw name="Add Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Add Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.746248" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:35.745934" elapsed="0.000341"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:35.746321" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:35.746469" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:35.745578" elapsed="0.000916"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.760371" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.760061" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.760853" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.760612" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.761315" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.761057" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.761799" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.761515" elapsed="0.000328"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:35.762828" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:48:35.762579" elapsed="0.000276"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:48:35.763247" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:48:35.763035" elapsed="0.000238"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:48:35.763432" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.764075" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.763827" elapsed="0.000298"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:48:35.764172" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:35.764359" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:48:35.762148" elapsed="0.002236"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:35.808458" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0labrpeq6hvzrqou5cqfegtpr0.node0', 'Content-Length': '403', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:48:35.808616" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:35.808842" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:35.768501" elapsed="0.040386"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:35.764462" elapsed="0.044517"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.809350" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.809033" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.764442" elapsed="0.045046"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.816569" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.811279" elapsed="0.005393"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:35.810919" elapsed="0.005813"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.810888" elapsed="0.005884"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.820961" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.817243" elapsed="0.003788"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:35.816869" elapsed="0.004212"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.816840" elapsed="0.004279"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.822172" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:35.821393" elapsed="0.000820"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.822713" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.822319" elapsed="0.000484"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.823540" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:35.823083" elapsed="0.000520"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:35.822839" elapsed="0.000842"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.822292" elapsed="0.001426"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.824511" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:35.823963" elapsed="0.000611"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.825031" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.824679" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.825881" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:35.825388" elapsed="0.000532"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:35.825150" elapsed="0.000823"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.824653" elapsed="0.001352"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:35.826233" elapsed="0.000538"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:35.827586" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:35.827226" elapsed="0.000407"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:35.827801" elapsed="0.002412"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:35.810115" elapsed="0.020171"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:35.830481" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:35.830369" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.830350" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:35.833215" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:35.830722" elapsed="0.002522"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:35.833295" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:48:35.833466" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:35.757355" elapsed="0.076136"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:35.833581" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:35.833736" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:48:35.754703" elapsed="0.079058"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:35.833814" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:48:35.833962" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:35.745113" elapsed="0.088873"/>
</kw>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Add Bulk Flow in member 1 according to ${json_body_add}.</doc>
<status status="PASS" start="2026-04-10T00:48:35.740594" elapsed="0.093456"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.841138" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:35.840834" elapsed="0.000331"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:35.841213" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:35.841362" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:35.840466" elapsed="0.000920"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.848315" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.848059" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.848866" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.848559" elapsed="0.000351"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:35.855391" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:35.855479" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:35 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:35 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782115,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:35.855653" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:35.851039" elapsed="0.004653"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:35.848978" elapsed="0.006778"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.856032" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.855798" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.848960" elapsed="0.007300"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.861830" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782115,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.857903" elapsed="0.004002"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:35.857562" elapsed="0.004396"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.857514" elapsed="0.004480"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.865474" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:35.862483" elapsed="0.003038"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:35.862132" elapsed="0.003437"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.862053" elapsed="0.003542"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.866160" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:35.865770" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.866495" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.866257" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.867122" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:35.866765" elapsed="0.000386"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:35.866599" elapsed="0.000616"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.866238" elapsed="0.001068"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.867899" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:35.867480" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.868310" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:35.867999" elapsed="0.000378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.868890" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:35.868589" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:35.868402" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.867981" elapsed="0.000992"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:35.869125" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:35.870001" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:35.869690" elapsed="0.000337"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:35.870188" elapsed="0.002844"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:35.856887" elapsed="0.016213"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:35.873283" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:48:35.873173" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:35.873154" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:35.873528" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:35.873626" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:48:35.876067" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782115,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:35.841738" elapsed="0.034367"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:35.876164" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:35.876323" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782115,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:35.840003" elapsed="0.036347"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.877871" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782115, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:35.877425" elapsed="0.000528"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:35.878005" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:35.878191" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782115, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:35.876766" elapsed="0.001453"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:35.878647" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:35.878404" elapsed="0.000270"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.879223" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:35.878859" elapsed="0.000392"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.879766" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:35.879431" elapsed="0.000372"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:48:35.880478" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:48:35.880007" elapsed="0.000580">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:48:35.835295" elapsed="0.045431">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:36.895318" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:36.893540" elapsed="0.001840"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:36.895489" elapsed="0.000103"/>
</return>
<msg time="2026-04-10T00:48:36.895799" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:36.892936" elapsed="0.002898"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:36.905374" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:36.905085" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:36.907736" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:36.906284" elapsed="0.001612"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:36.918225" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:36.918373" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:36 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:36 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782116,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:36.918665" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:36.912394" elapsed="0.006337"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:36.908161" elapsed="0.010676"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:36.919298" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:36.918914" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:36.908093" elapsed="0.011410"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:36.927493" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782116,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:36.922277" elapsed="0.005305"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:36.921728" elapsed="0.005905"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:36.921685" elapsed="0.005982"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:36.931512" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:36.928062" elapsed="0.003536"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:36.927745" elapsed="0.003902"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:36.927722" elapsed="0.003959"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:36.932529" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:36.931949" elapsed="0.000640"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:36.933259" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:36.932899" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:36.934138" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:36.933693" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:36.933401" elapsed="0.000826"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:36.932870" elapsed="0.001387"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:36.935035" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:36.934492" elapsed="0.000582"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:36.935507" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:36.935175" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:36.936313" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:36.935896" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:36.935668" elapsed="0.000730"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:36.935148" elapsed="0.001280"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:36.936670" elapsed="0.000498"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:36.937903" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:36.937449" elapsed="0.000491"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:36.938161" elapsed="0.002582"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:36.920569" elapsed="0.020246"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:36.941009" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-04-10T00:48:36.940889" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:36.940870" elapsed="0.000258"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:36.941305" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:36.941379" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:48:36.943717" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782116,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:36.896380" elapsed="0.047367"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:36.943805" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:36.943966" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782116,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:36.892184" elapsed="0.051809"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:36.945055" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782116, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:36.944618" elapsed="0.000467"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:36.945135" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:36.945321" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782116, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:36.944239" elapsed="0.001109"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:36.945744" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:36.945537" elapsed="0.000233"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:36.946287" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:36.945968" elapsed="0.000346"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:36.946775" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:36.946489" elapsed="0.000312"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:48:36.947392" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:48:36.947014" elapsed="0.000520">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:48:36.882063" elapsed="0.065645">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:37.959262" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:37.958768" elapsed="0.000536"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:37.959397" elapsed="0.000061"/>
</return>
<msg time="2026-04-10T00:48:37.959688" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:37.958242" elapsed="0.001483"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:37.968002" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:37.967743" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:37.968449" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:37.968206" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:37.974913" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:37.974972" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:37 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:37 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782117,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:37.975066" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:37.970722" elapsed="0.004370"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:37.968582" elapsed="0.006553"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:37.975318" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:37.975162" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:37.968559" elapsed="0.006844"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:37.980249" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782117,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:37.976889" elapsed="0.003429"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:37.976513" elapsed="0.003853"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:37.976488" elapsed="0.003912"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:37.984178" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:37.980843" elapsed="0.003383"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:37.980483" elapsed="0.003778"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:37.980460" elapsed="0.003825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:37.985015" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:37.984466" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:37.985449" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:37.985142" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:37.986158" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:37.985786" elapsed="0.000405"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:37.985572" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:37.985119" elapsed="0.001146"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:37.986946" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:37.986473" elapsed="0.000506"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:37.987364" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:37.987067" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:37.988060" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:37.987696" elapsed="0.000399"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:37.987464" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:37.987045" elapsed="0.001209"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:37.988467" elapsed="0.000485"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:37.989530" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:37.989165" elapsed="0.000418"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:37.989981" elapsed="0.003556"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:37.975923" elapsed="0.017732"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:37.993914" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T00:48:37.993768" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:37.993737" elapsed="0.000298"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:37.994268" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:37.994358" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:48:37.997565" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782117,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:37.960208" elapsed="0.037405"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:37.997703" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:48:37.997929" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782117,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:37.957569" elapsed="0.040393"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:37.999471" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782117, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:37.998895" elapsed="0.000613"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:37.999589" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:48:37.999786" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782117, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:37.998323" elapsed="0.001497"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:38.000288" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:38.000056" elapsed="0.000264"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.000988" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:38.000569" elapsed="0.000453"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.001599" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:38.001247" elapsed="0.000385"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:48:38.001857" elapsed="0.000398"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:48:37.948630" elapsed="0.053707"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:48:35.834705" elapsed="2.167701"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 1.</doc>
<status status="PASS" start="2026-04-10T00:48:35.834282" elapsed="2.168209"/>
</kw>
<arg>${temp_json_config_add}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Add Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:48:35.740049" elapsed="2.262534"/>
</kw>
<doc>10000 Flows ( 10000 per DPN) in 1 DPN added via Follower Node1 and verify it gets applied in all instances.</doc>
<status status="PASS" start="2026-04-10T00:48:35.337656" elapsed="2.665089"/>
</test>
<test id="s1-s1-t5" name="Get Bulk Flows and Verify In Inventory Leader" line="73">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:48:38.008217" elapsed="0.000322"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:48:38.007850" elapsed="0.000822"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:38.010206" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:38.010022" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.009991" elapsed="0.000314"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:38.017347" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:38.017115" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.017085" elapsed="0.000370"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.018908" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:38.018336" elapsed="0.000608"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.019566" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:38.019155" elapsed="0.000445"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:38.019657" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:48:38.019869" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:38.017839" elapsed="0.002061"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:38.027296" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:38.027152" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.027125" elapsed="0.000262"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:38.028838" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:38.028728" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.028710" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:38.029378" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:38.029056" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:38.029869" level="INFO">${current_connection_index} = 32</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:38.029629" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:38.059783" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:38.030403" elapsed="0.029770"/>
</kw>
<msg time="2026-04-10T00:48:38.060727" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:38.060835" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:38.030061" elapsed="0.030856"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:38.124856" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "G "e "t "[C "B "u "l "k "[C "F "l "o "w "s "[C "a "n "d "[C "V "e "r "[78Ci "[A[78Cf
 "y "[C "I "n "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:38.062781" elapsed="0.062487"/>
</kw>
<msg time="2026-04-10T00:48:38.125627" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:38.125682" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:38.061516" elapsed="0.064205"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.126371" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:38.125900" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.125843" elapsed="0.000629"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.127159" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "G "e "t "[C "B "u "l "k "[C "F "l "o "w "s "[C "a "n "d "[C "V "e "r "[78Ci "[A[78Cf
 "y "[C "I "n "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:38.126646" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.127570" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:38.127329" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.127310" elapsed="0.000507"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:38.127870" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:38.130984" elapsed="0.000160"/>
</kw>
<msg time="2026-04-10T00:48:38.131210" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:38.129729" elapsed="0.001625"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.131655" elapsed="0.000098"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.132019" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:38.128992" elapsed="0.003221"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:38.128306" elapsed="0.003977"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:38.028334" elapsed="0.104050"/>
</kw>
<msg time="2026-04-10T00:48:38.132494" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:38.132539" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:38.027615" elapsed="0.104982"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:38.132792" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:48:38.132680" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.132660" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.133317" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.133706" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:38.133778" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:38.026658" elapsed="0.107239"/>
</kw>
<msg time="2026-04-10T00:48:38.134000" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:38.134044" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:38.020408" elapsed="0.113676"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.134424" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:38.134163" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.134146" elapsed="0.000355"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:38.020217" elapsed="0.114308"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:38.140510" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:38.140398" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.140377" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:38.141853" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:38.141744" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.141726" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:38.142391" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:38.142069" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:38.142823" level="INFO">${current_connection_index} = 32</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:38.142604" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:38.194371" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:38.143350" elapsed="0.051345"/>
</kw>
<msg time="2026-04-10T00:48:38.195037" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:38.195107" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:38.143010" elapsed="0.052287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:38.285996" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "G "e "t "[C "B "u "l "k "[C "F "l "o "w "s "[C "a "n "d "[C "V "e "r "[78Ci "[A[78Cf
 "y "[C "I "n "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:38.196370" elapsed="0.089917"/>
</kw>
<msg time="2026-04-10T00:48:38.286566" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:38.286640" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:38.195717" elapsed="0.090962"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.287203" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:38.286818" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.286772" elapsed="0.000533"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.287919" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "G "e "t "[C "B "u "l "k "[C "F "l "o "w "s "[C "a "n "d "[C "V "e "r "[78Ci "[A[78Cf
 "y "[C "I "n "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:38.287462" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.288417" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:38.288119" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.288096" elapsed="0.000436"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:38.288612" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:38.292031" elapsed="0.000190"/>
</kw>
<msg time="2026-04-10T00:48:38.292299" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:38.290707" elapsed="0.001758"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.292864" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.293261" elapsed="0.000083"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:38.289840" elapsed="0.003635"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:38.289058" elapsed="0.004522"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:38.141352" elapsed="0.152347"/>
</kw>
<msg time="2026-04-10T00:48:38.293818" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:38.293872" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:38.140763" elapsed="0.153154"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:38.294139" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:48:38.294010" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.293989" elapsed="0.000252"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.294801" elapsed="0.000033"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.295233" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:38.295321" elapsed="0.000020"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:38.140016" elapsed="0.155446"/>
</kw>
<msg time="2026-04-10T00:48:38.295612" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:38.295667" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:38.134850" elapsed="0.160863"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.296179" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:38.295871" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.295848" elapsed="0.000422"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:38.134695" elapsed="0.161603"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:38.303988" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:38.303847" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.303819" elapsed="0.000259"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:38.305597" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:38.305443" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.305422" elapsed="0.000259"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:38.306234" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:38.305860" elapsed="0.000408"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:38.306788" level="INFO">${current_connection_index} = 32</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:38.306491" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:38.346645" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:38.307465" elapsed="0.039492"/>
</kw>
<msg time="2026-04-10T00:48:38.347281" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:38.347351" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:38.307039" elapsed="0.040367"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:38.420520" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "G "e "t "[C "B "u "l "k "[C "F "l "o "w "s "[C "a "n "d "[C "V "e "r "[78Ci "[A[78Cf
 "y "[C "I "n "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:38.348427" elapsed="0.072399"/>
</kw>
<msg time="2026-04-10T00:48:38.421136" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:38.421196" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:38.347802" elapsed="0.073434"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.421793" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:38.421370" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.421330" elapsed="0.000560"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.422459" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "G "e "t "[C "B "u "l "k "[C "F "l "o "w "s "[C "a "n "d "[C "V "e "r "[78Ci "[A[78Cf
 "y "[C "I "n "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:38.422042" elapsed="0.000535"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.422878" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:38.422650" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.422632" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:38.422998" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:38.425870" elapsed="0.000156"/>
</kw>
<msg time="2026-04-10T00:48:38.426092" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:38.424678" elapsed="0.001557"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.426523" elapsed="0.000112"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.426902" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:38.423978" elapsed="0.003115"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:38.423334" elapsed="0.004443"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:38.305088" elapsed="0.122812"/>
</kw>
<msg time="2026-04-10T00:48:38.428038" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:38.428093" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:38.304286" elapsed="0.123856"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:38.428384" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:48:38.428247" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.428223" elapsed="0.000259"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.428939" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.429296" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:38.429387" elapsed="0.000096"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:38.303350" elapsed="0.126289"/>
</kw>
<msg time="2026-04-10T00:48:38.429745" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:38.429812" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:38.296659" elapsed="0.133209"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.430259" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:38.429963" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.429944" elapsed="0.000414"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:38.296457" elapsed="0.133932"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:38.019979" elapsed="0.410447"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:48:38.016418" elapsed="0.414078"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:48:38.009494" elapsed="0.421125"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:38.008880" elapsed="0.421807"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:48:38.004220" elapsed="0.426526"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.441012" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:38.440598" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.441572" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:38.441206" elapsed="0.000395"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:38.441647" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:38.441809" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:38.440188" elapsed="0.001646"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.452218" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:38.451915" elapsed="0.000331"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:38.452292" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:38.452440" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:38.451566" elapsed="0.000898"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.466242" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:38.465978" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.466777" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:38.466517" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.467235" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:38.466980" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.467693" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:38.467431" elapsed="0.000305"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:38.468578" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:48:38.468344" elapsed="0.000262"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:48:38.468937" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:48:38.468763" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:48:38.469114" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.469769" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:38.469501" elapsed="0.000312"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:48:38.469854" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:48:38.470013" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:48:38.467938" elapsed="0.002099"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:38.509472" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node013gawcwja405m14axcmgdzwrtx0.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:48:38.509658" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:38.509910" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:38.472369" elapsed="0.037601"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:38.470112" elapsed="0.039982"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.510625" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:38.510169" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.470093" elapsed="0.040742"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.517113" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:38.513389" elapsed="0.003788"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:38.512788" elapsed="0.004439"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.512745" elapsed="0.004517"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.521138" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:38.517824" elapsed="0.003383"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:38.517341" elapsed="0.003915"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.517317" elapsed="0.003973"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.522125" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:38.521570" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.522616" elapsed="0.000199"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:38.522261" elapsed="0.000605"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.523565" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:38.523126" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:38.522899" elapsed="0.000755"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.522236" elapsed="0.001448"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.524404" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:38.523903" elapsed="0.000538"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.525354" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:38.524537" elapsed="0.001165"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.527001" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:38.526211" elapsed="0.000851"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:38.525765" elapsed="0.001381"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.524513" elapsed="0.002682"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:38.527539" elapsed="0.000820"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:38.529538" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:38.528766" elapsed="0.000873"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:38.530054" elapsed="0.004532"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:38.511720" elapsed="0.022939"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:48:38.534853" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:38.534735" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.534716" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:48:38.537505" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:48:38.535076" elapsed="0.002456"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:48:38.537599" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:48:38.537767" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:38.463237" elapsed="0.074555"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:38.537860" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:48:38.538012" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:48:38.460498" elapsed="0.077543"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:38.538102" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:48:38.538252" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:38.451102" elapsed="0.087175"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:48:38.446616" elapsed="0.091724"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:38.442030" elapsed="0.096343"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:38.441891" elapsed="0.096518"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.550634" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:38.550281" elapsed="0.000386"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:38.550719" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:38.550874" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:38.549923" elapsed="0.000976"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.557738" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:38.557455" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.558189" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:38.557943" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:38.566000" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:38.566117" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:38 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:38 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782118,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:38.566216" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:38.560362" elapsed="0.005880"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:38.558306" elapsed="0.007980"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.566475" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:38.566315" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.558287" elapsed="0.008347"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.571910" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782118,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:38.568158" elapsed="0.003824"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:38.567803" elapsed="0.004228"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.567773" elapsed="0.004291"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.576042" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:38.572458" elapsed="0.003651"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:38.572144" elapsed="0.004014"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.572119" elapsed="0.004073"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.577078" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:38.576442" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.577538" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:38.577218" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.578141" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:38.577823" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:38.577640" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.577193" elapsed="0.001033"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.578776" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:38.578388" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.579185" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:38.578878" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.579809" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:38.579439" elapsed="0.000399"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:38.579275" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.578859" elapsed="0.001036"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:38.580050" elapsed="0.000379"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:38.580965" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:38.580650" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:38.581150" elapsed="0.004035"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:38.567148" elapsed="0.018106"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:38.585449" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:48:38.585327" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:38.585307" elapsed="0.000257"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:38.585720" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:38.585793" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:48:38.588115" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782118,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:38.551238" elapsed="0.036956"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:38.588250" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:38.588446" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782118,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:38.549401" elapsed="0.039075"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.589497" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782118, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:38.589070" elapsed="0.000456"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:38.589594" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:38.589753" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782118, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:38.588727" elapsed="0.001061"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:38.590157" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:38.589973" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.590688" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:38.590360" elapsed="0.000355"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.591166" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:38.590898" elapsed="0.000294"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:48:38.591737" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:48:38.591367" elapsed="0.000459">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:48:38.544490" elapsed="0.047455">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:39.604062" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:39.603591" elapsed="0.000513"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:39.604175" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:48:39.604382" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:39.603045" elapsed="0.001370"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:39.613900" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:39.613532" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:39.614484" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:39.614171" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:39.624330" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:39.624405" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:39 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:39 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782119,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:39.624522" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:39.617517" elapsed="0.007064"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:39.614655" elapsed="0.009984"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:39.624879" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:39.624674" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:39.614629" elapsed="0.010360"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:39.629774" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782119,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:39.626370" elapsed="0.003466"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:39.626056" elapsed="0.003954"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:39.626033" elapsed="0.004012"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:39.633736" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:39.630418" elapsed="0.003378"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:39.630120" elapsed="0.003719"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:39.630098" elapsed="0.003773"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:39.634635" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:39.634112" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:39.635077" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:39.634762" elapsed="0.000388"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:39.635803" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:39.635400" elapsed="0.000437"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:39.635182" elapsed="0.000701"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:39.634739" elapsed="0.001174"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:39.636603" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:39.636128" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:39.637037" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:39.636729" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:39.637805" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:39.637355" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:39.637139" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:39.636706" elapsed="0.001205"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:39.638117" elapsed="0.000457"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:39.639181" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:39.638795" elapsed="0.000419"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:39.639418" elapsed="0.003644"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:39.625470" elapsed="0.017675"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:39.643370" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:48:39.643235" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:39.643212" elapsed="0.000271"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:39.643703" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:39.643793" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:48:39.646987" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782119,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:39.604888" elapsed="0.042136"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:39.647090" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:39.647283" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782119,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:39.602233" elapsed="0.045085"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:39.648627" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782119, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:39.648093" elapsed="0.000572"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:39.648729" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:48:39.648926" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782119, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:39.647637" elapsed="0.001366"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:39.649506" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:39.649247" elapsed="0.000309"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:39.650192" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:39.649804" elapsed="0.000421"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:39.650828" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:39.650458" elapsed="0.000404"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:48:39.651540" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:48:39.651091" elapsed="0.000556">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:48:39.592957" elapsed="0.058837">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:40.665622" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:40.665028" elapsed="0.000642"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:40.665782" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:48:40.666036" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:40.664412" elapsed="0.001660"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:40.674858" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:40.674487" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:40.675330" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:40.675077" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:40.683100" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:40.683163" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:40 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:40 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782120,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:40.683263" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:40.677642" elapsed="0.005647"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:40.675480" elapsed="0.007851"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:40.683602" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:40.683362" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:40.675457" elapsed="0.008240"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:40.687381" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782120,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:40.684790" elapsed="0.002643"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:40.684531" elapsed="0.002937"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:40.684513" elapsed="0.002979"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:40.690371" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:40.687811" elapsed="0.002611"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:40.687572" elapsed="0.002885"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:40.687532" elapsed="0.002949"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:40.691111" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:40.690690" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:40.691509" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:40.691218" elapsed="0.000388"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:40.692354" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:40.691876" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:40.691645" elapsed="0.000882"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:40.691199" elapsed="0.001387"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:40.693377" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:40.692819" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:40.693950" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:40.693536" elapsed="0.000520"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:40.694822" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:40.694353" elapsed="0.000508"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:40.694104" elapsed="0.000807"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:40.693503" elapsed="0.001438"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:40.695161" elapsed="0.000567"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:40.696377" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:40.695967" elapsed="0.000446"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:40.696658" elapsed="0.003778"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:40.684092" elapsed="0.016440"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:40.700814" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T00:48:40.700659" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:40.700631" elapsed="0.000315"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:40.701159" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:40.701257" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:48:40.704295" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782120,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:40.666592" elapsed="0.037733"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:40.704377" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:40.704532" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782120,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:40.663477" elapsed="0.041098"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:40.705618" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782120, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:40.705191" elapsed="0.000456"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:40.705696" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:40.705852" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782120, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:40.704818" elapsed="0.001060"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:40.706241" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:40.706058" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:40.706853" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:40.706445" elapsed="0.000436"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:40.707407" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:40.707063" elapsed="0.000371"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:48:40.708109" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:48:40.707629" elapsed="0.000575">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:48:40.652831" elapsed="0.055495">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:41.720584" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:41.720046" elapsed="0.000696"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:41.720830" elapsed="0.000060"/>
</return>
<msg time="2026-04-10T00:48:41.721077" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:41.719476" elapsed="0.001637"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:41.732144" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:41.731753" elapsed="0.000464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:41.732870" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:41.732445" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:41.742159" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:41.742222" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:41 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:41 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782121,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:41.742322" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:41.736206" elapsed="0.006142"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:41.733067" elapsed="0.009325"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:41.742601" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:41.742422" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:41.733037" elapsed="0.009656"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:41.746467" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782121,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:41.743898" elapsed="0.002619"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:41.743669" elapsed="0.002903"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:41.743651" elapsed="0.002947"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:41.750615" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:41.746986" elapsed="0.003696"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:41.746666" elapsed="0.004064"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:41.746639" elapsed="0.004125"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:41.751574" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:41.751012" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:41.752052" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:41.751717" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:41.752844" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:41.752395" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:41.752166" elapsed="0.000764"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:41.751691" elapsed="0.001269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:41.753862" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:41.753316" elapsed="0.000619"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:41.754364" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:41.754036" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:41.755151" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:41.754733" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:41.754477" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:41.754011" elapsed="0.001253"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:41.755476" elapsed="0.000515"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:41.756642" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:41.756221" elapsed="0.000521"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:41.756964" elapsed="0.002908"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:41.743203" elapsed="0.016735"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:41.760119" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:48:41.760010" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:41.759991" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:41.760365" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:41.760435" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:48:41.762790" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782121,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:41.721635" elapsed="0.041184"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:41.762872" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:41.763028" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782121,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:41.718752" elapsed="0.044302"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:41.764101" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782121, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:41.763703" elapsed="0.000426"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:41.764178" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:41.764332" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782121, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:41.763333" elapsed="0.001025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:41.764739" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:41.764535" elapsed="0.000229"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:41.765521" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:41.765062" elapsed="0.000502"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:41.766031" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:41.765740" elapsed="0.000317"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:48:41.766593" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:48:41.766227" elapsed="0.000444">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:48:41.709292" elapsed="0.057492">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:42.774399" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:42.774010" elapsed="0.000422"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:42.774492" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:48:42.774688" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:42.773628" elapsed="0.001088"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:42.782070" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:42.781763" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:42.782529" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:42.782283" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:42.790451" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:42.790631" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:42 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:42 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782122,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:42.790754" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:42.784757" elapsed="0.006025"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:42.782674" elapsed="0.008160"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:42.791053" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:42.790869" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:42.782651" elapsed="0.008509"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:42.795031" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782122,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:42.792365" elapsed="0.002719"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:42.792087" elapsed="0.003033"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:42.792066" elapsed="0.003079"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:42.798445" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:42.795449" elapsed="0.003069"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:42.795214" elapsed="0.003380"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:42.795195" elapsed="0.003438"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:42.799497" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:42.798909" elapsed="0.000629"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:42.800050" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:42.799677" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:42.800897" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:42.800417" elapsed="0.000519"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:42.800174" elapsed="0.000815"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:42.799649" elapsed="0.001372"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:42.802056" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:42.801299" elapsed="0.000797"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:42.802570" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:42.802201" elapsed="0.000456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:42.803375" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:42.802934" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:42.802692" elapsed="0.000772"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:42.802174" elapsed="0.001321"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:42.803759" elapsed="0.000518"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:42.804975" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:42.804525" elapsed="0.000489"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:42.805297" elapsed="0.003732"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:42.791607" elapsed="0.017527"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:42.809443" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-10T00:48:42.809278" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:42.809248" elapsed="0.000358"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:42.809844" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:42.809945" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:48:42.813227" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782122,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:42.775074" elapsed="0.038279"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:42.813434" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:48:42.813682" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782122,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:42.773070" elapsed="0.040650"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:42.815218" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782122, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:42.814610" elapsed="0.000649"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:42.815328" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:48:42.815571" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782122, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:42.814061" elapsed="0.001550"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:42.816124" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:42.815864" elapsed="0.000297"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:42.816871" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:42.816412" elapsed="0.000495"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:42.817599" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:42.817198" elapsed="0.000439"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:48:42.818214" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:48:42.817837" elapsed="0.000449">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:48:42.767476" elapsed="0.050923">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:43.830290" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:43.829787" elapsed="0.000547"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:43.830414" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T00:48:43.830678" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:43.829240" elapsed="0.001477"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:43.841129" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:43.840830" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:43.841621" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:43.841347" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:43.848193" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:43.848255" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:43 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782123,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:43.848352" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:43.843953" elapsed="0.004424"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:43.841761" elapsed="0.006661"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:43.848630" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:43.848451" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:43.841736" elapsed="0.006984"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:43.852363" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782123,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:43.849860" elapsed="0.002553"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:43.849593" elapsed="0.002977"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:43.849573" elapsed="0.003025"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:43.855370" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:43.852923" elapsed="0.002495"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:43.852658" elapsed="0.002795"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:43.852640" elapsed="0.002837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:43.856080" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:43.855678" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:43.856419" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:43.856180" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:43.857005" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:43.856691" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:43.856502" elapsed="0.000646"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:43.856162" elapsed="0.001011"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:43.857731" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:43.857341" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:43.858193" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:43.857864" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:43.858970" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:43.858531" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:43.858306" elapsed="0.000749"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:43.857839" elapsed="0.001246"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:43.859298" elapsed="0.000503"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:43.860427" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:43.860032" elapsed="0.000431"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:43.860703" elapsed="0.003401"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:43.849138" elapsed="0.015059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:43.864489" elapsed="0.000093"/>
</return>
<status status="PASS" start="2026-04-10T00:48:43.864297" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:43.864270" elapsed="0.000449"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:43.864971" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:43.865111" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:48:43.868332" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782123,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:43.831206" elapsed="0.037166"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:43.868444" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:48:43.868675" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782123,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:43.828490" elapsed="0.040221"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:43.870107" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782123, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:43.869557" elapsed="0.000589"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:43.870212" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:48:43.870425" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782123, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:43.869054" elapsed="0.001464"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:43.871057" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:43.870797" elapsed="0.000297"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:43.871874" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:43.871350" elapsed="0.000563"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:43.872572" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:43.872166" elapsed="0.000444"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:48:43.873499" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:48:43.872857" elapsed="0.000795">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:48:43.819348" elapsed="0.054474">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:44.885959" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:44.885417" elapsed="0.000586"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:44.886079" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:48:44.886309" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:44.884914" elapsed="0.001430"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:44.895316" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:44.895052" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:44.895794" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:44.895521" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:44.904277" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:44.904337" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:44 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782124,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:44.904430" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:44.898013" elapsed="0.006443"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:44.895917" elapsed="0.008581"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:44.904710" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:44.904526" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:44.895896" elapsed="0.008899"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:44.909759" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782124,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:44.906265" elapsed="0.003564"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:44.905955" elapsed="0.003922"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:44.905929" elapsed="0.003982"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:44.913981" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:44.910298" elapsed="0.003735"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:44.909989" elapsed="0.004080"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:44.909965" elapsed="0.004130"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:44.914717" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:44.914291" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:44.915063" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:44.914818" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:44.915629" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:44.915308" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:44.915144" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:44.914797" elapsed="0.000976"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:44.916307" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:44.915938" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:44.916659" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:44.916405" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:44.917199" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:44.916902" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:44.916741" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:44.916387" elapsed="0.000895"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:44.917460" elapsed="0.000377"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:44.918294" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:44.918005" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:44.918475" elapsed="0.002364"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:44.905296" elapsed="0.015611"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:44.921086" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:48:44.920979" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:44.920960" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:44.921329" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:44.921425" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:48:44.923823" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782124,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:44.886843" elapsed="0.037011"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:44.923910" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:48:44.924095" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782124,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:44.884230" elapsed="0.039892"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:44.925239" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782124, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:44.924793" elapsed="0.000475"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:44.925319" elapsed="0.000105"/>
</return>
<msg time="2026-04-10T00:48:44.925595" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782124, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:44.924379" elapsed="0.001245"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:44.926003" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:44.925815" elapsed="0.000214"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:44.926515" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:44.926204" elapsed="0.000350"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:44.926999" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:44.926731" elapsed="0.000294"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:48:44.927570" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:48:44.927196" elapsed="0.000451">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:48:44.874768" elapsed="0.053003">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:45.941019" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:45.940281" elapsed="0.000911"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:45.941302" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:48:45.941664" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:45.939567" elapsed="0.002151"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:45.953265" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:45.952794" elapsed="0.000562"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:45.953941" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:45.953634" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:45.964873" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:45.965074" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782125,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:45.965400" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:45.957312" elapsed="0.008171"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:45.954112" elapsed="0.011554"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:45.966346" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:45.965763" elapsed="0.000821"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:45.954075" elapsed="0.012582"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:45.973659" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782125,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:45.968845" elapsed="0.004914"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:45.968353" elapsed="0.005471"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:45.968316" elapsed="0.005557"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:45.977817" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:45.974463" elapsed="0.003414"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:45.973985" elapsed="0.003940"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:45.973953" elapsed="0.004002"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:45.978715" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:45.978218" elapsed="0.000528"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:45.979110" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:45.978827" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:45.979708" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:45.979371" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:45.979205" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:45.978806" elapsed="0.000994"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:45.980344" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:45.979972" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:45.980694" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:45.980442" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:45.981239" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:45.980942" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:45.980777" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:45.980424" elapsed="0.000896"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:45.981478" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:45.982357" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:45.982015" elapsed="0.000431"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:45.982626" elapsed="0.002377"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:45.967483" elapsed="0.017592"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:45.985267" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:48:45.985153" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:45.985133" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:45.985519" elapsed="0.000039"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:45.985611" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:48:45.987948" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782125,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:45.942506" elapsed="0.045472"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:45.988033" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:45.988191" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782125,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:45.938605" elapsed="0.049612"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:45.989271" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782125, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:45.988853" elapsed="0.000447"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:45.989350" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:45.989509" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782125, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:45.988462" elapsed="0.001073"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:45.989923" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:45.989737" elapsed="0.000213"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:45.990504" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:45.990179" elapsed="0.000353"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:45.991001" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:45.990726" elapsed="0.000301"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:48:45.991567" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:48:45.991198" elapsed="0.000443">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:48:45.928949" elapsed="0.062804">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:47.004795" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:47.004148" elapsed="0.000708"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:47.004961" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:48:47.005251" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:47.003592" elapsed="0.001707"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:47.014446" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:47.014128" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:47.014945" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:47.014688" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:47.022047" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:47.022243" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:47 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:47 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782127,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:47.022406" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:47.017212" elapsed="0.005233"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:47.015074" elapsed="0.007440"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:47.022840" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:47.022584" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:47.015052" elapsed="0.007919"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:47.030275" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782127,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:47.024673" elapsed="0.005680"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:47.024308" elapsed="0.006098"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:47.024279" elapsed="0.006164"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:47.033654" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:47.030879" elapsed="0.002824"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:47.030526" elapsed="0.003212"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:47.030501" elapsed="0.003261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:47.034375" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:47.033960" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:47.034732" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:47.034473" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:47.035340" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:47.034981" elapsed="0.000387"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:47.034815" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:47.034455" elapsed="0.000971"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:47.035969" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:47.035604" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:47.036301" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:47.036066" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:47.036855" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:47.036558" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:47.036381" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:47.036048" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:47.037240" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:47.038060" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:47.037768" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:47.038392" elapsed="0.002378"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:47.023623" elapsed="0.017216"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:47.041027" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:48:47.040912" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:47.040892" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:47.041279" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:47.041349" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:48:47.043780" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782127,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:47.005974" elapsed="0.037893"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:47.043923" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:48:47.044082" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782127,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:47.002747" elapsed="0.041361"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:47.045138" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782127, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:47.044729" elapsed="0.000437"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:47.045216" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:48:47.045371" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782127, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:47.044347" elapsed="0.001051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:47.045776" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:47.045594" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:47.046280" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:47.045978" elapsed="0.000330"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:47.046766" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:47.046480" elapsed="0.000312"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:48:47.047359" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:48:47.046967" elapsed="0.000465">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:48:46.992758" elapsed="0.054803">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:48.059032" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:48.058436" elapsed="0.000644"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:48.059163" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T00:48:48.059408" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:48.057881" elapsed="0.001565"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:48.120614" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:48.120173" elapsed="0.000505"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:48.121108" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:48.120853" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:48.128485" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:48.128600" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:48 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:48 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782128,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:48.128719" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:48.123338" elapsed="0.005409"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:48.121236" elapsed="0.007557"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:48.128984" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:48.128823" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:48.121212" elapsed="0.007859"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:48.132947" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782128,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:48.130306" elapsed="0.002706"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:48.129986" elapsed="0.003129"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:48.129959" elapsed="0.003184"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:48.135901" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:48.133456" elapsed="0.002493"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:48.133215" elapsed="0.002770"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:48.133196" elapsed="0.002813"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:48.136846" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:48.136349" elapsed="0.000525"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:48.137418" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:48.136947" elapsed="0.000552"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:48.138245" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:48.137812" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:48.137532" elapsed="0.000803"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:48.136929" elapsed="0.001435"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:48.139153" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:48.138620" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:48.139655" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:48.139293" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:48.140432" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:48.140013" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:48.139785" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:48.139267" elapsed="0.001329"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:48.140830" elapsed="0.000501"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:48.142066" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:48.141620" elapsed="0.000485"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:48.142327" elapsed="0.003523"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:48.129485" elapsed="0.016460"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:48.146202" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T00:48:48.146046" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:48.146020" elapsed="0.000313"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:48.146566" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:48.146669" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:48:48.149782" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782128,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:48.059987" elapsed="0.089825"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:48.149875" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:48.150034" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782128,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:48.057129" elapsed="0.092931"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:48.151102" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782128, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:48.150664" elapsed="0.000467"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:48.151180" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:48:48.151336" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782128, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:48.150295" elapsed="0.001103"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:48.151787" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:48.151602" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:48.152352" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:48.152005" elapsed="0.000374"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:48.152887" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:48.152615" elapsed="0.000315"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:48:48.153473" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:48:48.153114" elapsed="0.000447">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:48:48.048527" elapsed="0.105150">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:49.165244" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:49.164605" elapsed="0.000693"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:49.165400" elapsed="0.000080"/>
</return>
<msg time="2026-04-10T00:48:49.165698" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:49.164041" elapsed="0.001692"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:49.174248" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:49.173971" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:49.174754" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:49.174479" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:49.182568" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:49.182640" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:49 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:49 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782129,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:49.182740" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:49.177021" elapsed="0.005744"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:49.174889" elapsed="0.007919"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:49.183002" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:49.182839" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:49.174862" elapsed="0.008227"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:49.186715" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782129,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:49.184149" elapsed="0.002626"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:49.183918" elapsed="0.002892"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:49.183900" elapsed="0.002935"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:49.189704" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:49.187191" elapsed="0.002576"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:49.186892" elapsed="0.002920"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:49.186875" elapsed="0.002969"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:49.190694" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:49.190103" elapsed="0.000619"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:49.191219" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:49.190816" elapsed="0.000514"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:49.192256" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:49.191724" elapsed="0.000582"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:49.191378" elapsed="0.001110"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:49.190789" elapsed="0.001781"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:49.193465" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:49.192898" elapsed="0.000606"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:49.193977" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:49.193631" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:49.194832" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:49.194365" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:49.194100" elapsed="0.000826"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:49.193604" elapsed="0.001362"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:49.195201" elapsed="0.000581"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:49.196606" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:49.196108" elapsed="0.000537"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:49.196871" elapsed="0.003566"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:49.183476" elapsed="0.017063"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:49.200838" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-04-10T00:48:49.200675" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:49.200648" elapsed="0.000347"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:49.201212" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:49.201316" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:48:49.204314" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782129,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:49.166263" elapsed="0.038081"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:49.204398" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:49.204571" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782129,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:49.163310" elapsed="0.041289"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:49.205645" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782129, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:49.205205" elapsed="0.000474"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:49.205736" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:49.205894" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782129, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:49.204841" elapsed="0.001080"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:49.206394" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:49.206172" elapsed="0.000248"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:49.206928" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:49.206614" elapsed="0.000339"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:49.207386" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:49.207126" elapsed="0.000285"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:48:49.208034" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:48:49.207603" elapsed="0.000542">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:48:49.154921" elapsed="0.053366">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.222144" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:50.221748" elapsed="0.000510"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:50.222321" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:48:50.222493" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:50.221348" elapsed="0.001171"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.229197" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:50.228930" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.229665" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:50.229403" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:50.236384" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:50.236444" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:50 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:50 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782130,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:50.236561" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:50.231862" elapsed="0.004728"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:50.229786" elapsed="0.006848"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.236820" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:50.236663" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.229765" elapsed="0.007140"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.240594" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782130,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:50.237959" elapsed="0.002687"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:50.237734" elapsed="0.002947"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.237715" elapsed="0.002991"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.243424" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:50.240992" elapsed="0.002482"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:50.240764" elapsed="0.002745"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.240747" elapsed="0.002787"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.244150" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:50.243740" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.244567" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:50.244298" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.245152" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:50.244817" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:50.244652" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.244279" elapsed="0.000994"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.246035" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:50.245498" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.246530" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:50.246189" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.247326" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:50.246896" elapsed="0.000468"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:50.246670" elapsed="0.000742"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.246153" elapsed="0.001289"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:50.247690" elapsed="0.000536"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:50.248911" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:50.248476" elapsed="0.000542"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:50.249266" elapsed="0.003465"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:50.237283" elapsed="0.015546"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:50.253093" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-10T00:48:50.252936" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.252908" elapsed="0.000314"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.253447" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:50.253575" elapsed="0.000024"/>
</return>
<msg time="2026-04-10T00:48:50.256898" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782130,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:50.222894" elapsed="0.034046"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:50.257017" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:48:50.257202" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782130,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:50.220186" elapsed="0.037044"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.258328" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782130, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:50.257864" elapsed="0.000493"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:50.258414" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:50.258595" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782130, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:50.257481" elapsed="0.001141"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:50.258988" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:50.258803" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.259519" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:50.259192" elapsed="0.000370"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.260010" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:48:50.259741" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:48:50.260250" elapsed="0.000343"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:48:50.209417" elapsed="0.051241"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:48:38.543871" elapsed="11.716842"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:38.543395" elapsed="11.717383"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:38.538653" elapsed="11.722160"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:38.538472" elapsed="11.722375"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.272039" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:50.271700" elapsed="0.000369"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:48:50.272120" elapsed="0.000061"/>
</return>
<msg time="2026-04-10T00:48:50.272306" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:48:50.271312" elapsed="0.001021"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.279056" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:50.278792" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.279506" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:50.279263" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:48:50.286057" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:48:50.286119" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:48:50 GMT', 'Expires': 'Thu, 09 Apr 2026 23:48:50 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782130,"status":200} 
 </msg>
<msg time="2026-04-10T00:48:50.286222" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:48:50.281848" elapsed="0.004401"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:50.279712" elapsed="0.006582"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.286483" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:50.286325" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.279689" elapsed="0.006907"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.290164" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782130,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:50.287663" elapsed="0.002551"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:50.287417" elapsed="0.002833"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.287399" elapsed="0.002875"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.293176" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:50.290572" elapsed="0.002677"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:50.290332" elapsed="0.002967"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.290314" elapsed="0.003019"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.294174" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:50.293600" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.294680" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:50.294317" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.295491" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:50.295051" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:50.294799" elapsed="0.000811"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.294291" elapsed="0.001351"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.296568" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:50.295873" elapsed="0.000737"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.297048" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:50.296713" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.297829" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:50.297386" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:50.297162" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.296687" elapsed="0.001256"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:50.298175" elapsed="0.000521"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:48:50.299319" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:50.298924" elapsed="0.000430"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:48:50.299590" elapsed="0.003348"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:48:50.286983" elapsed="0.016050"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:48:50.303292" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-10T00:48:50.303138" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.303110" 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-04-10T00:48:50.303737" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:48:50.303840" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:48:50.306570" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782130,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:48:50.272724" elapsed="0.033879"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:48:50.306657" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:50.306815" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782130,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:48:50.270843" elapsed="0.035998"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:48:50.306888" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:48:50.307031" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782130,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:48:50.266195" elapsed="0.040862"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.308532" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782130, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:50.307720" elapsed="0.000880"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:48:50.308657" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:48:50.308829" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782130, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:48:50.307315" elapsed="0.001541"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:50.309236" level="INFO">${value} = 10000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:50.309046" elapsed="0.000215"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.309766" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:48:50.309446" elapsed="0.000386"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 10000.</doc>
<status status="PASS" start="2026-04-10T00:48:50.265717" elapsed="0.044175"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:50.261048" elapsed="0.048879"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:50.260905" elapsed="0.049058"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:48:38.439578" elapsed="11.870445"/>
</kw>
<doc>Initiate get operation and check flow count across cluster nodes</doc>
<status status="PASS" start="2026-04-10T00:48:38.003393" elapsed="12.306760"/>
</test>
<test id="s1-s1-t6" name="Verify Flows In Switch Before Cluster Restart" line="81">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:48:50.313735" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:48:50.313447" elapsed="0.000574"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:50.315088" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:50.314958" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.314936" 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-04-10T00:48:50.320492" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:50.320386" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.320367" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.321696" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:50.321189" elapsed="0.000538"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.322195" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:50.321888" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:50.322264" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:48:50.322422" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:50.320812" elapsed="0.001634"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:50.328087" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:50.327947" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.327928" 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-04-10T00:48:50.329330" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:50.329224" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.329207" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:50.329869" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:50.329564" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:50.330276" level="INFO">${current_connection_index} = 32</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:50.330056" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:50.387969" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:50.330818" elapsed="0.057356"/>
</kw>
<msg time="2026-04-10T00:48:50.388400" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:50.388449" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.330461" elapsed="0.058025"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:50.473891" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CB
 "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:50.389185" elapsed="0.084971"/>
</kw>
<msg time="2026-04-10T00:48:50.474387" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:50.474437" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.388751" elapsed="0.085731"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.474960" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:50.474627" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.474588" elapsed="0.000459"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.475598" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CB
 "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:50.475196" elapsed="0.000492"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.475997" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:50.475757" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.475738" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:50.476115" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:50.478856" elapsed="0.000338"/>
</kw>
<msg time="2026-04-10T00:48:50.479259" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:50.477723" elapsed="0.001671"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.479700" elapsed="0.000111"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.480077" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:50.477052" elapsed="0.003212"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:50.476450" elapsed="0.003879"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:50.328921" elapsed="0.151507"/>
</kw>
<msg time="2026-04-10T00:48:50.480523" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:50.480651" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.328309" elapsed="0.152382"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:50.480877" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:50.480769" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.480750" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.481366" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.481728" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:50.481801" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:50.327612" elapsed="0.154297"/>
</kw>
<msg time="2026-04-10T00:48:50.482002" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:50.482045" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.322922" elapsed="0.159160"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.482407" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:50.482156" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.482140" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:50.322776" elapsed="0.159732"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:50.488013" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:50.487904" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.487885" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:50.489234" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:50.489125" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.489108" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:50.489784" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:50.489451" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:50.490194" level="INFO">${current_connection_index} = 32</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:50.489972" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:50.537416" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:50.490739" elapsed="0.047036"/>
</kw>
<msg time="2026-04-10T00:48:50.538103" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:50.538190" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.490379" elapsed="0.047876"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:50.624955" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CB
 "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:50.539253" elapsed="0.085980"/>
</kw>
<msg time="2026-04-10T00:48:50.625473" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:50.625522" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.538638" elapsed="0.086947"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.626081" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:50.625723" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.625685" elapsed="0.000488"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.626848" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CB
 "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:50.626323" elapsed="0.000615"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.627228" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:50.627007" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.626989" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:50.627345" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:50.630086" elapsed="0.000362"/>
</kw>
<msg time="2026-04-10T00:48:50.630512" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:50.628960" elapsed="0.001710"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.630947" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.631295" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:50.628296" elapsed="0.003184"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:50.627715" elapsed="0.003899"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:50.488824" elapsed="0.142889"/>
</kw>
<msg time="2026-04-10T00:48:50.631805" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:50.631850" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.488238" elapsed="0.143649"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:50.632073" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:48:50.631966" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.631947" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.632586" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.632929" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:50.633001" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:50.487528" elapsed="0.145583"/>
</kw>
<msg time="2026-04-10T00:48:50.633205" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:50.633248" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.482799" elapsed="0.150488"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.633662" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:50.633381" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.633360" elapsed="0.000381"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:50.482654" elapsed="0.151110"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:50.639576" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:50.639410" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.639392" elapsed="0.000255"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:50.640809" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:50.640701" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.640683" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:50.641336" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:50.641027" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:50.641823" level="INFO">${current_connection_index} = 32</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:50.641525" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:50.686272" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:50.642358" elapsed="0.044059"/>
</kw>
<msg time="2026-04-10T00:48:50.686620" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:50.686669" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.642014" elapsed="0.044692"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:50.784921" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CB
 "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:50.687285" elapsed="0.098082"/>
</kw>
<msg time="2026-04-10T00:48:50.785834" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:50.785940" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.686909" elapsed="0.099113"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.786887" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:50.786241" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.786181" elapsed="0.000893"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.788214" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CB
 "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:50.787448" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.788763" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:50.788525" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.788506" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:50.788879" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:50.791536" elapsed="0.000171"/>
</kw>
<msg time="2026-04-10T00:48:50.791770" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:50.790471" elapsed="0.001435"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.792187" elapsed="0.000320"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.792900" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:50.789808" elapsed="0.003281"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:50.789207" elapsed="0.003947"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:50.640376" elapsed="0.152875"/>
</kw>
<msg time="2026-04-10T00:48:50.793343" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:50.793387" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.639802" elapsed="0.153620"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:50.793625" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:48:50.793500" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.793482" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.794117" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.794458" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:50.794604" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:50.639051" elapsed="0.155666"/>
</kw>
<msg time="2026-04-10T00:48:50.794812" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:50.794855" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.634041" elapsed="0.160850"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:50.795232" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:50.794966" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.794948" elapsed="0.000363"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:50.633898" elapsed="0.161436"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:50.322593" elapsed="0.472775"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:48:50.320006" elapsed="0.475425"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:48:50.314656" elapsed="0.480834"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.314182" elapsed="0.481355"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:48:50.311232" elapsed="0.484383"/>
</kw>
<kw name="Verify Aggregate Flow From Mininet Session" owner="MininetKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:50.797495" elapsed="0.000155"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:50.797277" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.797259" elapsed="0.000451"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.798139" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:50.797877" elapsed="0.000289"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:50.799088" elapsed="0.000174"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:50.798871" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.798852" elapsed="0.000471"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:50.802741" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:50.799463" elapsed="0.003334"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:48:50.824660" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<msg time="2026-04-10T00:48:50.824793" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:48:50.802957" elapsed="0.021864"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:48:50.824880" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:48:50.825059" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 32 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:48:50.798488" elapsed="0.026599"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:48:50.825711" level="INFO">${flows} = ['10000']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:48:50.825286" elapsed="0.000451"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.826311" level="INFO">${total_flows} = 10000</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:50.825903" elapsed="0.000435"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.826847" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-04-10T00:48:50.826561" elapsed="0.000352"/>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="PASS" start="2026-04-10T00:48:50.796973" elapsed="0.030001"/>
</kw>
<arg>${time_out}</arg>
<arg>2s</arg>
<arg>MininetKeywords.Check Flows In Mininet</arg>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:48:50.796334" elapsed="0.030689"/>
</kw>
<arg>${mininet_conn_id}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${operation_timeout}</arg>
<doc>Verify flow count per switch</doc>
<status status="PASS" start="2026-04-10T00:48:50.795836" elapsed="0.031247"/>
</kw>
<doc>Verify flows are installed in switch before cluster restart.</doc>
<status status="PASS" start="2026-04-10T00:48:50.310595" elapsed="0.516767"/>
</test>
<test id="s1-s1-t7" name="Stop Mininet Connected To Follower Node1 and Exit" line="88">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:48:50.831041" elapsed="0.000236"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:48:50.830774" elapsed="0.000559"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:50.832345" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:50.832233" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.832214" elapsed="0.000202"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:50.837485" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:50.837378" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.837360" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.838562" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:50.838171" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:50.839055" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:50.838752" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:50.839142" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:48:50.839299" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:50.837799" elapsed="0.001524"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:50.844977" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:50.844871" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.844853" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:50.846198" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:50.846095" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:50.846077" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:50.846731" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:50.846410" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:50.847176" level="INFO">${current_connection_index} = 32</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:50.846918" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:50.911723" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:50.847719" elapsed="0.064115"/>
</kw>
<msg time="2026-04-10T00:48:50.912029" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:50.912076" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.847363" elapsed="0.064749"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:51.005475" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[C "a "n "d "[C "E "x "i "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:50.912669" elapsed="0.093085"/>
</kw>
<msg time="2026-04-10T00:48:51.005993" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:51.006042" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.912293" elapsed="0.093789"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.006588" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:51.006214" elapsed="0.000438"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.006172" elapsed="0.000510"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:51.007275" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[C "a "n "d "[C "E "x "i "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:51.006832" elapsed="0.000638"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.007784" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:51.007540" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.007522" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:51.007902" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:51.010610" elapsed="0.000154"/>
</kw>
<msg time="2026-04-10T00:48:51.010827" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:51.009468" elapsed="0.001532"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.011279" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.011636" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:51.008822" elapsed="0.003000"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:51.008227" elapsed="0.003661"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:50.845794" elapsed="0.166192"/>
</kw>
<msg time="2026-04-10T00:48:51.012080" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:51.012124" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.845198" elapsed="0.166962"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:51.012348" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:51.012242" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.012224" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.012864" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.013210" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:51.013282" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:50.844518" elapsed="0.168875"/>
</kw>
<msg time="2026-04-10T00:48:51.013488" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:51.013531" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.839721" elapsed="0.173866"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.013916" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:51.013665" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.013648" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:50.839574" elapsed="0.174443"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:51.019463" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:51.019357" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.019339" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:51.020825" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:51.020717" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.020699" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:51.021339" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:51.021040" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:51.021751" level="INFO">${current_connection_index} = 32</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:51.021521" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:51.055560" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:51.022270" elapsed="0.033572"/>
</kw>
<msg time="2026-04-10T00:48:51.056040" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:51.056087" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:51.021936" elapsed="0.034188"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:51.178380" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[C "a "n "d "[C "E "x "i "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:51.056716" elapsed="0.122007"/>
</kw>
<msg time="2026-04-10T00:48:51.179078" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:51.179180" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:51.056320" elapsed="0.122939"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.180020" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:51.179456" elapsed="0.000691"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.179408" elapsed="0.000796"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:51.181234" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[C "a "n "d "[C "E "x "i "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:51.180530" elapsed="0.000898"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.182502" elapsed="0.000111"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:51.182012" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.181535" elapsed="0.001214"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:51.182823" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:51.185617" elapsed="0.000144"/>
</kw>
<msg time="2026-04-10T00:48:51.185823" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:51.184452" elapsed="0.001500"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.186224" elapsed="0.000109"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.186642" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:51.183830" elapsed="0.002994"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:51.183269" elapsed="0.003618"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:51.020361" elapsed="0.166622"/>
</kw>
<msg time="2026-04-10T00:48:51.187075" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:51.187118" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:51.019802" elapsed="0.167355"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:51.187341" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:51.187236" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.187218" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.187833" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.188166" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:51.188236" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:51.019016" elapsed="0.169325"/>
</kw>
<msg time="2026-04-10T00:48:51.188482" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:51.188527" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:51.014302" elapsed="0.174340"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.188971" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:51.188721" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.188704" elapsed="0.000343"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:51.014156" elapsed="0.174914"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:51.194741" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:51.194626" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.194605" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:51.195992" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:51.195884" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.195867" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:51.196513" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:51.196207" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:51.196934" level="INFO">${current_connection_index} = 32</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:51.196722" elapsed="0.000238"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:51.235650" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:51.197450" elapsed="0.038421"/>
</kw>
<msg time="2026-04-10T00:48:51.236226" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:51.236327" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:51.197118" elapsed="0.039288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:51.313266" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[C "a "n "d "[C "E "x "i "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:51.237667" elapsed="0.075730"/>
</kw>
<msg time="2026-04-10T00:48:51.313579" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:51.313630" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:51.236827" elapsed="0.076840"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.313992" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:51.313747" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.313727" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:51.314602" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[C "a "n "d "[C "E "x "i "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:51.314222" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.314982" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:51.314760" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.314741" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:51.315092" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:51.318097" elapsed="0.000146"/>
</kw>
<msg time="2026-04-10T00:48:51.318305" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:51.316963" elapsed="0.001505"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.318819" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.319158" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:51.316271" elapsed="0.003074"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:51.315380" elapsed="0.004031"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:51.195582" elapsed="0.123926"/>
</kw>
<msg time="2026-04-10T00:48:51.319619" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:51.319667" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:51.194973" elapsed="0.124732"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:51.319890" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:51.319783" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.319764" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.320374" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.320731" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:51.320806" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:51.194203" elapsed="0.126713"/>
</kw>
<msg time="2026-04-10T00:48:51.321009" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:51.321060" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:51.189334" elapsed="0.131776"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.321448" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:51.321191" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.321173" elapsed="0.000352"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:51.189194" elapsed="0.132371"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:50.839381" elapsed="0.482220"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:48:50.837013" elapsed="0.484647"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:48:50.831943" elapsed="0.489773"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:50.831486" elapsed="0.490277"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:48:50.828306" elapsed="0.493511"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:51.327169" elapsed="0.000138"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:51.326945" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.326927" elapsed="0.000441"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:51.329222" level="INFO">exit</msg>
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:51.327508" elapsed="0.001816"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:48:51.465379" level="INFO">*** Stopping 1 controllers
c0 
*** Stopping 1 links
.
*** Stopping 1 switches
s1 
*** Stopping 1 hosts
h1 
*** Done
completed in 16.264 seconds
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:48:51.329493" elapsed="0.136078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:51.465886" elapsed="0.000315"/>
</kw>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="PASS" start="2026-04-10T00:48:51.326673" elapsed="0.139601"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:51.469087" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:51.468764" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:51.468736" elapsed="0.000549"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:51.469622" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:51.469443" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:51.470343" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:51.469916" elapsed="0.000474"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:51.470948" level="INFO">${conn_id} = 33</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:51.470567" elapsed="0.000407"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:51.471912" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:48:51.471990" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:51.471619" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:51.472179" elapsed="0.000618"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:48:51.473662" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:48:51.834450" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:48:35 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:48:51.473330" elapsed="0.361293"/>
</kw>
<msg time="2026-04-10T00:48:51.834710" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:51.472969" elapsed="0.361825"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:48:51.471194" elapsed="0.363716"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:48:51.835419" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:48:53.001800" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:48:53.002327" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:48:53.002434" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:48:51.835167" elapsed="1.167328"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:53.003163" elapsed="0.000737"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:53.005179" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:53.004397" elapsed="0.000907"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:53.005900" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:53.005511" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.005447" elapsed="0.000633"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:48:53.006443" elapsed="0.000080"/>
</return>
<status status="PASS" start="2026-04-10T00:48:53.006201" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.006166" elapsed="0.000517"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:53.006766" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:53.012966" elapsed="0.000405"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:53.015110" elapsed="0.000828"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:53.016360" elapsed="0.000304"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:53.007588" elapsed="0.009230"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:48:51.468191" elapsed="1.548941"/>
</kw>
<msg time="2026-04-10T00:48:53.017298" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:51.467522" elapsed="1.549944"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:48:51.466997" elapsed="1.550731"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.023237" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:53.022480" elapsed="0.000919"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.022419" elapsed="0.001066"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.024364" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:53.023993" elapsed="0.000817"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:53.026061" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:53.025166" elapsed="0.001000"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.027403" level="INFO">${conn_id} = 35</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:53.026532" elapsed="0.000942"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:53.029290" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:48:53.029368" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:53.028967" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:53.029571" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.030765" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:48:53.348174" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:48:51 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:48:53.030428" elapsed="0.318054"/>
</kw>
<msg time="2026-04-10T00:48:53.348700" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:53.030071" elapsed="0.318831"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:48:53.028079" elapsed="0.321102"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.350227" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:48:53.383528" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:48:53.383746" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:48:53.383792" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:48:53.349732" elapsed="0.034176"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:53.384156" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:53.385101" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:53.384739" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:53.385414" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:53.385246" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.385214" elapsed="0.000278"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:48:53.385689" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:48:53.385577" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.385530" elapsed="0.000252"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:53.385817" elapsed="0.000014"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:53.388814" elapsed="0.000342"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:53.389328" elapsed="0.000170"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:53.389664" elapsed="0.000100"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:53.386179" elapsed="0.003639"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:48:53.021195" elapsed="0.368715"/>
</kw>
<msg time="2026-04-10T00:48:53.389967" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:53.019574" elapsed="0.370447"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:48:53.018258" elapsed="0.371847"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:51.466541" elapsed="1.923622"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="PASS" start="2026-04-10T00:48:50.827722" elapsed="2.562559"/>
</test>
<test id="s1-s1-t8" name="Start Mininet Reconnect To Follower Node1" line="93">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:48:53.393976" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:48:53.393711" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:53.395304" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:53.395157" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.395139" 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-04-10T00:48:53.400589" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:53.400459" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.400440" elapsed="0.000217"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:53.401670" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:53.401265" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:53.402164" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:53.401860" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:53.402233" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:53.402388" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:53.400888" elapsed="0.001524"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:53.408045" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:53.407938" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.407919" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:53.409298" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:53.409191" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.409172" elapsed="0.000238"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:53.409895" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:53.409586" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.410302" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:53.410085" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.452540" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:53.410855" elapsed="0.041941"/>
</kw>
<msg time="2026-04-10T00:48:53.453037" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:53.453088" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:53.410491" elapsed="0.042636"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.519413" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "R "e "c "o "n "n "e "c "[78Ct "[A[78C
 "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:53.453948" elapsed="0.065780"/>
</kw>
<msg time="2026-04-10T00:48:53.519995" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:53.520048" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:53.453439" elapsed="0.066649"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.520635" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:53.520226" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.520183" elapsed="0.000548"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:53.521319" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "R "e "c "o "n "n "e "c "[78Ct "[A[78C
 "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:53.520887" elapsed="0.000523"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.521725" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:53.521481" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.521462" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:53.521842" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:53.523488" elapsed="0.000835"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:53.524629" elapsed="0.000504"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:53.525410" elapsed="0.000394"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:53.522795" elapsed="0.003114"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:53.522183" elapsed="0.003792"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:53.408887" elapsed="0.117191"/>
</kw>
<msg time="2026-04-10T00:48:53.526176" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:53.526222" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:53.408265" elapsed="0.117996"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:53.526453" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:48:53.526343" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.526323" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.527011" 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-04-10T00:48:53.527469" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:53.527560" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:53.407601" elapsed="0.120078"/>
</kw>
<msg time="2026-04-10T00:48:53.527779" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:53.527823" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:53.402816" elapsed="0.125045"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.528226" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:53.527941" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.527923" elapsed="0.000387"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:53.402667" elapsed="0.125667"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:53.534022" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:53.533913" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.533893" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:53.535265" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:53.535157" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.535139" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:53.535810" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:53.535485" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.536211" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:53.535997" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.574491" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:53.536757" elapsed="0.037963"/>
</kw>
<msg time="2026-04-10T00:48:53.574966" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:53.575014" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:53.536396" elapsed="0.038655"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.642940" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "R "e "c "o "n "n "e "c "[78Ct "[A[78C
 "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:53.575781" elapsed="0.067458"/>
</kw>
<msg time="2026-04-10T00:48:53.643507" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:53.643585" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:53.575307" elapsed="0.068317"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.644130" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:53.643767" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.643728" elapsed="0.000491"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:53.644813" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "R "e "c "o "n "n "e "c "[78Ct "[A[78C
 "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:53.644376" elapsed="0.000525"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.645187" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:53.644969" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.644951" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:53.645301" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:53.647461" elapsed="0.000838"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:53.648623" elapsed="0.000484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:53.649376" elapsed="0.000388"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:53.646534" elapsed="0.003331"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:53.645651" elapsed="0.004281"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:53.534827" elapsed="0.115208"/>
</kw>
<msg time="2026-04-10T00:48:53.650141" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:53.650195" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:53.534246" elapsed="0.115987"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:53.650451" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:48:53.650334" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.650307" elapsed="0.000280"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.651141" elapsed="0.000032"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.651499" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:53.651596" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:53.533414" elapsed="0.118297"/>
</kw>
<msg time="2026-04-10T00:48:53.651808" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:53.651853" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:53.528645" elapsed="0.123246"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.652224" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:53.651969" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.651951" elapsed="0.000351"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:53.528479" elapsed="0.123847"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:53.657951" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:53.657840" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.657822" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:53.659237" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:53.659130" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.659112" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:53.659793" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:53.659452" elapsed="0.000367"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.660194" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:53.659981" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.699530" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:53.660740" elapsed="0.039024"/>
</kw>
<msg time="2026-04-10T00:48:53.699996" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:53.700045" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:53.660380" elapsed="0.039701"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.763673" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "R "e "c "o "n "n "e "c "[78Ct "[A[78C
 "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:53.700790" elapsed="0.063186"/>
</kw>
<msg time="2026-04-10T00:48:53.764168" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:53.764216" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:53.700320" elapsed="0.063933"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.764712" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:53.764378" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.764335" elapsed="0.000464"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:53.765304" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "R "e "c "o "n "n "e "c "[78Ct "[A[78C
 "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:53.764943" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.765703" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:53.765461" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.765443" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:53.765820" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:53.767428" elapsed="0.000794"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:53.768504" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:53.769259" elapsed="0.000383"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:53.766779" elapsed="0.002965"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:53.766144" elapsed="0.003665"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:53.658792" elapsed="0.111117"/>
</kw>
<msg time="2026-04-10T00:48:53.770006" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:53.770051" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:53.658175" elapsed="0.111915"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:53.770276" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:48:53.770169" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.770151" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.770817" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.771437" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:53.771513" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:53.657467" elapsed="0.114173"/>
</kw>
<msg time="2026-04-10T00:48:53.771736" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:53.771780" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:53.652630" elapsed="0.119187"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.772147" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:53.771895" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.771877" elapsed="0.000346"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:53.652458" elapsed="0.119789"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:53.402471" elapsed="0.369811"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:48:53.399948" elapsed="0.372394"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:48:53.394847" elapsed="0.377600"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:53.394395" elapsed="0.378101"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:48:53.391349" elapsed="0.381221"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:53.775685" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:53.775434" elapsed="0.000299"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:53.778322" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:53.778057" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:53.778040" elapsed="0.000363"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.778751" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:53.778568" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:53.779410" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:53.779034" elapsed="0.000421"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.780046" level="INFO">${conn_id} = 40</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:53.779628" elapsed="0.000448"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:53.781235" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:48:53.781336" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:53.780880" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:53.781598" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:48:53.783216" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:48:54.141366" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:48:53 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:48:53.782788" elapsed="0.358744"/>
</kw>
<msg time="2026-04-10T00:48:54.141635" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:53.782251" elapsed="0.359465"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:48:53.780360" elapsed="0.361479"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:48:54.142344" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:48:55.287851" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:48:55.288202" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:48:55.288302" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:48:54.142079" elapsed="1.146279"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:55.288895" elapsed="0.000553"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:55.290523" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:55.289899" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:55.291279" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:55.290988" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:55.290940" elapsed="0.000499"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:48:55.291821" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-04-10T00:48:55.291587" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:55.291522" elapsed="0.000492"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:55.292091" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:55.298093" elapsed="0.000491"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:55.298833" elapsed="0.000229"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:55.299284" 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-04-10T00:48:55.292844" elapsed="0.006660"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:48:53.777393" elapsed="1.522275"/>
</kw>
<msg time="2026-04-10T00:48:55.299751" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:53.776849" elapsed="1.522978"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:48:53.776291" elapsed="1.523653"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:55.303040" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:55.302644" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:55.302618" elapsed="0.000542"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:55.303597" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:55.303381" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:55.304595" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:55.304011" elapsed="0.000655"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:55.305449" level="INFO">${conn_id} = 42</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:55.304916" elapsed="0.000571"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:55.306847" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:48:55.306961" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:55.306424" elapsed="0.000573"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:55.307231" elapsed="0.000488"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:48:55.309057" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:48:55.627956" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:48:54 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:48:55.308495" elapsed="0.319667"/>
</kw>
<msg time="2026-04-10T00:48:55.628354" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:55.307970" elapsed="0.320492"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:48:55.305827" elapsed="0.322781"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:48:55.629103" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:48:55.661396" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:48:55.661697" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:48:55.661800" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:48:55.628860" elapsed="0.032990"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:55.662235" elapsed="0.000500"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:55.663979" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:55.663232" elapsed="0.000846"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:55.664656" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:55.664258" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:55.664209" elapsed="0.000610"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:48:55.665174" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-04-10T00:48:55.664938" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:55.664903" elapsed="0.000461"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:48:55.665440" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:55.671072" elapsed="0.000468"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:55.671810" elapsed="0.000224"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:55.672246" elapsed="0.000175"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:55.666193" elapsed="0.006309"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:48:55.301845" elapsed="0.370838"/>
</kw>
<msg time="2026-04-10T00:48:55.672762" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:55.301010" elapsed="0.371825"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:48:55.300209" elapsed="0.372738"/>
</kw>
<arg>${mininet}</arg>
<status status="PASS" start="2026-04-10T00:48:53.775937" elapsed="1.897090"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:55.681653" level="INFO">${tools_connection} = 44</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:55.681074" elapsed="0.000605"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:55.683398" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:48:55.683476" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:55.683121" elapsed="0.000379"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:55.683672" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:48:55.684864" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:48:56.003390" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:48:55 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:48:55.684531" elapsed="0.319006"/>
</kw>
<msg time="2026-04-10T00:48:56.003720" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:55.684158" elapsed="0.319647"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:48:55.682642" elapsed="0.321276"/>
</kw>
<msg time="2026-04-10T00:48:56.003969" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:55.682239" elapsed="0.321819"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:48:55.681865" elapsed="0.322271"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-10T00:48:56.004190" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:48:56.004404" level="INFO">${mininet_conn_id} = 44</msg>
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-10T00:48:55.679887" elapsed="0.324541"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:56.005348" level="INFO">${mininet_conn_id} = 44</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:56.004922" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.007689" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:56.005474" elapsed="0.002273"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.005451" elapsed="0.002321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:56.008261" level="INFO">Start mininet --topo linear,1 to 10.30.170.165</msg>
<arg>Start mininet ${options} to ${controller}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:56.007933" elapsed="0.000375"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:56.010841" level="INFO">sudo mn --controller 'remote,ip=10.30.170.165,port=6633' --topo linear,1 --switch ovsk,protocols=OpenFlow13</msg>
<arg>sudo mn --controller 'remote,ip=${controller},port=${ofport}' ${options} --switch ovsk,protocols=OpenFlow${ofversion}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:56.008474" elapsed="0.002425"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:48:56.204957" level="INFO">[?2004l*** Creating network
*** Adding controller
*** Adding hosts:
h1 
*** Adding switches:
s1 
*** Adding links:
(h1, s1) 
*** Configuring hosts
h1 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:48:56.011057" elapsed="0.194043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:56.205755" level="INFO">Check OVS configuratiom</msg>
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:56.205400" elapsed="0.000403"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:56.207325" level="INFO">sh ovs-vsctl show</msg>
<arg>sh ovs-vsctl show</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:56.205981" elapsed="0.001404"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:48:56.215725" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Bridge s1
        Controller "tcp:10.30.170.165:6633"
        Controller "ptcp:6654"
        fail_mode: secure
        Port s1-eth1
            Interface s1-eth1
        Port s1
            Interface s1
                type: internal
    ovs_version: "2.17.11"
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:48:56.207589" elapsed="0.008273"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="PASS" start="2026-04-10T00:48:56.215923" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:48:56.216155" level="INFO">${mininet_conn_id} = 44</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${Follower_Node_1}_IP}</arg>
<arg>--topo linear,${switch_count}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="PASS" start="2026-04-10T00:48:53.772888" elapsed="2.443293"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:56.216746" level="INFO">${mininet_conn_id} = 44</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:48:56.216389" elapsed="0.000400"/>
</kw>
<doc>Start mininet with reconnection to follower node1.</doc>
<status status="PASS" start="2026-04-10T00:48:53.390729" elapsed="2.826183"/>
</test>
<test id="s1-s1-t9" name="Verify Flows In Switch Reconnected To Follower Node1" line="101">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:48:56.220717" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:48:56.220429" elapsed="0.000561"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:56.222044" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:56.221910" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.221888" elapsed="0.000226"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:56.227169" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:56.227055" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.227036" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:56.228304" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:56.227901" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:56.228909" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:56.228590" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:56.228982" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:48:56.229148" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:56.227479" elapsed="0.001694"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:56.236710" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:56.236596" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.236575" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:56.237993" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:56.237885" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.237867" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:56.238517" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:56.238209" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:56.238949" level="INFO">${current_connection_index} = 44</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:56.238726" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:56.274499" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:56.239479" elapsed="0.035146"/>
</kw>
<msg time="2026-04-10T00:48:56.274798" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:56.274844" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:56.239138" elapsed="0.035743"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:56.345207" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CR
 "e "c "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:56.275412" elapsed="0.069989"/>
</kw>
<msg time="2026-04-10T00:48:56.345668" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:56.345738" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:56.275062" elapsed="0.070729"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.346260" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:56.345913" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.345883" elapsed="0.000495"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:56.347057" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CR
 "e "c "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:56.346611" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.347625" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:56.347284" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.347258" elapsed="0.000535"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:56.347843" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:56.350700" elapsed="0.000154"/>
</kw>
<msg time="2026-04-10T00:48:56.350918" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:56.349507" elapsed="0.001547"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.351329" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.351766" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:56.348872" elapsed="0.003083"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:56.348252" elapsed="0.003767"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:56.237577" elapsed="0.114538"/>
</kw>
<msg time="2026-04-10T00:48:56.352211" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:56.352255" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:56.236938" elapsed="0.115353"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:56.352494" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:48:56.352375" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.352354" elapsed="0.000249"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.353022" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.353361" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:56.353433" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:56.236229" elapsed="0.117482"/>
</kw>
<msg time="2026-04-10T00:48:56.353810" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:56.353855" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:56.229574" elapsed="0.124318"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.354218" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:56.353968" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.353951" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:56.229410" elapsed="0.124908"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:56.360098" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:56.359992" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.359973" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:56.361306" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:56.361200" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.361182" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:56.361843" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:56.361519" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:56.362242" level="INFO">${current_connection_index} = 44</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:56.362029" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:56.394324" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:56.362783" elapsed="0.031827"/>
</kw>
<msg time="2026-04-10T00:48:56.395003" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:56.395114" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:56.362429" elapsed="0.032772"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:56.463164" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CR
 "e "c "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:56.396519" elapsed="0.066795"/>
</kw>
<msg time="2026-04-10T00:48:56.463486" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:56.463651" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:56.395780" elapsed="0.067913"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.464045" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:56.463790" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.463764" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:56.464610" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CR
 "e "c "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:56.464272" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.464987" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:56.464767" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.464749" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:56.465102" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:56.467834" elapsed="0.000154"/>
</kw>
<msg time="2026-04-10T00:48:56.468051" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:56.466659" elapsed="0.001527"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.468468" elapsed="0.000106"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.468842" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:56.465996" elapsed="0.003032"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:56.465400" elapsed="0.003694"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:56.360901" elapsed="0.108292"/>
</kw>
<msg time="2026-04-10T00:48:56.469287" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:56.469331" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:56.360317" elapsed="0.109052"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:56.469672" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:48:56.469445" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.469428" elapsed="0.000335"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.470225" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.470615" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:56.470695" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:56.359610" elapsed="0.111201"/>
</kw>
<msg time="2026-04-10T00:48:56.470910" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:56.470956" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:56.354606" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.471329" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:56.471074" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.471055" elapsed="0.000354"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:56.354448" elapsed="0.116988"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:56.478699" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:56.478510" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.478482" 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-04-10T00:48:56.480400" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:56.480288" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.480268" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:56.481031" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:56.480669" elapsed="0.000397"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:56.481477" level="INFO">${current_connection_index} = 44</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:56.481248" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:56.530286" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:56.482042" elapsed="0.048354"/>
</kw>
<msg time="2026-04-10T00:48:56.530600" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:56.530649" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:56.481687" elapsed="0.048999"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:56.608409" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CR
 "e "c "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:56.531222" elapsed="0.077403"/>
</kw>
<msg time="2026-04-10T00:48:56.608824" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:56.608872" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:56.530868" elapsed="0.078042"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.609316" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:56.609020" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.608989" elapsed="0.000411"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:56.609929" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CR
 "e "c "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:56.609578" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.610308" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:56.610089" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.610071" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:56.610421" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:56.613203" elapsed="0.000151"/>
</kw>
<msg time="2026-04-10T00:48:56.613415" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:56.611989" elapsed="0.001580"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.613850" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.614183" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:56.611313" elapsed="0.003054"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:56.610752" elapsed="0.003682"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:56.479923" elapsed="0.134671"/>
</kw>
<msg time="2026-04-10T00:48:56.614694" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:56.614738" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:56.479131" elapsed="0.135660"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:56.615052" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:48:56.614943" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.614923" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.615570" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.615912" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:56.615983" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:56.477961" elapsed="0.138132"/>
</kw>
<msg time="2026-04-10T00:48:56.616205" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:56.616251" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:56.471770" elapsed="0.144518"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:56.616634" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:56.616363" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.616347" elapsed="0.000363"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:56.471623" elapsed="0.145112"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:56.229232" elapsed="0.387535"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:48:56.226678" elapsed="0.390148"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:48:56.221608" elapsed="0.395276"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:56.221146" 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-04-10T00:48:56.218061" elapsed="0.398929"/>
</kw>
<kw name="Verify Aggregate Flow From Mininet Session" owner="MininetKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:56.618897" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:56.618676" elapsed="0.000621"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.618658" elapsed="0.000665"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:56.619825" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:56.619531" elapsed="0.000321"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:56.620713" elapsed="0.000136"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:56.620477" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:56.620460" elapsed="0.000449"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:56.622985" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:56.621048" elapsed="0.001992"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:48:56.647842" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<msg time="2026-04-10T00:48:56.647945" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:48:56.623197" elapsed="0.024776"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:48:56.648020" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:48:56.648180" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 44 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:48:56.620177" elapsed="0.028030"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:48:56.648644" level="INFO">${flows} = ['0']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:48:56.648374" elapsed="0.000295"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:56.649208" level="INFO">${total_flows} = 0</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:56.648833" elapsed="0.000401"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:48:56.649773" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-04-10T00:48:56.649877" level="FAIL">0.0 != 10000.0</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-04-10T00:48:56.649467" elapsed="0.000486">0.0 != 10000.0</status>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="FAIL" start="2026-04-10T00:48:56.618352" elapsed="0.031712">0.0 != 10000.0</status>
</kw>
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:58.652236" elapsed="0.000278"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:58.651756" elapsed="0.000846"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.651717" elapsed="0.000919"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:48:58.653253" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:48:58.652884" elapsed="0.000404"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:58.654392" elapsed="0.000212"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:58.654089" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.654063" elapsed="0.000624"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:58.657688" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:58.654887" elapsed="0.002882"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:48:58.687210" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<msg time="2026-04-10T00:48:58.687375" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:48:58.657998" elapsed="0.029407"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:48:58.687475" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:48:58.687710" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 44 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:48:58.653703" elapsed="0.034036"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:48:58.688278" level="INFO">${flows} = ['10000']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:48:58.687947" elapsed="0.000359"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:48:58.688943" level="INFO">${total_flows} = 10000</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:48:58.688474" elapsed="0.000497"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:48:58.689483" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-04-10T00:48:58.689186" elapsed="0.000364"/>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="PASS" start="2026-04-10T00:48:58.651019" elapsed="0.038610"/>
</kw>
<arg>${time_out}</arg>
<arg>2s</arg>
<arg>MininetKeywords.Check Flows In Mininet</arg>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:48:56.617716" elapsed="2.071966"/>
</kw>
<arg>${mininet_conn_id}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${operation_timeout}</arg>
<doc>Verify flow count per switch</doc>
<status status="PASS" start="2026-04-10T00:48:56.617204" elapsed="2.072543"/>
</kw>
<doc>Verify 10000 flows per DPN installed in switch after it is reconnected to follower node1.</doc>
<status status="PASS" start="2026-04-10T00:48:56.217374" elapsed="2.472501"/>
</test>
<test id="s1-s1-t10" name="Stop Mininet Connected To Follower Node1" line="108">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:48:58.693578" elapsed="0.000233"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:48:58.693287" 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-04-10T00:48:58.694904" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:58.694788" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.694768" elapsed="0.000207"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:58.700096" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:58.699989" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.699970" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:48:58.701229" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:48:58.700828" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:48:58.701757" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:48:58.701428" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:48:58.701828" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:48:58.702050" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:48:58.700421" elapsed="0.001654"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:58.707532" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:58.707423" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.707404" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:58.708960" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:58.708850" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.708832" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:58.709507" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:58.709195" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:58.709975" level="INFO">${current_connection_index} = 44</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:58.709721" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:58.748466" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:58.710525" elapsed="0.038228"/>
</kw>
<msg time="2026-04-10T00:48:58.749165" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:58.749267" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:58.710178" elapsed="0.039170"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:58.840378" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:58.750594" elapsed="0.090060"/>
</kw>
<msg time="2026-04-10T00:48:58.840883" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:58.840931" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:58.749780" elapsed="0.091189"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:58.841413" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:58.841083" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.841051" elapsed="0.000447"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:58.842116" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:58.841679" elapsed="0.000525"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:58.842493" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:58.842273" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.842255" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:58.842630" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:58.845240" elapsed="0.000147"/>
</kw>
<msg time="2026-04-10T00:48:58.845448" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:58.844202" elapsed="0.001498"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:58.846036" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:58.846376" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:58.843537" elapsed="0.003051"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:58.842957" elapsed="0.003699"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:58.708511" elapsed="0.138303"/>
</kw>
<msg time="2026-04-10T00:48:58.846910" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:58.846953" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:58.707808" elapsed="0.139183"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:58.847177" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:48:58.847068" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.847049" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:58.847700" elapsed="0.000032"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:58.848060" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:58.848133" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:58.707084" elapsed="0.141159"/>
</kw>
<msg time="2026-04-10T00:48:58.848340" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:58.848384" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:58.702458" elapsed="0.145963"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:58.848776" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:58.848496" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.848479" elapsed="0.000375"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:48:58.702311" elapsed="0.146566"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:58.854637" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:58.854475" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.854456" elapsed="0.000251"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:58.855857" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:58.855750" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.855733" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:58.856371" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:58.856071" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:58.856867" level="INFO">${current_connection_index} = 44</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:58.856618" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:58.894368" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:58.857435" elapsed="0.037185"/>
</kw>
<msg time="2026-04-10T00:48:58.894985" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:58.895032" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:58.857074" elapsed="0.037996"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:58.961896" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:58.895697" elapsed="0.066377"/>
</kw>
<msg time="2026-04-10T00:48:58.962266" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:58.962315" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:58.895271" elapsed="0.067081"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:58.962860" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:58.962541" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.962507" elapsed="0.000440"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:58.963873" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:58.963155" elapsed="0.000815"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:58.964311" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:58.964067" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.964036" elapsed="0.000356"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:58.964428" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:58.967244" elapsed="0.000181"/>
</kw>
<msg time="2026-04-10T00:48:58.967492" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:58.966012" elapsed="0.001647"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:58.967944" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:58.968288" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:58.965354" elapsed="0.003123"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:58.964762" elapsed="0.003783"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:58.855421" elapsed="0.113243"/>
</kw>
<msg time="2026-04-10T00:48:58.968760" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:58.968805" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:58.854861" elapsed="0.113981"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:58.969032" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:58.968922" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.968904" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:58.969528" elapsed="0.000044"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:58.969889" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:58.969962" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:58.854127" elapsed="0.115945"/>
</kw>
<msg time="2026-04-10T00:48:58.970168" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:58.970212" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:58.849153" elapsed="0.121095"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:58.970598" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:58.970326" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.970308" elapsed="0.000371"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:48:58.849009" elapsed="0.121694"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:58.976505" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:58.976393" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.976373" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:48:58.977754" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:48:58.977646" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:58.977628" elapsed="0.000240"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:48:58.978384" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:48:58.978030" elapsed="0.000389"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:58.978917" level="INFO">${current_connection_index} = 44</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:58.978658" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:59.017289" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:58.979675" elapsed="0.037742"/>
</kw>
<msg time="2026-04-10T00:48:59.017620" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:48:59.017671" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:58.979162" elapsed="0.038547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:48:59.085221" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:48:59.018270" elapsed="0.067210"/>
</kw>
<msg time="2026-04-10T00:48:59.085758" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:48:59.085808" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:59.017900" elapsed="0.067946"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:59.086337" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:59.085972" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:59.085935" elapsed="0.000494"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:59.086994" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:59.086601" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:59.087373" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:59.087152" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:59.087133" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:48:59.087489" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:59.090726" elapsed="0.000151"/>
</kw>
<msg time="2026-04-10T00:48:59.090940" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:59.089491" elapsed="0.001581"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:59.091349" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:59.091710" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:48:59.088830" elapsed="0.003064"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:48:59.087858" elapsed="0.004101"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:48:58.977318" elapsed="0.114739"/>
</kw>
<msg time="2026-04-10T00:48:59.092151" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:59.092195" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:58.976752" elapsed="0.115479"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:48:59.092461" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:48:59.092308" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:59.092290" 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-04-10T00:48:59.092970" elapsed="0.000080"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:59.093371" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:48:59.093444" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:48:58.975999" elapsed="0.117576"/>
</kw>
<msg time="2026-04-10T00:48:59.093673" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:48:59.093717" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:58.970986" elapsed="0.122769"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:59.094084" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:59.093830" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:59.093813" elapsed="0.000349"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:48:58.970838" elapsed="0.123348"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:48:58.702134" elapsed="0.392086"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:48:58.699626" elapsed="0.394652"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:48:58.694469" elapsed="0.399869"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:48:58.694027" elapsed="0.400358"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:48:58.690781" elapsed="0.403659"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:48:59.099424" elapsed="0.000210"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:59.099200" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:59.099182" elapsed="0.000515"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:48:59.101462" level="INFO">exit</msg>
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:48:59.099839" elapsed="0.001679"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:48:59.242405" level="INFO">*** Stopping 1 controllers
c0 
*** Stopping 1 links
.
*** Stopping 1 switches
s1 
*** Stopping 1 hosts
h1 
*** Done
completed in 3.176 seconds
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:48:59.101704" elapsed="0.140891"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:48:59.242921" elapsed="0.000257"/>
</kw>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="PASS" start="2026-04-10T00:48:59.098926" elapsed="0.144327"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:48:59.246183" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:48:59.245768" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-04-10T00:48:59.245741" elapsed="0.000533"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:59.246618" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:48:59.246434" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:48:59.247302" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:48:59.246916" elapsed="0.000433"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:48:59.247914" level="INFO">${conn_id} = 45</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:48:59.247511" elapsed="0.000430"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:48:59.249166" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:48:59.249244" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:48:59.248570" elapsed="0.000699"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:59.249501" elapsed="0.000358"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:48:59.250775" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:48:59.571648" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:48:55 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:48:59.250436" elapsed="0.321394"/>
</kw>
<msg time="2026-04-10T00:48:59.571921" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:59.250075" elapsed="0.321939"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:48:59.248159" elapsed="0.323985"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:48:59.572740" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:49:00.779665" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:49:00.780136" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:00.780256" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:48:59.572437" elapsed="1.207885"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:00.780987" elapsed="0.000670"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:00.782935" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:00.782139" elapsed="0.000934"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:00.783643" elapsed="0.000058"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:00.783268" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:00.783214" elapsed="0.000715"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:00.784334" elapsed="0.000072"/>
</return>
<status status="PASS" start="2026-04-10T00:49:00.784066" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:00.784027" elapsed="0.000554"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:00.784698" elapsed="0.000046"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:00.789179" elapsed="0.000582"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:00.790050" elapsed="0.000254"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:00.790533" elapsed="0.000185"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:00.785253" elapsed="0.005548"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:48:59.245198" elapsed="1.545759"/>
</kw>
<msg time="2026-04-10T00:49:00.791044" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:48:59.244513" elapsed="1.546613"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:48:59.243985" elapsed="1.547265"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:00.794059" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:00.793752" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:00.793730" elapsed="0.000418"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:00.794452" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:00.794307" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:00.795178" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:00.794772" elapsed="0.000455"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:00.795783" level="INFO">${conn_id} = 47</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:00.795389" elapsed="0.000421"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:00.797089" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:00.797175" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:00.796769" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:00.797364" elapsed="0.000361"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:00.798624" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:01.165115" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:48:59 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:00.798279" elapsed="0.367051"/>
</kw>
<msg time="2026-04-10T00:49:01.165434" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:00.797899" elapsed="0.367635"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:00.796069" elapsed="0.369645"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:01.166294" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:49:01.199376" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:49:01.199713" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:01.199825" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:01.166007" elapsed="0.033873"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:01.200322" elapsed="0.000658"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:01.202182" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:01.201445" elapsed="0.000837"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:01.202852" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:01.202484" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.202427" elapsed="0.000650"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:01.203532" elapsed="0.000107"/>
</return>
<status status="PASS" start="2026-04-10T00:49:01.203234" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.203194" elapsed="0.000589"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:01.203864" elapsed="0.000034"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:01.209174" 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-04-10T00:49:01.209901" elapsed="0.000227"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:01.210535" elapsed="0.000186"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:01.204694" elapsed="0.006105"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:00.793178" elapsed="0.417753"/>
</kw>
<msg time="2026-04-10T00:49:01.211009" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:00.792511" elapsed="0.418602"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:49:00.791669" elapsed="0.419625"/>
</kw>
<status status="PASS" start="2026-04-10T00:48:59.243529" elapsed="1.967847"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="PASS" start="2026-04-10T00:48:58.690206" elapsed="2.521323"/>
</test>
<test id="s1-s1-t11" name="Start Mininet Connect To Follower Node2" line="113">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:49:01.216501" elapsed="0.000234"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:49:01.216226" elapsed="0.000565"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:01.217813" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:01.217702" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.217682" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:01.222950" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:01.222842" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.222824" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:01.224070" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:01.223681" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:01.224586" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:01.224261" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:01.224659" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:01.224816" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:01.223285" elapsed="0.001556"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:01.230252" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:01.230144" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.230125" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:01.231583" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:01.231440" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.231422" elapsed="0.000233"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:01.232105" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:01.231803" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:01.232507" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:01.232293" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:01.274825" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:01.233054" elapsed="0.041904"/>
</kw>
<msg time="2026-04-10T00:49:01.275141" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:01.275190" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:01.232714" elapsed="0.042514"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:01.362463" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:01.275864" elapsed="0.086869"/>
</kw>
<msg time="2026-04-10T00:49:01.362914" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:01.362963" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:01.275431" elapsed="0.087571"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.363387" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:01.363115" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.363082" elapsed="0.000395"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:01.363997" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:01.363655" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.364427" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:01.364157" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.364138" elapsed="0.000370"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:01.364545" elapsed="0.000056"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:01.366137" elapsed="0.000799"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:01.367219" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:01.367982" 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-04-10T00:49:01.365472" elapsed="0.002990"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:01.364890" elapsed="0.003635"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:01.231093" elapsed="0.137554"/>
</kw>
<msg time="2026-04-10T00:49:01.368748" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:01.368794" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:01.230472" elapsed="0.138359"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:01.369019" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:01.368909" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.368891" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.369509" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.369867" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:01.369938" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:01.229805" elapsed="0.140243"/>
</kw>
<msg time="2026-04-10T00:49:01.370145" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:01.370189" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:01.225224" elapsed="0.145003"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.370569" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:01.370302" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.370285" elapsed="0.000364"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:01.225077" elapsed="0.145596"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:01.376119" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:01.376012" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.375993" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:01.377389" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:01.377280" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.377263" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:01.377936" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:01.377630" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:01.378341" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:01.378125" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:01.414285" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:01.378891" elapsed="0.035516"/>
</kw>
<msg time="2026-04-10T00:49:01.414617" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:01.414665" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:01.378527" elapsed="0.036175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:01.476157" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:01.415250" elapsed="0.061157"/>
</kw>
<msg time="2026-04-10T00:49:01.476662" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:01.476711" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:01.414888" elapsed="0.061861"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.477250" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:01.476875" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.476838" elapsed="0.000504"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:01.477892" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:01.477490" elapsed="0.000489"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.478263" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:01.478047" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.478029" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:01.478377" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:01.482187" elapsed="0.000815"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:01.483299" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:01.484059" elapsed="0.000357"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:01.481522" elapsed="0.002999"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:01.478719" elapsed="0.005884"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:01.376980" elapsed="0.107723"/>
</kw>
<msg time="2026-04-10T00:49:01.484798" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:01.484842" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:01.376395" elapsed="0.108484"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:01.485064" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:49:01.484957" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.484938" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.485614" elapsed="0.000083"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.486009" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:01.486080" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:01.375664" elapsed="0.110526"/>
</kw>
<msg time="2026-04-10T00:49:01.486284" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:01.486328" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:01.370951" elapsed="0.115414"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.486708" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:01.486439" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.486423" elapsed="0.000362"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:01.370805" elapsed="0.116003"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:01.492214" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:01.492107" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.492089" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:01.493464" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:01.493358" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.493340" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:01.494082" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:01.493780" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:01.494476" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:01.494265" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:01.528396" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:01.495041" elapsed="0.033473"/>
</kw>
<msg time="2026-04-10T00:49:01.528719" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:01.528766" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:01.494683" elapsed="0.034120"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:01.597260" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:01.529321" elapsed="0.068149"/>
</kw>
<msg time="2026-04-10T00:49:01.597697" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:01.597745" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:01.528978" elapsed="0.068804"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.598237" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:01.597895" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.597861" elapsed="0.000463"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:01.598884" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:01.598472" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.599255" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:01.599038" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.599020" elapsed="0.000402"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:01.599460" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:01.601346" elapsed="0.001136"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:01.602869" elapsed="0.000501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:01.603683" elapsed="0.000377"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:01.600368" elapsed="0.003793"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:01.599800" elapsed="0.004432"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:01.493009" elapsed="0.111386"/>
</kw>
<msg time="2026-04-10T00:49:01.604496" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:01.604566" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:01.492433" elapsed="0.112183"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:01.604824" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:49:01.604704" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.604685" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.605338" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.605992" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:01.606141" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:01.491765" elapsed="0.114492"/>
</kw>
<msg time="2026-04-10T00:49:01.606368" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:01.606415" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:01.487076" elapsed="0.119375"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.606851" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:01.606527" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.606510" elapsed="0.000463"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:01.486935" elapsed="0.120062"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:01.224899" elapsed="0.382141"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:49:01.222468" elapsed="0.384659"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:49:01.217385" elapsed="0.389850"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:01.216946" elapsed="0.390494"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:49:01.213012" elapsed="0.394505"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:01.611334" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:01.611090" elapsed="0.000292"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:01.614963" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:01.614672" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:01.614652" elapsed="0.000394"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:01.615356" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:01.615204" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:01.616138" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:01.615727" elapsed="0.000471"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:01.616850" level="INFO">${conn_id} = 52</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:01.616373" elapsed="0.000520"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:01.618445" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:01.618629" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:01.617925" elapsed="0.000755"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:01.618977" elapsed="0.000607"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:01.621187" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:01.935899" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:01 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:01.620576" elapsed="0.315654"/>
</kw>
<msg time="2026-04-10T00:49:01.936397" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:01.619895" elapsed="0.316995"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:01.617258" elapsed="0.319970"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:01.937974" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:49:03.103448" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:49:03.103857" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:03.103963" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:01.937587" elapsed="1.166444"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:03.104639" elapsed="0.000547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:03.106341" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:03.105657" elapsed="0.000846"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:03.107030" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:03.106728" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:03.106678" elapsed="0.000514"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:03.107583" elapsed="0.000070"/>
</return>
<status status="PASS" start="2026-04-10T00:49:03.107312" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:03.107277" elapsed="0.000511"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:03.107867" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:03.113507" elapsed="0.000359"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:03.114041" elapsed="0.000168"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:03.114362" elapsed="0.000101"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:03.108653" elapsed="0.005864"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:01.613974" elapsed="1.500734"/>
</kw>
<msg time="2026-04-10T00:49:03.114766" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:01.612651" elapsed="1.502170"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:49:01.612112" elapsed="1.502793"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:03.117133" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:03.116826" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:03.116805" elapsed="0.000420"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:03.117524" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:03.117381" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:03.118214" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:03.117832" elapsed="0.000428"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:03.118804" level="INFO">${conn_id} = 54</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:03.118418" elapsed="0.000412"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:03.119739" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:03.119816" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:03.119441" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:03.119997" elapsed="0.000375"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:03.121252" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:03.446485" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:01 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:03.120938" elapsed="0.325720"/>
</kw>
<msg time="2026-04-10T00:49:03.446742" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:03.120574" elapsed="0.326252"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:03.119049" elapsed="0.327893"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:03.447434" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:49:03.479995" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:49:03.480321" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:03.480422" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:03.447188" elapsed="0.033287"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:03.480960" elapsed="0.000494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:03.482636" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:03.481917" elapsed="0.000817"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:03.483345" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:03.482909" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:03.482861" elapsed="0.000654"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:03.483930" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-04-10T00:49:03.483680" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:03.483642" elapsed="0.000484"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:03.484204" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:03.490538" elapsed="0.000483"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:03.491190" elapsed="0.000161"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:03.491503" elapsed="0.000117"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:03.484945" elapsed="0.006728"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:03.116210" elapsed="0.375556"/>
</kw>
<msg time="2026-04-10T00:49:03.491821" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:03.115628" elapsed="0.376247"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:49:03.115101" elapsed="0.376856"/>
</kw>
<arg>${mininet}</arg>
<status status="PASS" start="2026-04-10T00:49:01.611698" elapsed="1.880317"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:03.497375" level="INFO">${tools_connection} = 56</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:03.496993" elapsed="0.000409"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:03.499231" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:03.499310" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:03.498948" elapsed="0.000386"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:03.499495" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:03.500724" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:03.824601" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:03 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:03.500381" elapsed="0.324372"/>
</kw>
<msg time="2026-04-10T00:49:03.824837" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:03.500017" elapsed="0.324898"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:03.498400" elapsed="0.326624"/>
</kw>
<msg time="2026-04-10T00:49:03.825075" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:03.498001" elapsed="0.327120"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:49:03.497611" elapsed="0.327587"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-10T00:49:03.825248" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:49:03.825458" level="INFO">${mininet_conn_id} = 56</msg>
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-10T00:49:03.496461" elapsed="0.329023"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:03.826243" level="INFO">${mininet_conn_id} = 56</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:03.825777" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:03.828807" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:03.826454" elapsed="0.002414"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:03.826432" elapsed="0.002462"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:03.829384" level="INFO">Start mininet --topo linear,1 to 10.30.171.151</msg>
<arg>Start mininet ${options} to ${controller}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:03.829056" elapsed="0.000377"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:03.831884" level="INFO">sudo mn --controller 'remote,ip=10.30.171.151,port=6633' --topo linear,1 --switch ovsk,protocols=OpenFlow13</msg>
<arg>sudo mn --controller 'remote,ip=${controller},port=${ofport}' ${options} --switch ovsk,protocols=OpenFlow${ofversion}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:03.829620" elapsed="0.002327"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:49:04.015904" level="INFO">[?2004l*** Creating network
*** Adding controller
*** Adding hosts:
h1 
*** Adding switches:
s1 
*** Adding links:
(h1, s1) 
*** Configuring hosts
h1 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:49:03.832121" elapsed="0.183944"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:04.016862" level="INFO">Check OVS configuratiom</msg>
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:04.016430" elapsed="0.000493"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:04.018371" level="INFO">sh ovs-vsctl show</msg>
<arg>sh ovs-vsctl show</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:04.017147" elapsed="0.001290"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:49:04.027254" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Bridge s1
        Controller "tcp:10.30.171.151:6633"
        Controller "ptcp:6654"
        fail_mode: secure
        Port s1-eth1
            Interface s1-eth1
        Port s1
            Interface s1
                type: internal
    ovs_version: "2.17.11"
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:49:04.018624" elapsed="0.008695"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="PASS" start="2026-04-10T00:49:04.027373" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:49:04.027630" level="INFO">${mininet_conn_id} = 56</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${Follower_Node_2}_IP}</arg>
<arg>--topo linear,${switch_count}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="PASS" start="2026-04-10T00:49:01.608176" elapsed="2.419480"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:04.028259" level="INFO">${mininet_conn_id} = 56</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:04.027898" elapsed="0.000405"/>
</kw>
<doc>Start mininet with connection to follower node2.</doc>
<status status="PASS" start="2026-04-10T00:49:01.212224" elapsed="2.816199"/>
</test>
<test id="s1-s1-t12" name="Verify Flows In Switch Connected To Follower Node2" line="121">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:49:04.032023" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:49:04.031750" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:04.033356" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:04.033224" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.033203" 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-04-10T00:49:04.038779" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:04.038670" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.038651" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:04.039878" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:04.039466" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:04.040379" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:04.040071" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:04.040453" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:49:04.040650" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:04.039084" elapsed="0.001592"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:04.046438" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:04.046328" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.046309" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:04.047732" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:04.047623" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.047604" elapsed="0.000262"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:04.048334" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:04.048025" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:04.048790" level="INFO">${current_connection_index} = 56</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:04.048539" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:04.091377" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:04.049330" elapsed="0.042160"/>
</kw>
<msg time="2026-04-10T00:49:04.091702" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:04.091750" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:04.048984" elapsed="0.042804"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:04.192187" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CC
 "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:04.092338" elapsed="0.100109"/>
</kw>
<msg time="2026-04-10T00:49:04.192706" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:04.192759" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:04.091978" elapsed="0.100821"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.193248" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:04.192920" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.192886" elapsed="0.000455"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:04.193925" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CC
 "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:04.193499" elapsed="0.000524"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.194358" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:04.194097" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.194077" elapsed="0.000394"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:04.194518" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:04.197393" elapsed="0.000189"/>
</kw>
<msg time="2026-04-10T00:49:04.197657" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:04.196165" elapsed="0.001633"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.198088" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.198433" elapsed="0.000137"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:04.195460" elapsed="0.003244"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:04.194871" elapsed="0.003930"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:04.047293" elapsed="0.151638"/>
</kw>
<msg time="2026-04-10T00:49:04.199037" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:04.199083" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:04.046683" elapsed="0.152441"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:04.199319" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:49:04.199206" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.199187" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.199854" elapsed="0.000087"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.200277" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:04.200354" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:04.045979" elapsed="0.154494"/>
</kw>
<msg time="2026-04-10T00:49:04.200592" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:04.200641" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:04.041057" elapsed="0.159623"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.201022" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:04.200761" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.200743" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:04.040910" elapsed="0.160220"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:04.207076" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:04.206962" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.206942" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:04.208386" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:04.208277" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.208259" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:04.208965" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:04.208650" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:04.209393" level="INFO">${current_connection_index} = 56</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:04.209157" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:04.246480" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:04.209951" elapsed="0.036650"/>
</kw>
<msg time="2026-04-10T00:49:04.246802" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:04.246851" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:04.209605" elapsed="0.037284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:04.340982" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CC
 "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:04.247415" elapsed="0.093745"/>
</kw>
<msg time="2026-04-10T00:49:04.341342" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:04.341390" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:04.247067" elapsed="0.094360"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.341828" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:04.341528" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.341500" elapsed="0.000415"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:04.342399" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CC
 "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:04.342063" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.342802" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:04.342580" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.342547" elapsed="0.000398"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:04.342983" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:04.345628" elapsed="0.000152"/>
</kw>
<msg time="2026-04-10T00:49:04.345845" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:04.344581" elapsed="0.001403"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.346267" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.346629" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:04.343931" elapsed="0.002891"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:04.343339" elapsed="0.003554"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:04.207969" elapsed="0.139025"/>
</kw>
<msg time="2026-04-10T00:49:04.347094" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:04.347140" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:04.207308" elapsed="0.139872"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:04.347416" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:49:04.347303" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.347247" 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 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.347937" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.348288" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:04.348363" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:04.206442" elapsed="0.142037"/>
</kw>
<msg time="2026-04-10T00:49:04.348597" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:04.348646" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:04.201416" elapsed="0.147269"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.349021" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:04.348764" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.348746" elapsed="0.000357"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:04.201266" elapsed="0.147862"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:04.354957" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:04.354843" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.354823" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:04.356257" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:04.356147" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.356130" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:04.356800" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:04.356475" elapsed="0.000355"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:04.357214" level="INFO">${current_connection_index} = 56</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:04.356996" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:04.394173" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:04.357765" elapsed="0.036579"/>
</kw>
<msg time="2026-04-10T00:49:04.394536" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:04.394722" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:04.357401" elapsed="0.037363"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:04.469075" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CC
 "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:04.395395" elapsed="0.073883"/>
</kw>
<msg time="2026-04-10T00:49:04.469483" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:04.469533" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:04.394986" elapsed="0.074612"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.470017" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:04.469713" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.469682" elapsed="0.000423"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:04.470650" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CC
 "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:04.470256" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.471043" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:04.470819" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.470800" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:04.471163" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:04.473901" elapsed="0.000153"/>
</kw>
<msg time="2026-04-10T00:49:04.474118" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:04.472863" elapsed="0.001393"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.474536" elapsed="0.000118"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.474972" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:04.472170" elapsed="0.002997"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:04.471481" elapsed="0.003752"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:04.355839" elapsed="0.119495"/>
</kw>
<msg time="2026-04-10T00:49:04.475433" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:04.475479" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:04.355192" elapsed="0.120329"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:04.475733" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:49:04.475622" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.475602" elapsed="0.000222"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.476316" 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-04-10T00:49:04.476715" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:04.476793" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:04.354394" elapsed="0.122518"/>
</kw>
<msg time="2026-04-10T00:49:04.477013" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:04.477060" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:04.349406" elapsed="0.127745"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:04.477490" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:04.477233" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.477215" elapsed="0.000386"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:04.349260" elapsed="0.128366"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:04.040732" elapsed="0.436930"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:49:04.038283" elapsed="0.439441"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:49:04.032922" elapsed="0.444864"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:04.032453" elapsed="0.445382"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:49:04.029482" elapsed="0.448413"/>
</kw>
<kw name="Verify Aggregate Flow From Mininet Session" owner="MininetKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:04.480095" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:04.479783" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.479764" elapsed="0.000762"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:04.481012" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:04.480736" elapsed="0.000304"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:04.481985" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:04.481761" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:04.481742" elapsed="0.000599"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:04.484447" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:04.482482" elapsed="0.002026"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:49:04.516017" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<msg time="2026-04-10T00:49:04.516196" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:49:04.484700" elapsed="0.031537"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:49:04.516306" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:49:04.516529" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 56 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:49:04.481369" elapsed="0.035223"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:49:04.517173" level="INFO">${flows} = ['0']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:49:04.516832" elapsed="0.000377"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:04.517990" level="INFO">${total_flows} = 0</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:04.517435" elapsed="0.000592"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:49:04.518703" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-04-10T00:49:04.518844" level="FAIL">0.0 != 10000.0</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-04-10T00:49:04.518286" elapsed="0.000656">0.0 != 10000.0</status>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="FAIL" start="2026-04-10T00:49:04.479449" elapsed="0.039644">0.0 != 10000.0</status>
</kw>
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:06.521976" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:06.521153" elapsed="0.001335"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.521105" elapsed="0.001617"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:06.524002" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:06.523185" elapsed="0.000885"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:06.526334" elapsed="0.000388"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:06.525787" elapsed="0.001270"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.525743" elapsed="0.001393"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:06.530220" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:06.527500" elapsed="0.002807"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:49:06.556653" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<msg time="2026-04-10T00:49:06.556986" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:49:06.530540" elapsed="0.026513"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:49:06.557187" elapsed="0.000090"/>
</return>
<msg time="2026-04-10T00:49:06.557661" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 56 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:49:06.524927" elapsed="0.032799"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:49:06.558699" level="INFO">${flows} = ['10000']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:49:06.558134" elapsed="0.000623"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:06.560006" level="INFO">${total_flows} = 10000</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:06.559112" elapsed="0.000950"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:49:06.561078" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-04-10T00:49:06.560463" elapsed="0.000741"/>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="PASS" start="2026-04-10T00:49:06.520229" elapsed="0.041105"/>
</kw>
<arg>${time_out}</arg>
<arg>2s</arg>
<arg>MininetKeywords.Check Flows In Mininet</arg>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:49:04.478626" elapsed="2.082819"/>
</kw>
<arg>${mininet_conn_id}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${operation_timeout}</arg>
<doc>Verify flow count per switch</doc>
<status status="PASS" start="2026-04-10T00:49:04.478113" elapsed="2.083523"/>
</kw>
<doc>Verify 10000 flows per DPN installed in switch after it is connected to follower node2.</doc>
<status status="PASS" start="2026-04-10T00:49:04.028848" elapsed="2.533045"/>
</test>
<test id="s1-s1-t13" name="Stop Mininet Connected To Follower Node2" line="128">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:49:06.567078" elapsed="0.000320"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:49:06.566673" elapsed="0.000805"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:06.568998" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:06.568824" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.568795" elapsed="0.000304"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:06.576155" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:06.575978" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.575950" elapsed="0.000321"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:06.577961" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:06.577342" elapsed="0.000656"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:06.578816" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:06.578393" elapsed="0.000458"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:06.578913" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:49:06.579125" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:06.576651" elapsed="0.002505"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:06.585788" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:06.585622" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.585601" elapsed="0.000266"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:06.587302" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:06.587173" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.587152" elapsed="0.000234"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:06.587972" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:06.587597" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:06.588575" level="INFO">${current_connection_index} = 56</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:06.588294" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:06.629363" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:06.589212" elapsed="0.040418"/>
</kw>
<msg time="2026-04-10T00:49:06.629989" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:06.630058" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:06.588807" elapsed="0.041304"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:06.701331" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:06.631337" elapsed="0.070262"/>
</kw>
<msg time="2026-04-10T00:49:06.701830" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:06.701880" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:06.630441" elapsed="0.071478"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.702448" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:06.702043" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.702007" elapsed="0.000595"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:06.703162" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:06.702764" elapsed="0.000518"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.703614" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:06.703359" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.703339" elapsed="0.000357"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:06.703736" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:06.706638" elapsed="0.000155"/>
</kw>
<msg time="2026-04-10T00:49:06.706857" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:06.705439" elapsed="0.001561"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.707277" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.707637" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:06.704732" elapsed="0.003090"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:06.704071" elapsed="0.003814"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:06.586808" elapsed="0.121176"/>
</kw>
<msg time="2026-04-10T00:49:06.708081" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:06.708125" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:06.586037" elapsed="0.122124"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:06.708351" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:49:06.708241" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.708221" 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-04-10T00:49:06.708876" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.709219" elapsed="0.000087"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:06.709357" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:06.585231" elapsed="0.124238"/>
</kw>
<msg time="2026-04-10T00:49:06.709585" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:06.709631" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:06.579814" elapsed="0.129856"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.710003" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:06.709747" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.709730" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:06.579462" elapsed="0.130642"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:06.715842" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:06.715727" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.715705" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:06.717197" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:06.717086" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.717068" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:06.717794" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:06.717421" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:06.718211" level="INFO">${current_connection_index} = 56</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:06.717989" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:06.751914" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:06.718842" elapsed="0.033283"/>
</kw>
<msg time="2026-04-10T00:49:06.752397" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:06.752456" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:06.718477" elapsed="0.034018"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:06.817436" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:06.753203" elapsed="0.064648"/>
</kw>
<msg time="2026-04-10T00:49:06.818315" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:06.818466" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:06.752765" elapsed="0.065942"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.819425" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:06.818979" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.818917" elapsed="0.000667"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:06.820328" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:06.819811" elapsed="0.000667"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.821024" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:06.820622" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.820584" elapsed="0.000564"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:06.821204" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:06.825335" elapsed="0.000238"/>
</kw>
<msg time="2026-04-10T00:49:06.825666" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:06.823674" elapsed="0.002180"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.826249" elapsed="0.000105"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.826826" elapsed="0.000109"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:06.822576" elapsed="0.004481"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:06.821688" elapsed="0.005435"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:06.716720" elapsed="0.110504"/>
</kw>
<msg time="2026-04-10T00:49:06.827322" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:06.827367" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:06.716076" elapsed="0.111329"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:06.827619" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:49:06.827486" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.827467" elapsed="0.000240"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.828129" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.828475" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:06.828565" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:06.715218" elapsed="0.113462"/>
</kw>
<msg time="2026-04-10T00:49:06.828776" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:06.828821" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:06.710441" elapsed="0.118419"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.829194" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:06.828937" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.828919" elapsed="0.000353"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:06.710292" elapsed="0.119006"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:06.834842" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:06.834688" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.834668" 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-04-10T00:49:06.836143" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:06.836034" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.836016" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:06.836691" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:06.836364" elapsed="0.000355"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:06.837105" level="INFO">${current_connection_index} = 56</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:06.836883" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:06.883896" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:06.837699" elapsed="0.046420"/>
</kw>
<msg time="2026-04-10T00:49:06.884427" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:06.884499" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:06.837296" elapsed="0.047295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:06.954474" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:06.885368" elapsed="0.069365"/>
</kw>
<msg time="2026-04-10T00:49:06.954977" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:06.955029" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:06.884911" elapsed="0.070158"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.955604" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:06.955233" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.955154" elapsed="0.000546"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:06.956281" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:06.955853" elapsed="0.000527"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.956710" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:06.956449" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.956431" elapsed="0.000361"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:06.956830" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:06.959804" elapsed="0.000164"/>
</kw>
<msg time="2026-04-10T00:49:06.960044" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:06.958527" elapsed="0.001668"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.960478" elapsed="0.000110"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.960858" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:06.957847" elapsed="0.003206"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:06.957167" elapsed="0.003970"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:06.835725" elapsed="0.125517"/>
</kw>
<msg time="2026-04-10T00:49:06.961344" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:06.961390" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:06.835065" elapsed="0.126365"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:06.961662" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:49:06.961518" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.961495" 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-04-10T00:49:06.962246" elapsed="0.000031"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.962645" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:06.962719" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:06.834322" elapsed="0.128514"/>
</kw>
<msg time="2026-04-10T00:49:06.962938" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:06.962985" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:06.829596" elapsed="0.133430"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:06.963438" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:06.963106" elapsed="0.000459"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.963088" elapsed="0.000506"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:06.829430" elapsed="0.134189"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:06.579229" elapsed="0.384425"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:49:06.575416" elapsed="0.388298"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:49:06.568375" elapsed="0.395399"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:06.567708" elapsed="0.396114"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:49:06.563096" elapsed="0.400780"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:06.969540" elapsed="0.000194"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:06.969184" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:06.969155" elapsed="0.000650"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:06.972221" level="INFO">exit</msg>
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:06.969954" elapsed="0.002331"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:49:07.120987" level="INFO">*** Stopping 1 controllers
c0 
*** Stopping 1 links
.
*** Stopping 1 switches
s1 
*** Stopping 1 hosts
h1 
*** Done
completed in 3.234 seconds
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:49:06.972481" elapsed="0.148656"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:07.121394" elapsed="0.000206"/>
</kw>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="PASS" start="2026-04-10T00:49:06.968810" elapsed="0.152863"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:07.124374" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:07.124065" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:07.124043" elapsed="0.000414"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:07.124781" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:07.124630" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:07.125454" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:07.125070" elapsed="0.000429"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:07.126045" level="INFO">${conn_id} = 57</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:07.125674" elapsed="0.000397"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:07.127274" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:07.127353" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:07.126991" elapsed="0.000386"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:07.127539" elapsed="0.000374"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:07.128782" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:07.436700" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:03 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:07.128447" elapsed="0.308421"/>
</kw>
<msg time="2026-04-10T00:49:07.437008" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:07.128088" elapsed="0.309115"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:07.126590" elapsed="0.310743"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:07.437864" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:49:08.650129" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:49:08.650711" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:08.650824" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:07.437610" elapsed="1.213273"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:08.651418" elapsed="0.000695"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:08.653379" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:08.652598" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:08.654197" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:08.653875" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:08.653808" elapsed="0.000560"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:08.654769" elapsed="0.000069"/>
</return>
<status status="PASS" start="2026-04-10T00:49:08.654489" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:08.654454" elapsed="0.000515"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:08.655045" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:08.660850" elapsed="0.000890"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:08.662116" elapsed="0.000323"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:08.662742" elapsed="0.000155"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:08.655825" elapsed="0.007151"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:07.123477" elapsed="1.539625"/>
</kw>
<msg time="2026-04-10T00:49:08.663159" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:07.122850" elapsed="1.540407"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:49:07.122325" elapsed="1.541032"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:08.666063" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:08.665774" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:08.665754" elapsed="0.000393"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:08.666443" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:08.666302" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:08.667209" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:08.666817" elapsed="0.000439"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:08.668237" level="INFO">${conn_id} = 59</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:08.667519" elapsed="0.000747"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:08.669333" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:08.669423" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:08.669001" elapsed="0.000449"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:08.669653" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:08.670899" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:09.063978" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:07 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:08.670570" elapsed="0.393684"/>
</kw>
<msg time="2026-04-10T00:49:09.064376" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:08.670178" elapsed="0.394330"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:08.668492" elapsed="0.396224"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:09.065516" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:49:09.098529" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:49:09.098886" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:09.098992" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:09.065106" elapsed="0.033937"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:09.099426" elapsed="0.000720"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:09.101385" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:09.100673" elapsed="0.000804"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:09.102092" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:09.101726" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.101660" elapsed="0.000796"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:09.102878" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-10T00:49:09.102633" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.102541" elapsed="0.000527"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:09.103143" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:09.108615" 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-04-10T00:49:09.109139" elapsed="0.000189"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:09.109479" elapsed="0.000114"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:09.103947" elapsed="0.005700"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:08.665059" elapsed="0.444686"/>
</kw>
<msg time="2026-04-10T00:49:09.109803" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:08.664225" elapsed="0.445631"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:49:08.663604" elapsed="0.446338"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:07.121923" elapsed="1.988082"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="PASS" start="2026-04-10T00:49:06.562306" elapsed="2.547836"/>
</test>
<test id="s1-s1-t14" name="Start Mininet Connect To Inventory Leader" line="133">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:49:09.113690" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:49:09.113398" elapsed="0.000563"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:09.115063" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:09.114944" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.114926" elapsed="0.000206"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:09.120218" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:09.120110" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.120092" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:09.121322" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:09.120925" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:09.121835" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:09.121512" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:09.121905" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:09.122059" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:09.120521" elapsed="0.001562"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:09.127932" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:09.127813" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.127794" elapsed="0.000248"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:09.129296" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:09.129189" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.129172" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:09.129860" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:09.129516" elapsed="0.000370"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:09.130277" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:09.130056" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:09.163862" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:09.130865" elapsed="0.033171"/>
</kw>
<msg time="2026-04-10T00:49:09.164241" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:09.164288" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:09.130466" elapsed="0.033859"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:09.239070" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:09.165021" elapsed="0.074309"/>
</kw>
<msg time="2026-04-10T00:49:09.239622" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:09.239677" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:09.164602" elapsed="0.075115"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:09.240225" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:09.239857" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.239813" elapsed="0.000512"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:09.240936" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:09.240497" elapsed="0.000672"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:09.241510" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:09.241243" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.241223" elapsed="0.000424"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:09.241693" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:09.244208" elapsed="0.000861"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:09.245362" elapsed="0.000552"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:09.246209" elapsed="0.000407"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:09.242837" elapsed="0.003889"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:09.242165" elapsed="0.004630"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:09.128886" elapsed="0.118018"/>
</kw>
<msg time="2026-04-10T00:49:09.247040" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:09.247107" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:09.128220" elapsed="0.118931"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:09.247352" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:49:09.247239" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.247219" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:09.247928" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:09.248306" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:09.248382" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:09.127447" elapsed="0.121054"/>
</kw>
<msg time="2026-04-10T00:49:09.248626" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:09.248675" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:09.122506" elapsed="0.126211"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:09.249061" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:09.248798" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.248780" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:09.122353" elapsed="0.126813"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:09.255620" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:09.255451" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.255430" elapsed="0.000263"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:09.256937" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:09.256809" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.256783" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:09.257480" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:09.257156" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:09.257932" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:09.257708" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:09.294891" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:09.258462" elapsed="0.036657"/>
</kw>
<msg time="2026-04-10T00:49:09.295494" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:09.295571" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:09.258120" elapsed="0.037494"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:09.358024" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:09.296390" elapsed="0.062981"/>
</kw>
<msg time="2026-04-10T00:49:09.359766" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:09.359820" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:09.295885" elapsed="0.063983"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:09.360593" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:09.360076" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.360010" elapsed="0.000689"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:09.361394" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:09.360858" elapsed="0.000646"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:09.361826" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:09.361595" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.361575" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:09.361949" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:09.363837" elapsed="0.001426"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:09.365598" elapsed="0.000533"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:09.366403" elapsed="0.000398"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:09.363065" elapsed="0.003842"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:09.362372" elapsed="0.004605"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:09.256468" elapsed="0.110617"/>
</kw>
<msg time="2026-04-10T00:49:09.367198" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:09.367245" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:09.255851" elapsed="0.111433"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:09.367508" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:49:09.367392" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.367351" elapsed="0.000270"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:09.368131" 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-04-10T00:49:09.368580" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:09.368660" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:09.255062" elapsed="0.113736"/>
</kw>
<msg time="2026-04-10T00:49:09.368909" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:09.368957" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:09.249479" elapsed="0.119533"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:09.369987" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:09.369705" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.369684" elapsed="0.000382"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:09.249326" elapsed="0.120765"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:09.376293" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:09.376182" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.376162" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:09.377696" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:09.377587" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.377567" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:09.378244" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:09.377917" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:09.378692" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:09.378436" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:09.413572" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:09.379226" elapsed="0.034524"/>
</kw>
<msg time="2026-04-10T00:49:09.413967" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:09.414017" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:09.378880" elapsed="0.035176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:09.476751" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:09.414752" elapsed="0.062458"/>
</kw>
<msg time="2026-04-10T00:49:09.477603" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:09.477667" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:09.414295" elapsed="0.063416"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:09.478401" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:09.477898" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.477838" elapsed="0.000665"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:09.479265" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "a "r "t "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "[C "[78CT "[A[78Co
 "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:09.478692" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:09.479751" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:09.479446" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.479425" elapsed="0.000410"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:09.479880" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:09.481794" elapsed="0.000900"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:09.482998" elapsed="0.000526"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:09.483870" 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-04-10T00:49:09.481038" elapsed="0.003537"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:09.480331" elapsed="0.004314"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:09.377251" elapsed="0.107502"/>
</kw>
<msg time="2026-04-10T00:49:09.485686" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:09.485741" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:09.376520" elapsed="0.109262"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:09.486009" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:49:09.485885" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.485861" 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 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:09.486646" 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-04-10T00:49:09.487015" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:09.487090" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:09.375779" elapsed="0.111431"/>
</kw>
<msg time="2026-04-10T00:49:09.487323" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:09.487375" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:09.370403" elapsed="0.117011"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:09.487827" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:09.487497" elapsed="0.000393"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.487480" elapsed="0.000436"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:09.370248" elapsed="0.117699"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:09.122152" elapsed="0.365840"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:49:09.119750" elapsed="0.368315"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:49:09.114601" elapsed="0.373529"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:09.114117" elapsed="0.374066"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:49:09.111253" elapsed="0.376992"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:09.492222" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:09.491915" elapsed="0.000360"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:09.494983" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:09.494687" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:09.494666" elapsed="0.000404"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:09.495430" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:09.495228" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:09.496199" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:09.495790" elapsed="0.000456"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:09.496819" level="INFO">${conn_id} = 64</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:09.496408" elapsed="0.000442"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:09.497857" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:09.497937" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:09.497523" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:09.498131" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:09.499509" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:09.824539" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:09 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:09.499166" elapsed="0.325701"/>
</kw>
<msg time="2026-04-10T00:49:09.824992" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:09.498769" elapsed="0.326347"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:09.497096" elapsed="0.328176"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:09.825982" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:49:10.999097" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:49:10.999514" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:10.999617" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:09.825646" elapsed="1.174011"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:11.000135" elapsed="0.000522"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:11.001523" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:11.001003" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:11.002020" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:11.001773" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:11.001726" elapsed="0.000416"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:11.002363" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-10T00:49:11.002218" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:11.002197" elapsed="0.000307"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:11.002569" elapsed="0.000021"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:11.006876" elapsed="0.000476"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:11.007606" elapsed="0.000299"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:11.008124" elapsed="0.000139"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:11.003088" elapsed="0.005250"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:09.494038" elapsed="1.514433"/>
</kw>
<msg time="2026-04-10T00:49:11.008572" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:09.493415" elapsed="1.515238"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:49:09.492896" elapsed="1.515878"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:11.011845" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:11.011430" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:11.011402" elapsed="0.000577"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:11.012406" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:11.012201" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:11.013355" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:11.012832" elapsed="0.000594"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:11.014172" level="INFO">${conn_id} = 66</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:11.013669" elapsed="0.000536"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:11.015453" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:11.015578" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:11.015056" elapsed="0.000557"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:11.015831" elapsed="0.005832"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:11.023236" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:11.407774" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:09 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:11.022720" elapsed="0.385309"/>
</kw>
<msg time="2026-04-10T00:49:11.408148" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:11.022150" elapsed="0.386118"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:11.014504" elapsed="0.393920"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:11.409723" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:49:11.453241" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:49:11.453820" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:11.453924" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:11.408836" elapsed="0.045142"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:11.454643" elapsed="0.000723"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:11.456590" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:11.455864" elapsed="0.000825"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:11.457284" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:11.456890" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:11.456830" elapsed="0.000628"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:11.457844" elapsed="0.000076"/>
</return>
<status status="PASS" start="2026-04-10T00:49:11.457605" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:11.457542" elapsed="0.000506"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:11.458121" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:11.462958" elapsed="0.000519"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:11.463762" elapsed="0.000271"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:11.464264" elapsed="0.000157"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:11.458688" elapsed="0.006683"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:11.010588" elapsed="0.454950"/>
</kw>
<msg time="2026-04-10T00:49:11.465661" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:11.009754" elapsed="0.456008"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:49:11.009040" elapsed="0.456858"/>
</kw>
<arg>${mininet}</arg>
<status status="PASS" start="2026-04-10T00:49:09.492486" elapsed="1.973511"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:11.473020" level="INFO">${tools_connection} = 68</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:11.472042" elapsed="0.001014"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:11.475154" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:11.475240" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:11.474825" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:11.475430" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:11.476756" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:11.808532" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:11 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:11.476369" elapsed="0.332370"/>
</kw>
<msg time="2026-04-10T00:49:11.808832" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:11.475996" elapsed="0.332927"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:11.474260" elapsed="0.334786"/>
</kw>
<msg time="2026-04-10T00:49:11.809101" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:11.473750" elapsed="0.335396"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:49:11.473320" elapsed="0.335905"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-10T00:49:11.809279" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:49:11.809512" level="INFO">${mininet_conn_id} = 68</msg>
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-10T00:49:11.471375" elapsed="0.338162"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:11.810402" level="INFO">${mininet_conn_id} = 68</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:11.809935" elapsed="0.000510"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:11.812805" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:11.810537" elapsed="0.002329"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:11.810512" elapsed="0.002380"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:11.813365" level="INFO">Start mininet --topo linear,1 to 10.30.170.169</msg>
<arg>Start mininet ${options} to ${controller}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:11.813055" elapsed="0.000357"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:11.816178" level="INFO">sudo mn --controller 'remote,ip=10.30.170.169,port=6633' --topo linear,1 --switch ovsk,protocols=OpenFlow13</msg>
<arg>sudo mn --controller 'remote,ip=${controller},port=${ofport}' ${options} --switch ovsk,protocols=OpenFlow${ofversion}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:11.813598" elapsed="0.002640"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:49:12.008316" level="INFO">[?2004l*** Creating network
*** Adding controller
*** Adding hosts:
h1 
*** Adding switches:
s1 
*** Adding links:
(h1, s1) 
*** Configuring hosts
h1 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:49:11.816406" elapsed="0.192328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:12.009709" level="INFO">Check OVS configuratiom</msg>
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:12.009199" elapsed="0.000558"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:12.011166" level="INFO">sh ovs-vsctl show</msg>
<arg>sh ovs-vsctl show</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:12.009959" elapsed="0.001265"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:49:12.022604" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Bridge s1
        Controller "tcp:10.30.170.169:6633"
        Controller "ptcp:6654"
        fail_mode: secure
        Port s1-eth1
            Interface s1-eth1
        Port s1
            Interface s1
                type: internal
    ovs_version: "2.17.11"
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:49:12.011387" elapsed="0.011309"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="PASS" start="2026-04-10T00:49:12.022768" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:49:12.023091" level="INFO">${mininet_conn_id} = 68</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${Inventory_Leader}_IP}</arg>
<arg>--topo linear,${switch_count}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="PASS" start="2026-04-10T00:49:09.488633" elapsed="2.534485"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:12.023864" level="INFO">${mininet_conn_id} = 68</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:12.023410" elapsed="0.000499"/>
</kw>
<doc>Start mininet with connection to inventroy leader.</doc>
<status status="PASS" start="2026-04-10T00:49:09.110424" elapsed="2.913620"/>
</test>
<test id="s1-s1-t15" name="Verify Flows In Switch Connected To Leader" line="141">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:49:12.027969" elapsed="0.000251"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:49:12.027686" elapsed="0.000596"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:12.029524" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:12.029347" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.029317" elapsed="0.000309"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:12.034920" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:12.034788" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.034766" elapsed="0.000236"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:12.036235" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:12.035719" elapsed="0.000548"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:12.036782" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:12.036439" elapsed="0.000370"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:12.036854" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:49:12.037034" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:12.035285" elapsed="0.001774"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:12.043367" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:12.043228" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.043203" elapsed="0.000248"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:12.044870" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:12.044759" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.044742" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:12.045470" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:12.045093" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:12.045948" level="INFO">${current_connection_index} = 68</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:12.045706" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:12.083035" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:12.046604" elapsed="0.036734"/>
</kw>
<msg time="2026-04-10T00:49:12.083648" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:12.083699" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:12.046138" elapsed="0.037599"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:12.152257" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CC
 "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:12.084955" elapsed="0.067758"/>
</kw>
<msg time="2026-04-10T00:49:12.153052" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:12.153105" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:12.084360" elapsed="0.068784"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.153840" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:12.153330" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.153269" elapsed="0.000678"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:12.154704" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CC
 "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:12.154108" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.155095" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:12.154869" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.154850" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:12.155225" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:12.159082" elapsed="0.000182"/>
</kw>
<msg time="2026-04-10T00:49:12.159341" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:12.157075" elapsed="0.002424"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.159811" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.160158" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:12.156351" elapsed="0.003998"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:12.155681" elapsed="0.004735"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:12.044418" elapsed="0.116103"/>
</kw>
<msg time="2026-04-10T00:49:12.160658" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:12.160704" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:12.043658" elapsed="0.117085"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:12.160972" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:49:12.160843" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.160816" 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-04-10T00:49:12.161586" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.161946" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:12.162018" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:12.042789" elapsed="0.119344"/>
</kw>
<msg time="2026-04-10T00:49:12.162235" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:12.162280" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:12.037495" elapsed="0.124822"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.162799" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:12.162393" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.162376" elapsed="0.000505"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:12.037338" elapsed="0.125568"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:12.171750" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:12.171600" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.171569" elapsed="0.000273"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:12.173257" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:12.173146" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.173128" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:12.173849" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:12.173482" elapsed="0.000397"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:12.174278" level="INFO">${current_connection_index} = 68</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:12.174050" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:12.214556" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:12.174875" elapsed="0.040131"/>
</kw>
<msg time="2026-04-10T00:49:12.215602" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:12.215658" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:12.174470" elapsed="0.041224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:12.287472" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CC
 "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:12.216648" elapsed="0.072278"/>
</kw>
<msg time="2026-04-10T00:49:12.290250" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:12.290318" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:12.216052" elapsed="0.074316"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.292034" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:12.290566" elapsed="0.001554"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.290493" elapsed="0.001661"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:12.293528" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CC
 "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:12.292321" elapsed="0.001357"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.294104" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:12.293780" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.293750" elapsed="0.000445"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:12.294241" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:12.298419" elapsed="0.000243"/>
</kw>
<msg time="2026-04-10T00:49:12.298755" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:12.297285" elapsed="0.001671"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.299271" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.299727" elapsed="0.000100"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:12.296524" elapsed="0.003436"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:12.294734" elapsed="0.005298"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:12.172837" elapsed="0.127427"/>
</kw>
<msg time="2026-04-10T00:49:12.300385" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:12.300433" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:12.172057" elapsed="0.128416"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:12.300764" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:49:12.300616" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.300581" elapsed="0.000293"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.301408" 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-04-10T00:49:12.301802" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:12.301878" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:12.171030" elapsed="0.130966"/>
</kw>
<msg time="2026-04-10T00:49:12.302108" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:12.302155" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:12.163216" elapsed="0.138976"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.302592" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:12.302276" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.302257" elapsed="0.000420"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:12.163059" elapsed="0.139644"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:12.309581" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:12.309384" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.309354" elapsed="0.000337"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:12.311315" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:12.311196" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.311176" elapsed="0.000211"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:12.311958" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:12.311591" elapsed="0.000397"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:12.312401" level="INFO">${current_connection_index} = 68</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:12.312162" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:12.351847" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:12.312964" elapsed="0.039152"/>
</kw>
<msg time="2026-04-10T00:49:12.352378" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:12.352428" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:12.312609" elapsed="0.039856"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:12.423517" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CC
 "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:12.353363" elapsed="0.070368"/>
</kw>
<msg time="2026-04-10T00:49:12.423927" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:12.423976" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:12.352792" elapsed="0.071220"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.424622" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:12.424135" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.424098" elapsed="0.000623"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:12.425258" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "F "l "o "w "s "[C "I "n "[C "S "w "i "t "c "h "[78C[C "[A[78CC
 "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:12.424884" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.425684" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:12.425425" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.425405" elapsed="0.000364"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:12.425813" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:12.428874" elapsed="0.000181"/>
</kw>
<msg time="2026-04-10T00:49:12.429122" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:12.427730" elapsed="0.001541"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.429606" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.429961" elapsed="0.000085"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:12.426966" elapsed="0.003230"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:12.426159" elapsed="0.004114"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:12.310818" elapsed="0.119559"/>
</kw>
<msg time="2026-04-10T00:49:12.430476" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:12.430522" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:12.309946" elapsed="0.120634"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:12.430781" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:49:12.430665" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.430646" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.431338" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.431724" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:12.431801" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:12.308791" elapsed="0.123131"/>
</kw>
<msg time="2026-04-10T00:49:12.432026" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:12.432076" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:12.303125" elapsed="0.128990"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:12.432465" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:12.432196" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.432178" elapsed="0.000385"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:12.302939" elapsed="0.129651"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:12.037130" elapsed="0.395500"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:49:12.034346" elapsed="0.398347"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:49:12.029002" elapsed="0.403752"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:12.028465" elapsed="0.404337"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:49:12.025154" elapsed="0.407750"/>
</kw>
<kw name="Verify Aggregate Flow From Mininet Session" owner="MininetKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:12.434901" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:12.434670" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.434652" elapsed="0.000764"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:12.435905" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:12.435608" elapsed="0.000325"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:12.436863" elapsed="0.000146"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:12.436626" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:12.436605" elapsed="0.000471"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:12.439484" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:12.437223" elapsed="0.002351"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:49:12.468745" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<msg time="2026-04-10T00:49:12.468856" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:49:12.439753" elapsed="0.029133"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:49:12.468939" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:49:12.469109" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 68 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:49:12.436273" elapsed="0.032865"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:49:12.469598" level="INFO">${flows} = ['0']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:49:12.469313" elapsed="0.000312"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:12.470185" level="INFO">${total_flows} = 0</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:12.469793" elapsed="0.000421"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:49:12.470769" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-04-10T00:49:12.470885" level="FAIL">0.0 != 10000.0</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-04-10T00:49:12.470407" elapsed="0.000560">0.0 != 10000.0</status>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="FAIL" start="2026-04-10T00:49:12.434331" elapsed="0.036758">0.0 != 10000.0</status>
</kw>
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:14.474119" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:14.473444" elapsed="0.001211"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.473376" elapsed="0.001343"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:14.513024" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:14.500614" elapsed="0.012505"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:14.515633" elapsed="0.000197"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:14.514814" elapsed="0.001060"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.514781" elapsed="0.001126"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:14.519204" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:14.516067" elapsed="0.003276"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:49:14.541813" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<msg time="2026-04-10T00:49:14.542160" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:49:14.519527" elapsed="0.022681"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:49:14.542344" elapsed="0.000101"/>
</return>
<msg time="2026-04-10T00:49:14.542711" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 68 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:49:14.513839" elapsed="0.028918"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:49:14.543609" level="INFO">${flows} = ['10000']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:49:14.543114" elapsed="0.000679"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:14.544760" level="INFO">${total_flows} = 10000</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:14.544031" elapsed="0.000766"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:49:14.545533" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-04-10T00:49:14.545131" elapsed="0.000516"/>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="PASS" start="2026-04-10T00:49:14.472272" elapsed="0.073457"/>
</kw>
<arg>${time_out}</arg>
<arg>2s</arg>
<arg>MininetKeywords.Check Flows In Mininet</arg>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:49:12.433673" elapsed="2.112125"/>
</kw>
<arg>${mininet_conn_id}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${operation_timeout}</arg>
<doc>Verify flow count per switch</doc>
<status status="PASS" start="2026-04-10T00:49:12.433134" elapsed="2.112751"/>
</kw>
<doc>Verify 10000 flows per DPN installed in switch after it is connected to inventory leader.</doc>
<status status="PASS" start="2026-04-10T00:49:12.024350" elapsed="2.521714"/>
</test>
<test id="s1-s1-t16" name="Stop Mininet Connected To Inventory Leader" line="148">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:49:14.551097" elapsed="0.000259"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:49:14.550812" elapsed="0.000607"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:14.552660" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:14.552490" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.552460" elapsed="0.000296"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:14.557976" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:14.557863" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.557844" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:14.559119" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:14.558707" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:14.559705" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:14.559362" elapsed="0.000370"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:14.559778" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:49:14.559950" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:14.558294" elapsed="0.001681"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:14.565726" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:14.565612" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.565593" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:14.567069" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:14.566960" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.566943" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:14.567695" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:14.567294" elapsed="0.000428"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:14.568138" level="INFO">${current_connection_index} = 68</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:14.567893" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:14.604616" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:14.568735" elapsed="0.039350"/>
</kw>
<msg time="2026-04-10T00:49:14.610405" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:14.610485" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:14.568361" elapsed="0.042181"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:14.664465" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:14.615139" elapsed="0.050738"/>
</kw>
<msg time="2026-04-10T00:49:14.666162" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:14.666214" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:14.612044" elapsed="0.054215"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.667872" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:14.667280" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.666814" elapsed="0.001159"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:14.668626" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:14.668127" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.669029" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:14.668803" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.668784" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:14.669153" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:14.671971" elapsed="0.000158"/>
</kw>
<msg time="2026-04-10T00:49:14.672193" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:14.670886" elapsed="0.001451"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.672646" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.672987" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:14.670191" elapsed="0.002986"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:14.669560" elapsed="0.003716"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:14.566654" elapsed="0.106727"/>
</kw>
<msg time="2026-04-10T00:49:14.673493" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:14.673565" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:14.565955" elapsed="0.107660"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:14.673814" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:49:14.673701" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.673681" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.674349" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.674726" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:14.674800" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:14.565249" elapsed="0.109664"/>
</kw>
<msg time="2026-04-10T00:49:14.675490" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:14.675625" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:14.560406" elapsed="0.115261"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.676016" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:14.675749" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.675731" elapsed="0.000363"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:14.560241" elapsed="0.115877"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:14.682743" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:14.682612" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.682462" elapsed="0.000364"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:14.684193" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:14.684081" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.684063" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:14.684783" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:14.684417" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:14.685208" level="INFO">${current_connection_index} = 68</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:14.684977" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:14.717078" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:14.685916" elapsed="0.035067"/>
</kw>
<msg time="2026-04-10T00:49:14.721805" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:14.721874" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:14.685396" elapsed="0.036522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:14.773892" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:14.723407" elapsed="0.050879"/>
</kw>
<msg time="2026-04-10T00:49:14.774641" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:14.774696" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:14.722260" elapsed="0.052475"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.776408" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:14.775423" elapsed="0.001055"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.774847" elapsed="0.001662"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:14.777699" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:14.776687" elapsed="0.001111"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.778137" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:14.777882" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.777860" elapsed="0.000363"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:14.778266" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:14.781227" elapsed="0.000176"/>
</kw>
<msg time="2026-04-10T00:49:14.781487" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:14.780116" elapsed="0.001589"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.782096" elapsed="0.000104"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.782578" elapsed="0.000084"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:14.779329" elapsed="0.003456"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:14.778674" elapsed="0.004178"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:14.683758" elapsed="0.099219"/>
</kw>
<msg time="2026-04-10T00:49:14.783106" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:14.783154" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:14.683005" elapsed="0.102228"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:14.785607" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-10T00:49:14.785400" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.785363" elapsed="0.000359"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.786273" 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-04-10T00:49:14.786667" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:14.786759" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:14.682061" elapsed="0.104823"/>
</kw>
<msg time="2026-04-10T00:49:14.786996" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:14.787052" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:14.676420" elapsed="0.110674"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.787469" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:14.787175" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.787157" elapsed="0.000409"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:14.676270" elapsed="0.111323"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:14.793794" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:14.793669" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.793646" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:14.795243" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:14.795128" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.795110" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:14.795891" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:14.795476" elapsed="0.000445"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:14.796333" level="INFO">${current_connection_index} = 68</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:14.796099" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:14.834450" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:14.796889" elapsed="0.037839"/>
</kw>
<msg time="2026-04-10T00:49:14.834972" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:14.835027" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:14.796522" elapsed="0.038552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:14.907633" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:14.835901" elapsed="0.072172"/>
</kw>
<msg time="2026-04-10T00:49:14.908426" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:14.908477" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:14.835354" elapsed="0.073160"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.909071" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:14.908680" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.908636" elapsed="0.000531"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:14.909813" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "S "t "o "p "[C "M "i "n "i "n "e "t "[C "C "o "n "n "e "c "t "e "d "[78C[C "[A[78CT
 "o "[C "I "n "v "e "n "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:14.909324" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.910385" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:14.910137" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.910108" elapsed="0.000358"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:14.910507" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:14.913805" elapsed="0.000154"/>
</kw>
<msg time="2026-04-10T00:49:14.914022" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:14.912651" elapsed="0.001509"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.914438" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.914800" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:14.911949" elapsed="0.003038"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:14.910896" elapsed="0.004156"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:14.794814" elapsed="0.120337"/>
</kw>
<msg time="2026-04-10T00:49:14.915247" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:14.915290" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:14.794043" elapsed="0.121283"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:14.915511" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:14.915403" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.915385" elapsed="0.000345"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.916204" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.916684" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:14.916791" elapsed="0.000025"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:14.793220" elapsed="0.123734"/>
</kw>
<msg time="2026-04-10T00:49:14.917096" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:14.917161" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:14.787948" elapsed="0.129264"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:14.917986" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:14.917601" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.917537" elapsed="0.000563"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:14.787775" elapsed="0.130360"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:14.560044" elapsed="0.358140"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:49:14.557482" elapsed="0.360792"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:49:14.552124" elapsed="0.366238"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:14.551608" elapsed="0.366826"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:49:14.547130" elapsed="0.371391"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:14.925579" elapsed="0.000146"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:14.925338" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:14.925321" elapsed="0.000464"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:14.927267" level="INFO">exit</msg>
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:14.925925" elapsed="0.001403"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:49:15.091603" level="INFO">*** Stopping 1 controllers
c0 
*** Stopping 1 links
.
*** Stopping 1 switches
s1 
*** Stopping 1 hosts
h1 
*** Done
completed in 3.217 seconds
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:49:14.927601" elapsed="0.164228"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:15.092175" elapsed="0.000311"/>
</kw>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="PASS" start="2026-04-10T00:49:14.925056" elapsed="0.167539"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:15.095921" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:15.095568" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:15.095514" elapsed="0.000495"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:15.096373" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:15.096173" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:15.097269" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:15.096879" elapsed="0.000436"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:15.097874" level="INFO">${conn_id} = 69</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:15.097476" elapsed="0.000424"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:15.099169" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:15.099248" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:15.098517" elapsed="0.000755"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:15.099437" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:15.100684" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:15.430422" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:11 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:15.100350" elapsed="0.330344"/>
</kw>
<msg time="2026-04-10T00:49:15.430859" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:15.099959" elapsed="0.331055"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:15.098122" elapsed="0.333118"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:15.432273" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:49:16.662012" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:49:16.662488" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:16.662685" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:15.431765" elapsed="1.231009"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:16.663314" elapsed="0.000784"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:16.665325" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:16.664616" elapsed="0.001069"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:16.666212" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:16.665886" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:16.665830" elapsed="0.000554"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:16.666875" elapsed="0.000078"/>
</return>
<status status="PASS" start="2026-04-10T00:49:16.666515" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:16.666478" elapsed="0.000618"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:16.667180" elapsed="0.000035"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:16.671727" elapsed="0.000499"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:16.672478" elapsed="0.000271"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:16.672972" 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-04-10T00:49:16.667833" elapsed="0.005363"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:15.094982" elapsed="1.578354"/>
</kw>
<msg time="2026-04-10T00:49:16.673420" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:15.094019" elapsed="1.579483"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:49:15.093454" elapsed="1.580192"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:16.676478" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:16.676186" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:16.676168" elapsed="0.000412"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:16.676892" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:16.676736" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:16.677595" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:16.677184" elapsed="0.000460"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:16.678177" level="INFO">${conn_id} = 71</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:16.677801" elapsed="0.000403"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:16.679440" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:16.679519" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:16.679146" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:16.679748" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:16.680960" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:17.028420" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:48:32 UTC 2026

  System load:  0.15               Processes:             186
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:15 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:16.680638" elapsed="0.348023"/>
</kw>
<msg time="2026-04-10T00:49:17.028886" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:16.680242" elapsed="0.348744"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:16.678427" elapsed="0.350712"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:17.029832" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:49:17.063768" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:49:17.064062" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:17.064160" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:17.029457" elapsed="0.034755"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:17.064685" elapsed="0.000570"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.066395" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:17.065741" elapsed="0.000747"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:17.067027" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:17.066710" elapsed="0.000433"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.066654" elapsed="0.000541"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:17.067777" elapsed="0.000069"/>
</return>
<status status="PASS" start="2026-04-10T00:49:17.067462" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.067407" elapsed="0.000576"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:17.068063" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:17.072384" elapsed="0.000505"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:17.073130" elapsed="0.000240"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:17.073606" elapsed="0.000142"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:17.068711" elapsed="0.005114"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:16.675648" elapsed="0.398313"/>
</kw>
<msg time="2026-04-10T00:49:17.074041" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:16.674870" elapsed="0.399246"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:49:16.673994" elapsed="0.400238"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:15.092959" elapsed="1.981359"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="PASS" start="2026-04-10T00:49:14.546365" elapsed="2.528120"/>
</test>
<test id="s1-s1-t17" name="Delete All Flows From Follower Node1" line="153">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:49:17.082017" elapsed="0.000234"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:49:17.081725" elapsed="0.000584"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:17.083426" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:17.083298" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.083252" elapsed="0.000253"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:17.088781" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:17.088671" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.088652" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.089913" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:17.089490" elapsed="0.000454"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.090442" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:17.090127" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:17.090516" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:49:17.090726" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:17.089102" elapsed="0.001650"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:17.097343" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:17.097206" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.097182" elapsed="0.000253"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:17.098981" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:17.098846" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.098823" elapsed="0.000244"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:17.099642" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:17.099223" elapsed="0.000448"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:17.100093" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:17.099839" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:17.139463" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:17.100725" elapsed="0.039241"/>
</kw>
<msg time="2026-04-10T00:49:17.140229" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:17.140280" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:17.100287" elapsed="0.040031"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:17.202135" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "D "e "l "e "t "e "[C "A "l "l "[C "F "l "o "w "s "[C "F "r "o "m "[C "[78CF "[A[78Co
 "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:17.141498" elapsed="0.060909"/>
</kw>
<msg time="2026-04-10T00:49:17.202686" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:17.202738" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:17.140641" elapsed="0.062136"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.203346" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:17.202920" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.202869" elapsed="0.000650"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.204138" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "D "e "l "e "t "e "[C "A "l "l "[C "F "l "o "w "s "[C "F "r "o "m "[C "[78CF "[A[78Co
 "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:17.203709" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.204524" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:17.204299" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.204281" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:17.204664" elapsed="0.000050"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:17.206339" elapsed="0.000843"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:17.207502" elapsed="0.000528"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:17.208303" 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-04-10T00:49:17.205660" elapsed="0.003153"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:17.205030" elapsed="0.003851"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:17.098409" elapsed="0.110576"/>
</kw>
<msg time="2026-04-10T00:49:17.209087" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:17.209133" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:17.097633" elapsed="0.111539"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:17.209457" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:17.209344" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.209323" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.209990" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.210401" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:17.210500" 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-04-10T00:49:17.096789" elapsed="0.113859"/>
</kw>
<msg time="2026-04-10T00:49:17.210751" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:17.210799" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:17.091313" elapsed="0.119524"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.211185" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:17.210918" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.210900" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:17.091103" elapsed="0.120187"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:17.219071" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:17.218901" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.218875" elapsed="0.000295"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:17.220787" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:17.220676" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.220657" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:17.221362" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:17.221016" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:17.221832" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:17.221601" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:17.261123" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:17.222401" elapsed="0.038923"/>
</kw>
<msg time="2026-04-10T00:49:17.261778" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:17.261831" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:17.222033" elapsed="0.039835"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:17.320696" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "D "e "l "e "t "e "[C "A "l "l "[C "F "l "o "w "s "[C "F "r "o "m "[C "[78CF "[A[78Co
 "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:17.262610" elapsed="0.058408"/>
</kw>
<msg time="2026-04-10T00:49:17.321298" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:17.321348" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:17.262132" elapsed="0.059256"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.321950" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:17.321533" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.321485" elapsed="0.000561"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.322666" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "D "e "l "e "t "e "[C "A "l "l "[C "F "l "o "w "s "[C "F "r "o "m "[C "[78CF "[A[78Co
 "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:17.322203" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.323159" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:17.322935" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.322916" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:17.323283" elapsed="0.000049"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:17.325489" elapsed="0.000850"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:17.326655" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:17.327424" elapsed="0.000432"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:17.324749" elapsed="0.003217"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:17.323744" elapsed="0.004290"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:17.220291" elapsed="0.107846"/>
</kw>
<msg time="2026-04-10T00:49:17.328235" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:17.328281" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:17.219386" elapsed="0.108933"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:17.328510" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:17.328400" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.328382" elapsed="0.000232"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.329031" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.329373" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:17.329448" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:17.218377" elapsed="0.111195"/>
</kw>
<msg time="2026-04-10T00:49:17.329672" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:17.329717" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:17.211652" elapsed="0.118102"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.330084" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:17.329832" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.329815" elapsed="0.000350"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:17.211477" elapsed="0.118711"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:17.335941" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:17.335832" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.335813" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:17.337142" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:17.337035" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.337018" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:17.337675" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:17.337354" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:17.338076" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:17.337860" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:17.376104" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:17.338641" elapsed="0.037810"/>
</kw>
<msg time="2026-04-10T00:49:17.377012" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:17.377077" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:17.338261" elapsed="0.038867"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:17.441033" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "D "e "l "e "t "e "[C "A "l "l "[C "F "l "o "w "s "[C "F "r "o "m "[C "[78CF "[A[78Co
 "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:17.378225" elapsed="0.062967"/>
</kw>
<msg time="2026-04-10T00:49:17.441382" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:17.441432" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:17.377530" elapsed="0.063941"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.441924" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:17.441618" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.441578" elapsed="0.000439"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.442535" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "D "e "l "e "t "e "[C "A "l "l "[C "F "l "o "w "s "[C "F "r "o "m "[C "[78CF "[A[78Co
 "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:17.442171" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.442942" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:17.442715" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.442696" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:17.443063" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:17.444769" elapsed="0.000799"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:17.445856" elapsed="0.000477"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:17.446624" elapsed="0.003028"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:17.444081" 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-04-10T00:49:17.443420" elapsed="0.006406"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:17.336734" elapsed="0.113204"/>
</kw>
<msg time="2026-04-10T00:49:17.450034" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:17.450079" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:17.336162" elapsed="0.113954"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:17.450305" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:49:17.450195" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.450176" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.450834" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.451193" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:17.451266" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:17.335420" elapsed="0.115955"/>
</kw>
<msg time="2026-04-10T00:49:17.451470" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:17.451515" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:17.330484" elapsed="0.121117"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.452038" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:17.451742" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.451723" elapsed="0.000394"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:17.330337" elapsed="0.121804"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:17.090890" elapsed="0.361287"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:49:17.088282" elapsed="0.363953"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:49:17.082959" elapsed="0.369332"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:17.082466" elapsed="0.369870"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:49:17.076464" elapsed="0.375924"/>
</kw>
<kw name="Delete Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Delete Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.463318" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:17.463000" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:17.463393" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:17.463566" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:17.462637" elapsed="0.000960"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.478575" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:17.478283" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.479039" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:17.478784" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.479524" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:17.479243" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.480063" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:17.479767" elapsed="0.000341"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:17.480992" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:49:17.480751" elapsed="0.000276"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:49:17.481374" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:49:17.481187" elapsed="0.000212"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:49:17.481569" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.482644" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:17.482275" elapsed="0.000416"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:49:17.482735" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:17.482922" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:49:17.480317" elapsed="0.002636"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:17.497243" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0labrpeq6hvzrqou5cqfegtpr0.node0', 'Content-Length': '404', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:49:17.497319" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:17.497500" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:17.485779" elapsed="0.011795"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:17.483028" elapsed="0.014619"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.497920" elapsed="0.000090"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:17.497689" elapsed="0.000393"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.483009" elapsed="0.015106"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.503320" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:17.499682" elapsed="0.003704"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:17.499334" elapsed="0.004104"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.499308" elapsed="0.004168"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.507875" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:17.503964" elapsed="0.003983"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:17.503579" elapsed="0.004421"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.503534" elapsed="0.004502"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.508928" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:17.508293" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.509503" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:17.509108" elapsed="0.000508"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.510357" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:17.509908" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:17.509653" elapsed="0.000795"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.509078" elapsed="0.001402"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.511289" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:17.510739" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.511798" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:17.511430" elapsed="0.000497"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.512594" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:17.512202" elapsed="0.000419"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:17.511963" elapsed="0.000692"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.511404" elapsed="0.001272"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:17.512830" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:17.513646" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:17.513339" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:17.513830" elapsed="0.002409"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:17.498684" elapsed="0.017619"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:17.516482" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:17.516376" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.516358" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:17.519099" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:17.516712" elapsed="0.002414"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:17.519174" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:17.519331" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:17.474962" elapsed="0.044393"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:17.519421" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:49:17.519585" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:49:17.471712" elapsed="0.047899"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:17.519704" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:17.519854" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:17.462158" elapsed="0.057767"/>
</kw>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Delete Bulk Flow in member 1 according to ${json_body_del}.</doc>
<status status="PASS" start="2026-04-10T00:49:17.457592" elapsed="0.062398"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.527315" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:17.526987" elapsed="0.000355"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:17.527389" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:17.527540" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:17.526590" elapsed="0.000995"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.534247" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:17.533995" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.534714" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:17.534452" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:17.540788" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:17.540845" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:17 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782157,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:17.540937" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:17.536915" elapsed="0.004049"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:17.534825" elapsed="0.006182"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.541187" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:17.541034" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.534808" elapsed="0.006466"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.545077" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782157,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:17.542312" elapsed="0.002838"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:17.542088" elapsed="0.003115"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.542071" elapsed="0.003168"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.549267" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:17.545669" elapsed="0.003667"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:17.545321" elapsed="0.004066"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.545297" elapsed="0.004125"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.550234" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:17.549686" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.550753" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:17.550379" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.551592" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:17.551120" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:17.550876" elapsed="0.000810"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.550353" elapsed="0.001409"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.552561" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:17.552045" elapsed="0.000545"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.552895" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:17.552661" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.553481" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:17.553183" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:17.553018" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.552644" elapsed="0.000939"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:17.553736" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:17.554526" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:17.554249" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:17.554726" elapsed="0.002721"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:17.541663" elapsed="0.015855"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:17.557717" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:49:17.557608" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:17.557588" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:17.557956" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:17.558029" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:49:17.560411" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782157,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:17.527961" elapsed="0.032479"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:17.560493" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:17.560664" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782157,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:17.526110" elapsed="0.034581"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.561689" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782157, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:17.561257" elapsed="0.000461"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:17.561768" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:17.561947" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782157, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:17.560914" elapsed="0.001062"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:17.562387" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:17.562174" elapsed="0.000249"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.562996" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:17.562666" elapsed="0.000358"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.563496" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:17.563220" elapsed="0.000301"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:17.564126" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:17.563719" elapsed="0.000492">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:17.521374" elapsed="0.042955">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.576193" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:18.575773" elapsed="0.000460"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:18.576299" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:49:18.576485" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:18.575377" elapsed="0.001134"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.583513" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:18.583236" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.584084" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:18.583833" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:18.592186" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:18.592247" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782158,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:18.592342" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:18.586328" elapsed="0.006040"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:18.584208" elapsed="0.008204"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.592661" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:18.592440" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.584185" elapsed="0.008603"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.597642" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782158,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:18.594257" elapsed="0.003455"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:18.593942" elapsed="0.003819"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.593917" elapsed="0.003879"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.601536" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:18.598185" elapsed="0.003413"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:18.597874" elapsed="0.003759"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.597851" elapsed="0.003807"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.602239" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:18.601840" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.602593" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:18.602336" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.603148" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:18.602844" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:18.602677" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.602319" elapsed="0.000914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.603774" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:18.603394" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.604122" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:18.603871" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.604693" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:18.604370" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:18.604206" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.603853" elapsed="0.000924"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:18.604936" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:18.605796" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:18.605481" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:18.605979" elapsed="0.002378"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:18.593330" elapsed="0.015091"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:18.608659" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:49:18.608533" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.608511" elapsed="0.000237"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.608901" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:18.608973" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:49:18.611330" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782158,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:18.576921" elapsed="0.034438"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:18.611412" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:18.611586" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782158,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:18.574877" elapsed="0.036736"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.612588" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782158, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:18.612172" elapsed="0.000446"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:18.612666" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:18.612819" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782158, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:18.611833" elapsed="0.001011"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:18.613203" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:18.613024" elapsed="0.000203"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.613768" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:18.613439" elapsed="0.000355"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.614234" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:18.613970" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:49:18.614433" elapsed="0.000411"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:49:18.565506" elapsed="0.049402"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:49:17.520780" elapsed="1.094179"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 1.</doc>
<status status="PASS" start="2026-04-10T00:49:17.520210" elapsed="1.094814"/>
</kw>
<arg>${temp_json_config_del}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Delete Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:49:17.457066" elapsed="1.158015"/>
</kw>
<doc>10000 Flows deleted via Follower Node1 and verify it gets applied in all instances.</doc>
<status status="PASS" start="2026-04-10T00:49:17.075166" elapsed="1.540049"/>
</test>
<test id="s1-s1-t18" name="Verify No Flows In Inventory Leader" line="160">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:49:18.619124" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:49:18.618641" elapsed="0.000758"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:18.620407" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:18.620295" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.620277" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:18.625582" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:18.625461" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.625442" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.626656" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:18.626263" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.627145" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:18.626844" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:18.627214" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:18.627369" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:18.625886" elapsed="0.001513"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:18.633004" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:18.632896" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.632876" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:18.634310" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:18.634203" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.634186" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:18.634842" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:18.634524" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:18.635252" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:18.635032" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:18.672734" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:18.635806" elapsed="0.037029"/>
</kw>
<msg time="2026-04-10T00:49:18.672998" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:18.673044" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:18.635440" elapsed="0.037641"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:18.732092" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "N "o "[C "F "l "o "w "s "[C "I "n "[C "I "n "v "[78Ce "[A[78Cn
 "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:18.673654" elapsed="0.058557"/>
</kw>
<msg time="2026-04-10T00:49:18.732372" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:18.732418" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:18.673253" elapsed="0.059202"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.732781" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:18.732534" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.732514" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.733300" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "N "o "[C "F "l "o "w "s "[C "I "n "[C "I "n "v "[78Ce "[A[78Cn
 "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:18.733006" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.733772" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:18.733537" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.733431" elapsed="0.000419"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:18.733882" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:18.735329" elapsed="0.000791"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:18.736399" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:18.737158" elapsed="0.000425"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:18.734709" elapsed="0.002975"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:18.734150" elapsed="0.003597"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:18.633897" elapsed="0.103948"/>
</kw>
<msg time="2026-04-10T00:49:18.737983" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:18.738029" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:18.633227" elapsed="0.104839"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:18.738251" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:18.738144" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.738125" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.738751" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.739087" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:18.739160" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:18.632428" elapsed="0.106840"/>
</kw>
<msg time="2026-04-10T00:49:18.739361" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:18.739406" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:18.627864" elapsed="0.111578"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.739784" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:18.739517" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.739499" elapsed="0.000362"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:18.627718" elapsed="0.112166"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:18.745404" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:18.745297" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.745279" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:18.746768" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:18.746661" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.746644" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:18.747274" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:18.746981" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:18.747690" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:18.747460" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:18.781836" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:18.748210" elapsed="0.033850"/>
</kw>
<msg time="2026-04-10T00:49:18.782426" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:18.782521" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:18.747875" elapsed="0.034707"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:18.843466" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "N "o "[C "F "l "o "w "s "[C "I "n "[C "I "n "v "[78Ce "[A[78Cn
 "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:18.783112" elapsed="0.060489"/>
</kw>
<msg time="2026-04-10T00:49:18.843762" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:18.843808" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:18.782760" elapsed="0.061085"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.844147" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:18.843921" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.843902" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.844756" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "N "o "[C "F "l "o "w "s "[C "I "n "[C "I "n "v "[78Ce "[A[78Cn
 "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:18.844421" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.845126" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:18.844907" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.844889" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:18.845238" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:18.846914" elapsed="0.000788"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:18.847983" elapsed="0.000444"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:18.848709" elapsed="0.000355"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:18.846272" elapsed="0.002891"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:18.845509" elapsed="0.003719"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:18.746335" elapsed="0.102992"/>
</kw>
<msg time="2026-04-10T00:49:18.849456" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:18.849501" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:18.745773" elapsed="0.103766"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:18.849779" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:18.849671" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.849652" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.850254" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.850612" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:18.850687" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:18.744959" elapsed="0.105835"/>
</kw>
<msg time="2026-04-10T00:49:18.850889" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:18.850933" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:18.740153" elapsed="0.110816"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.851292" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:18.851044" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.851027" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:18.740009" elapsed="0.111382"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:18.856763" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:18.856657" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.856638" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:18.858104" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:18.857997" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.857980" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:18.858623" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:18.858315" elapsed="0.000336"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:18.859017" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:18.858809" elapsed="0.000234"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:18.893312" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:18.859599" elapsed="0.033813"/>
</kw>
<msg time="2026-04-10T00:49:18.893602" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:18.893667" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:18.859241" elapsed="0.034465"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:18.954784" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "N "o "[C "F "l "o "w "s "[C "I "n "[C "I "n "v "[78Ce "[A[78Cn
 "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:18.894218" elapsed="0.060692"/>
</kw>
<msg time="2026-04-10T00:49:18.955079" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:18.955126" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:18.893878" elapsed="0.061290"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.955483" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:18.955247" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.955227" elapsed="0.000362"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.956040" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "i "a "t "i "o "n "[C "M "u "l "t "i "[C "D "P "N ". "V "e "r "i "f "y "[C "N "o "[C "F "l "o "w "s "[C "I "n "[C "I "n "v "[78Ce "[A[78Cn
 "t "o "r "y "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:18.955737" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.956404" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:18.956190" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.956172" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:18.956513" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:18.957980" elapsed="0.000775"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:18.959032" elapsed="0.000439"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:18.959752" elapsed="0.000528"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:18.957323" elapsed="0.003059"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:18.956797" elapsed="0.003648"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:18.857689" elapsed="0.102875"/>
</kw>
<msg time="2026-04-10T00:49:18.960660" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:18.960703" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:18.856983" elapsed="0.103757"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:18.960923" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:18.960818" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.960800" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.961393" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.961763" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:18.961836" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:18.856304" elapsed="0.105640"/>
</kw>
<msg time="2026-04-10T00:49:18.962037" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:18.962081" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "R "e "c "o "n "c "i "l "l "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:18.851667" elapsed="0.110488"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:18.962486" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:18.962234" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:18.962216" elapsed="0.000365"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:18.851511" elapsed="0.111094"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:18.627507" elapsed="0.335129"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:49:18.625067" elapsed="0.337627"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:49:18.620005" elapsed="0.342748"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:18.619570" elapsed="0.343229"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:49:18.615971" elapsed="0.346885"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.972641" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:18.972247" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.973124" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:18.972830" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:18.973195" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:18.973347" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:18.971869" elapsed="0.001502"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.983666" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:18.983346" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:18.983738" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:18.983885" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:18.983001" elapsed="0.000908"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.997832" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:18.997561" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.998272" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:18.998034" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.998733" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:18.998470" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:18.999353" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:18.999118" elapsed="0.000277"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:19.000217" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:49:19.000021" elapsed="0.000221"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:49:19.000580" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:49:19.000394" elapsed="0.000211"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:49:19.000756" elapsed="0.000202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.001355" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:19.001112" elapsed="0.000286"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:49:19.001439" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:19.001612" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:49:18.999619" elapsed="0.002019"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:19.012734" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node013gawcwja405m14axcmgdzwrtx0.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:49:19.012800" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:19.012924" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:19.003824" elapsed="0.009136"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:19.001747" elapsed="0.011277"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:19.013276" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:19.013061" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:19.001728" elapsed="0.011672"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.018418" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:19.014878" elapsed="0.003600"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:19.014569" elapsed="0.003959"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:19.014524" elapsed="0.004058"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.022254" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:19.018971" elapsed="0.003346"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:19.018662" elapsed="0.003704"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:19.018638" elapsed="0.003793"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.023339" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:19.022762" elapsed="0.000615"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:19.023836" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:19.023476" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.024621" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:19.024175" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:19.023950" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:19.023451" elapsed="0.001289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.025467" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:19.024964" elapsed="0.000539"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:19.025985" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:19.025622" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.026747" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:19.026380" elapsed="0.000393"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:19.026147" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:19.025597" elapsed="0.001233"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:19.026979" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:19.027785" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:19.027482" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:19.027965" elapsed="0.002374"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:19.013945" elapsed="0.016456"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:19.030599" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:19.030474" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:19.030456" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:19.033191" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:19.030810" elapsed="0.002408"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:19.033307" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:19.033463" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:18.994893" elapsed="0.038595"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:19.033569" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:19.033721" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:49:18.992291" elapsed="0.041454"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:19.033795" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:49:19.033967" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:18.982553" elapsed="0.051438"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:49:18.978099" elapsed="0.055953"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:18.973575" elapsed="0.060510"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:18.973426" elapsed="0.060690"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.045608" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:19.045281" elapsed="0.000356"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:19.045685" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:19.045854" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:19.044931" elapsed="0.000950"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.052809" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:19.052516" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.053269" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:19.053021" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:19.059376" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:19.059432" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782159,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:19.059524" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:19.055494" elapsed="0.004102"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:19.053385" elapsed="0.006273"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:19.059935" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:19.059698" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:19.053365" elapsed="0.006698"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.064985" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782159,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:19.061494" elapsed="0.003562"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:19.061182" elapsed="0.003923"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:19.061157" elapsed="0.003982"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.069004" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:19.065528" elapsed="0.003549"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:19.065218" elapsed="0.003908"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:19.065194" elapsed="0.003967"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.070060" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:19.069391" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:19.070561" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:19.070205" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.071133" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:19.070815" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:19.070648" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:19.070178" elapsed="0.001042"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.071778" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:19.071386" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:19.072127" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:19.071879" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.072691" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:19.072373" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:19.072211" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:19.071861" elapsed="0.000914"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:19.072929" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:19.073754" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:19.073456" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:19.073962" elapsed="0.002387"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:19.060575" elapsed="0.015839"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:19.076613" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:49:19.076486" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:19.076467" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:19.076852" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:19.076925" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:49:19.079309" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782159,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:19.046223" elapsed="0.033115"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:19.079392" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:19.079572" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782159,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:19.044451" elapsed="0.035151"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.080608" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782159, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:19.080183" elapsed="0.000454"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:19.080686" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:19.080840" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782159, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:19.079830" elapsed="0.001036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:19.081237" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:19.081046" elapsed="0.000218"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.081770" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:19.081443" elapsed="0.000354"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.082331" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:19.082002" elapsed="0.000355"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:19.082933" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:19.082558" elapsed="0.000462">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:19.039942" elapsed="0.043200">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:20.098899" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:20.098458" elapsed="0.000478"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:20.099002" elapsed="0.000077"/>
</return>
<msg time="2026-04-10T00:49:20.099214" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:20.098088" elapsed="0.001152"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:20.105979" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:20.105708" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:20.106446" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:20.106190" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:20.113445" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:20.113509" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782160,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:20.113646" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:20.108807" elapsed="0.004868"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:20.106592" elapsed="0.007135"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:20.113915" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:20.113756" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:20.106567" elapsed="0.007437"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:20.117598" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782160,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:20.115034" elapsed="0.002629"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:20.114809" elapsed="0.002891"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:20.114790" elapsed="0.002935"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:20.120429" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:20.118007" elapsed="0.002469"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:20.117781" elapsed="0.002729"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:20.117764" elapsed="0.002769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:20.121166" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:20.120754" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:20.121503" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:20.121264" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:20.122080" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:20.121777" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:20.121606" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:20.121246" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:20.122714" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:20.122324" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:20.123042" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:20.122810" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:20.123742" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:20.123423" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:20.123249" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:20.122793" elapsed="0.001033"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:20.123984" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:20.124820" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:20.124502" elapsed="0.000344"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:20.125003" elapsed="0.002603"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:20.114366" elapsed="0.013308"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:20.127882" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:49:20.127765" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:20.127739" elapsed="0.000236"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:20.128129" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:20.128205" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:49:20.130537" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782160,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:20.099611" elapsed="0.030969"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:20.130634" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:20.130788" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782160,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:20.097367" elapsed="0.033448"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:20.131843" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782160, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:20.131425" elapsed="0.000446"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:20.131920" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:20.132071" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782160, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:20.131040" elapsed="0.001057"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:20.132454" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:20.132274" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:20.132974" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:20.132672" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:20.133432" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:20.133172" elapsed="0.000285"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:20.133995" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:20.133643" elapsed="0.000430">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:20.084483" elapsed="0.049704">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:21.145833" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:21.145275" elapsed="0.000606"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:21.145964" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T00:49:21.146205" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:21.144739" elapsed="0.001504"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:21.154143" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:21.153858" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:21.154733" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:21.154460" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:21.161148" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:21.161224" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:21 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782161,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:21.161323" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:21.157273" elapsed="0.004076"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:21.154856" elapsed="0.006537"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:21.161599" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:21.161421" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:21.154833" elapsed="0.006860"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:21.165239" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782161,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:21.162745" elapsed="0.002544"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:21.162500" elapsed="0.002823"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:21.162482" elapsed="0.002865"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:21.168106" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:21.165643" elapsed="0.002510"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:21.165404" elapsed="0.002784"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:21.165387" elapsed="0.002869"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:21.168979" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:21.168443" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:21.169475" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:21.169123" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:21.170318" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:21.169869" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:21.169625" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:21.169096" elapsed="0.001348"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:21.171242" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:21.170706" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:21.171751" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:21.171385" elapsed="0.000452"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:21.172600" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:21.172115" elapsed="0.000526"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:21.171872" elapsed="0.000822"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:21.171360" elapsed="0.001366"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:21.172954" elapsed="0.000513"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:21.174164" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:21.173739" elapsed="0.000463"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:21.174432" elapsed="0.003669"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:21.162068" elapsed="0.016128"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:21.178534" elapsed="0.000067"/>
</return>
<status status="PASS" start="2026-04-10T00:49:21.178372" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:21.178343" elapsed="0.000348"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:21.178916" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:21.179022" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:49:21.181916" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782161,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:21.146784" elapsed="0.035161"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:21.181998" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:21.182147" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782161,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:21.143994" elapsed="0.038179"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:21.183153" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782161, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:21.182752" elapsed="0.000429"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:21.183230" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:21.183383" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782161, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:21.182394" elapsed="0.001014"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:21.183785" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:21.183603" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:21.184306" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:21.183987" elapsed="0.000346"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:21.184787" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:21.184507" elapsed="0.000306"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:21.185347" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:21.184985" elapsed="0.000439">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:21.135179" elapsed="0.050356">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:22.196954" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:22.196324" elapsed="0.000683"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:22.197104" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:49:22.197643" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:22.195742" elapsed="0.001944"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:22.207217" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:22.206933" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:22.207692" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:22.207428" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:22.217742" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:22.217835" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:22 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:22 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782162,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:22.217985" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:22.210854" elapsed="0.007172"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:22.207813" elapsed="0.010379"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:22.218573" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:22.218239" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:22.207791" elapsed="0.010927"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:22.224086" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782162,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:22.220325" elapsed="0.003834"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:22.219988" elapsed="0.004224"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:22.219960" elapsed="0.004288"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:22.228284" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:22.224687" elapsed="0.003666"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:22.224332" elapsed="0.004073"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:22.224307" elapsed="0.004133"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:22.229445" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:22.228798" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:22.229880" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:22.229616" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:22.230436" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:22.230129" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:22.229963" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:22.229588" elapsed="0.000930"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:22.231065" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:22.230698" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:22.231394" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:22.231160" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:22.231953" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:22.231654" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:22.231476" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:22.231143" elapsed="0.000893"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:22.232194" elapsed="0.000373"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:22.233043" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:22.232741" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:22.233228" elapsed="0.002629"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:22.219303" elapsed="0.016623"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:22.236111" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:49:22.236002" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:22.235983" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:22.236360" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:22.236433" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:49:22.238826" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782162,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:22.198265" elapsed="0.040592"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:22.238911" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:22.239067" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782162,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:22.194939" elapsed="0.044155"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:22.240201" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782162, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:22.239788" elapsed="0.000442"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:22.240280" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:22.240437" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782162, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:22.239401" elapsed="0.001063"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:22.240847" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:22.240662" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:22.241392" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:22.241053" elapsed="0.000367"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:22.241881" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:22.241610" elapsed="0.000297"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:22.242437" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:22.242081" elapsed="0.000431">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:22.186391" elapsed="0.056251">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:23.256157" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:23.255704" elapsed="0.000490"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:23.256262" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:49:23.256464" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:23.255310" elapsed="0.001184"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:23.263754" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:23.263463" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:23.264203" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:23.263958" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:23.271282" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:23.271344" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:23 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:23 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782163,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:23.271439" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:23.266468" elapsed="0.004997"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:23.264326" elapsed="0.007182"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:23.271718" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:23.271535" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:23.264303" elapsed="0.007501"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:23.275382" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782163,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:23.272865" elapsed="0.002569"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:23.272633" elapsed="0.002836"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:23.272615" elapsed="0.002879"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:23.278195" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:23.275790" elapsed="0.002452"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:23.275567" elapsed="0.002733"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:23.275533" elapsed="0.002792"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:23.278933" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:23.278512" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:23.279343" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:23.279100" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:23.279918" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:23.279612" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:23.279427" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:23.279081" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:23.280527" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:23.280164" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:23.280877" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:23.280643" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:23.281413" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:23.281118" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:23.280958" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:23.280626" elapsed="0.000869"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:23.281669" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:23.282523" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:23.282188" elapsed="0.000375"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:23.282723" elapsed="0.002355"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:23.272181" elapsed="0.012961"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:23.285319" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:49:23.285213" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:23.285195" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:23.285569" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:23.285643" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:49:23.287966" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782163,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:23.256890" elapsed="0.031105"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:23.288048" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:23.288199" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782163,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:23.254802" elapsed="0.033423"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:23.289213" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782163, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:23.288807" elapsed="0.000435"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:23.289292" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:23.289449" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782163, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:23.288445" elapsed="0.001030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:23.289858" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:23.289672" elapsed="0.000212"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:23.290404" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:23.290062" elapsed="0.000368"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:23.290893" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:23.290621" elapsed="0.000298"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:23.291494" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:23.291130" elapsed="0.000457">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:23.243757" elapsed="0.047942">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:24.305597" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:24.305164" elapsed="0.000472"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:24.305703" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:49:24.305890" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:24.304755" elapsed="0.001161"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:24.313016" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:24.312611" elapsed="0.000478"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:24.313519" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:24.313270" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:24.320663" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:24.320741" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:24 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:24 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782164,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:24.320904" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:24.315883" elapsed="0.005061"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:24.313686" elapsed="0.007331"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:24.321344" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:24.321069" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:24.313655" elapsed="0.007820"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:24.327420" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782164,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:24.323264" elapsed="0.004236"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:24.322871" elapsed="0.004706"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:24.322840" elapsed="0.004776"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:24.331762" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:24.328082" elapsed="0.003741"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:24.327742" elapsed="0.004118"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:24.327715" elapsed="0.004169"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:24.332535" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:24.332098" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:24.332897" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:24.332652" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:24.333453" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:24.333146" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:24.332978" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:24.332634" elapsed="0.000905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:24.334091" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:24.333725" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:24.334422" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:24.334188" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:24.334983" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:24.334683" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:24.334504" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:24.334170" elapsed="0.000972"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:24.335328" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:24.336175" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:24.335867" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:24.336362" elapsed="0.002440"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:24.322128" elapsed="0.016750"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:24.339070" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T00:49:24.338955" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:24.338936" elapsed="0.000240"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:24.339641" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:24.339725" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:49:24.342137" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782164,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:24.306292" elapsed="0.035874"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:24.342221" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:24.342375" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782164,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:24.303959" elapsed="0.038442"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:24.343489" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782164, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:24.343049" elapsed="0.000469"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:24.343582" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:24.343739" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782164, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:24.342673" elapsed="0.001093"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:24.344129" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:24.343947" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:24.344652" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:24.344331" elapsed="0.000348"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:24.345112" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:24.344851" elapsed="0.000286"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:24.345689" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:24.345311" elapsed="0.000463">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:24.292729" elapsed="0.053163">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:25.358595" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:25.358194" elapsed="0.000436"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:25.358690" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:49:25.358860" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:25.357828" elapsed="0.001057"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:25.365710" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:25.365428" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:25.366297" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:25.366042" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:25.373525" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:25.373634" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:25 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:25 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782165,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:25.373768" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:25.368512" elapsed="0.005293"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:25.366421" elapsed="0.007445"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:25.374123" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:25.373905" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:25.366399" elapsed="0.007845"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:25.379278" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782165,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:25.375701" elapsed="0.003650"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:25.375366" elapsed="0.004035"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:25.375341" elapsed="0.004095"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:25.382717" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:25.379855" elapsed="0.002910"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:25.379515" elapsed="0.003285"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:25.379491" elapsed="0.003333"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:25.383416" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:25.383009" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:25.383786" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:25.383513" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:25.384347" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:25.384028" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:25.383868" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:25.383495" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:25.384968" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:25.384608" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:25.385295" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:25.385064" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:25.385846" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:25.385533" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:25.385375" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:25.385046" elapsed="0.000883"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:25.386086" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:25.386913" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:25.386612" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:25.387092" elapsed="0.002385"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:25.374779" elapsed="0.014760"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:25.389736" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:49:25.389631" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:25.389613" elapsed="0.000253"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:25.390017" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:25.390087" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:49:25.392447" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782165,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:25.359237" elapsed="0.033239"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:25.392529" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:49:25.392696" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782165,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:25.357324" elapsed="0.035398"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:25.393768" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782165, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:25.393336" elapsed="0.000460"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:25.393844" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:49:25.394007" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782165, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:25.392976" elapsed="0.001057"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:25.394387" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:25.394207" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:25.394903" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:25.394604" elapsed="0.000325"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:25.395359" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:25.395099" elapsed="0.000284"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:25.395923" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:25.395568" elapsed="0.000432">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:25.346985" elapsed="0.049156">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:26.408137" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:26.407685" elapsed="0.000488"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:26.408236" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:49:26.408412" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:26.407212" elapsed="0.001225"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:26.415518" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:26.415251" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:26.415992" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:26.415742" 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-04-10T00:49:26.422807" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:26.422867" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:26 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:26 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782166,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:26.422961" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:26.418302" elapsed="0.004685"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:26.416113" elapsed="0.006919"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:26.423283" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:26.423124" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:26.416092" elapsed="0.007279"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:26.427360" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782166,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:26.424403" elapsed="0.003026"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:26.424179" elapsed="0.003299"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:26.424161" elapsed="0.003351"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:26.431322" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:26.427936" elapsed="0.003452"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:26.427617" elapsed="0.003820"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:26.427589" elapsed="0.003883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:26.432299" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:26.431749" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:26.432791" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:26.432436" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:26.433627" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:26.433181" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:26.432907" elapsed="0.000806"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:26.432410" elapsed="0.001333"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:26.434312" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:26.433951" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:26.434655" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:26.434407" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:26.435190" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:26.434896" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:26.434736" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:26.434390" elapsed="0.000881"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:26.435428" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:26.436264" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:26.435967" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:26.436445" elapsed="0.002446"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:26.423751" elapsed="0.015205"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:26.439163" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:49:26.439033" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:26.439011" 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-04-10T00:49:26.439442" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:26.439521" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:49:26.442343" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782166,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:26.408839" elapsed="0.033535"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:26.442436" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:49:26.442643" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782166,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:26.406721" elapsed="0.035951"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:26.443887" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782166, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:26.443385" elapsed="0.000535"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:26.443975" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:49:26.444154" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782166, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:26.442928" elapsed="0.001261"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:26.444651" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:26.444420" elapsed="0.000259"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:26.445244" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:26.444894" elapsed="0.000375"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:26.445724" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:26.445444" elapsed="0.000305"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:26.446282" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:26.445926" elapsed="0.000438">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:26.397227" elapsed="0.049253">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:27.458894" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:27.458233" elapsed="0.000719"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:27.459056" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:49:27.459348" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:27.457528" elapsed="0.001864"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:27.467525" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:27.467226" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:27.468033" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:27.467772" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:27.476616" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:27.476695" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:27 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782167,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:27.476821" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:27.470621" elapsed="0.006232"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:27.468165" elapsed="0.008752"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:27.477177" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:27.476959" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:27.468141" elapsed="0.009138"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:27.484975" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782167,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:27.478710" elapsed="0.006340"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:27.478410" elapsed="0.006689"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:27.478387" elapsed="0.006740"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:27.487906" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:27.485436" elapsed="0.002519"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:27.485190" elapsed="0.002802"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:27.485172" elapsed="0.002845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:27.488706" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:27.488268" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:27.489130" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:27.488884" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:27.489710" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:27.489378" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:27.489214" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:27.488865" elapsed="0.000975"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:27.490374" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:27.490004" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:27.490724" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:27.490472" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:27.491264" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:27.490967" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:27.490807" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:27.490454" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:27.491504" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:27.492338" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:27.492038" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:27.492520" elapsed="0.002421"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:27.477867" elapsed="0.017148"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:27.495200" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:49:27.495086" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:27.495068" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:27.495452" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:27.495524" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:49:27.497868" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782167,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:27.459988" elapsed="0.037909"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:27.497950" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:27.498102" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782167,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:27.456590" elapsed="0.041538"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:27.499163" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782167, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:27.498757" elapsed="0.000434"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:27.499239" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:27.499394" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782167, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:27.498373" elapsed="0.001047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:27.499799" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:27.499615" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:27.500320" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:27.500007" elapsed="0.000340"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:27.500806" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:27.500520" elapsed="0.000311"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:27.501421" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:27.501006" elapsed="0.000495">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:27.447940" elapsed="0.053691">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:28.512695" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:28.512139" elapsed="0.000604"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:28.512824" elapsed="0.000063"/>
</return>
<msg time="2026-04-10T00:49:28.513070" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:28.511587" elapsed="0.001518"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:28.521648" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:28.521256" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:28.522134" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:28.521881" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:28.529110" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:28.529180" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:28 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782168,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:28.529294" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:28.524453" elapsed="0.004869"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:28.522268" elapsed="0.007101"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:28.529624" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:28.529404" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:28.522242" elapsed="0.007482"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:28.534801" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782168,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:28.530970" elapsed="0.003907"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:28.530722" elapsed="0.004204"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:28.530703" elapsed="0.004258"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:28.538752" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:28.535355" elapsed="0.003464"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:28.535039" elapsed="0.003828"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:28.535016" elapsed="0.003885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:28.539745" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:28.539162" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:28.540211" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:28.539881" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:28.541026" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:28.540569" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:28.540322" elapsed="0.000791"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:28.539856" elapsed="0.001287"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:28.541893" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:28.541366" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:28.542370" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:28.542042" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:28.543144" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:28.542778" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:28.542484" elapsed="0.000805"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:28.542017" elapsed="0.001293"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:28.543471" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:28.544307" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:28.544007" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:28.544490" elapsed="0.002393"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:28.530162" elapsed="0.016790"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:28.547137" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-10T00:49:28.547025" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:28.547006" elapsed="0.000234"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:28.547392" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:28.547463" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:49:28.549789" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782168,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:28.513623" elapsed="0.036195"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:28.549872" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:28.550025" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782168,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:28.510838" elapsed="0.039213"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:28.551118" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782168, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:28.550709" elapsed="0.000437"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:28.551195" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:28.551350" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782168, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:28.550287" elapsed="0.001089"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:28.551758" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:28.551571" elapsed="0.000213"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:28.552262" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:28.551962" elapsed="0.000327"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:28.552745" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:28.552461" elapsed="0.000310"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:28.553310" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:28.552946" elapsed="0.000442">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:28.502714" elapsed="0.050787">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:29.568511" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:29.568082" elapsed="0.000480"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:29.568631" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:49:29.568823" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:29.567154" elapsed="0.001694"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:29.576438" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:29.575926" elapsed="0.000577"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:29.577104" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:29.576834" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:29.584322" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:29.584468" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:29 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782169,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:29.584798" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:29.579441" elapsed="0.005428"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:29.577238" elapsed="0.007735"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:29.585419" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:29.585040" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:29.577212" elapsed="0.008452"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:29.594296" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782169,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:29.588273" elapsed="0.006134"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:29.587734" elapsed="0.006751"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:29.587689" elapsed="0.006851"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:29.598253" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:29.595257" elapsed="0.003044"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:29.594720" elapsed="0.003618"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:29.594670" elapsed="0.003692"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:29.598984" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:29.598571" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:29.599351" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:29.599082" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:29.599928" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:29.599620" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:29.599435" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:29.599064" elapsed="0.000948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:29.600537" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:29.600176" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:29.600883" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:29.600650" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:29.601414" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:29.601122" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:29.600964" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:29.600632" elapsed="0.000864"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:29.601674" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:29.602493" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:29.602189" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:29.602722" elapsed="0.002733"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:29.586594" elapsed="0.018945"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:29.605791" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-10T00:49:29.605657" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:29.605633" elapsed="0.000336"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:29.606168" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:29.606241" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:49:29.608612" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782169,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:29.569220" elapsed="0.039421"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:29.608695" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:29.608847" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782169,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:29.566031" elapsed="0.042842"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:29.609875" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782169, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:29.609452" elapsed="0.000451"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:29.609951" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:29.610109" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782169, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:29.609103" elapsed="0.001032"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:29.610495" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:29.610314" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:29.611016" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:29.610714" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:29.611528" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:29.611233" elapsed="0.000337"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:29.612103" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:29.611746" elapsed="0.000439">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:29.554521" elapsed="0.057777">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:30.623443" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:30.622930" elapsed="0.000560"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:30.623590" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T00:49:30.623827" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:30.622383" elapsed="0.001479"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:30.631501" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:30.631202" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:30.632043" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:30.631735" 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-04-10T00:49:30.638441" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:30.638505" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:30 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782170,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:30.638632" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:30.634306" elapsed="0.004354"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:30.632172" elapsed="0.006534"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:30.638983" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:30.638814" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:30.632149" elapsed="0.006924"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:30.644082" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782170,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:30.640409" elapsed="0.003763"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:30.640146" elapsed="0.004082"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:30.640118" elapsed="0.004147"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:30.648485" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:30.644774" elapsed="0.003807"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:30.644385" elapsed="0.004252"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:30.644342" elapsed="0.004331"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:30.649635" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:30.648950" elapsed="0.000729"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:30.650148" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:30.649787" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:30.651078" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:30.650611" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:30.650308" elapsed="0.000869"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:30.649760" elapsed="0.001450"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:30.652143" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:30.651474" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:30.652670" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:30.652291" elapsed="0.000467"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:30.653353" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:30.653033" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:30.652795" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:30.652264" elapsed="0.001172"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:30.653616" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:30.654451" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:30.654141" elapsed="0.000345"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:30.654673" elapsed="0.002507"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:30.639595" elapsed="0.017658"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:30.657446" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:49:30.657329" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:30.657310" 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-04-10T00:49:30.657716" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:30.657788" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:49:30.660323" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782170,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:30.624416" elapsed="0.035954"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:30.660446" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:49:30.660672" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782170,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:30.621617" elapsed="0.039084"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:30.661896" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782170, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:30.661433" elapsed="0.000492"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:30.661976" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:49:30.662141" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782170, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:30.660965" elapsed="0.001204"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:30.662565" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:30.662354" elapsed="0.000239"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:30.663095" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:30.662777" elapsed="0.000347"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:30.663642" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:30.663299" elapsed="0.000371"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:30.664270" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:30.663848" elapsed="0.000505">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:30.613336" elapsed="0.051136">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:31.678527" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:31.678102" elapsed="0.000478"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:31.678649" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:49:31.678839" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:31.677721" elapsed="0.001143"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:31.685734" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:31.685443" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:31.686225" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:31.685947" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:31.692782" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:31.692843" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:31 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:31 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782171,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:31.692942" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:31.688522" elapsed="0.004446"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:31.686354" elapsed="0.006658"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:31.693206" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:31.693042" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:31.686330" elapsed="0.006963"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:31.697026" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782171,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:31.694365" elapsed="0.002711"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:31.694136" elapsed="0.002975"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:31.694117" elapsed="0.003029"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:31.701143" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:31.697568" elapsed="0.003642"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:31.697231" elapsed="0.004029"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:31.697207" elapsed="0.004088"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:31.702145" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:31.701579" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:31.702745" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:31.702379" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:31.703523" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:31.703094" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:31.702863" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:31.702352" elapsed="0.001312"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:31.704406" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:31.703892" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:31.704934" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:31.704599" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:31.705560" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:31.705242" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:31.705049" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:31.704572" elapsed="0.001073"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:31.705806" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:31.706656" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:31.706331" elapsed="0.000351"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:31.706840" elapsed="0.002494"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:31.693698" elapsed="0.015705"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:31.709604" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:49:31.709473" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:31.709455" 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-04-10T00:49:31.709851" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:31.709923" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:49:31.712231" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782171,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:31.679240" elapsed="0.033019"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:31.712313" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:31.712485" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782171,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:31.677183" elapsed="0.035328"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:31.713517" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782171, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:31.713109" elapsed="0.000452"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:31.713611" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:31.713767" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782171, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:31.712759" elapsed="0.001035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:31.714159" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:31.713974" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:31.714688" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:31.714363" elapsed="0.000350"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:31.715152" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:31.714885" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:31.715777" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:31.715350" elapsed="0.000506">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:31.665497" elapsed="0.050475">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:32.725773" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:32.725179" elapsed="0.000645"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:32.725914" elapsed="0.000068"/>
</return>
<msg time="2026-04-10T00:49:32.726171" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:32.724608" elapsed="0.001602"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:32.734197" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:32.733916" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:32.734681" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:32.734411" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:32.741520" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:32.741605" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:32 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:32 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782172,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:32.741708" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:32.736920" elapsed="0.004816"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:32.734810" elapsed="0.006998"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:32.742017" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:32.741847" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:32.734785" elapsed="0.007321"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:32.745780" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782172,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:32.743207" elapsed="0.002626"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:32.742967" elapsed="0.002901"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:32.742949" elapsed="0.002943"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:32.748582" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:32.746178" elapsed="0.002453"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:32.745949" elapsed="0.002716"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:32.745932" elapsed="0.002757"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:32.749338" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:32.748881" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:32.749694" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:32.749437" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:32.750284" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:32.749939" elapsed="0.000384"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:32.749775" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:32.749418" elapsed="0.000988"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:32.751212" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:32.750674" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:32.751728" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:32.751354" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:32.752523" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:32.752085" elapsed="0.000575"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:32.751849" elapsed="0.000869"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:32.751328" elapsed="0.001423"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:32.752988" elapsed="0.000551"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:32.754248" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:32.753811" elapsed="0.000475"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:32.754519" elapsed="0.003639"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:32.742502" elapsed="0.015727"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:32.758417" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:49:32.758304" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:32.758285" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:32.758688" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:32.758761" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:49:32.761087" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782172,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:32.726775" elapsed="0.034343"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:32.761173" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:32.761333" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782172,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:32.723885" elapsed="0.037474"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:32.762440" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782172, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:32.762005" elapsed="0.000464"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:32.762518" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:49:32.762693" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782172, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:32.761623" elapsed="0.001096"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:32.763084" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:32.762899" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:32.763616" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:32.763288" elapsed="0.000356"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:32.764086" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:32.763816" elapsed="0.000296"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:32.764670" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:32.764291" elapsed="0.000459">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:32.716856" elapsed="0.048011">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:33.782261" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:33.780792" elapsed="0.001523"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:33.782383" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:49:33.782583" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:33.779909" elapsed="0.002700"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:33.789324" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:33.789058" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:33.789958" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:33.789703" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:33.797084" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:33.797149" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:33 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:33 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782173,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:33.797245" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:33.792189" elapsed="0.005082"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:33.790089" elapsed="0.007224"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:33.797499" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:33.797343" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:33.790066" elapsed="0.007577"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:33.802598" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782173,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:33.798888" elapsed="0.003784"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:33.798531" elapsed="0.004192"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:33.798504" elapsed="0.004255"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:33.806776" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:33.803171" elapsed="0.003652"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:33.802841" elapsed="0.004017"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:33.802816" elapsed="0.004066"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:33.807502" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:33.807075" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:33.807859" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:33.807616" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:33.808407" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:33.808101" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:33.807939" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:33.807597" elapsed="0.000892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:33.809029" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:33.808665" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:33.809356" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:33.809124" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:33.809919" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:33.809623" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:33.809436" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:33.809107" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:33.810161" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:33.811015" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:33.810703" elapsed="0.000338"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:33.811197" elapsed="0.002376"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:33.798018" elapsed="0.015636"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:33.813829" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:49:33.813723" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:33.813705" elapsed="0.000404"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:33.814270" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:33.814341" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:49:33.816672" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782173,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:33.782994" elapsed="0.033707"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:33.816753" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:49:33.816916" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782173,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:33.778377" elapsed="0.038565"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:33.817954" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782173, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:33.817518" elapsed="0.000464"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:33.818030" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:33.818183" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782173, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:33.817163" elapsed="0.001046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:33.818590" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:33.818391" elapsed="0.000226"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:33.819094" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:33.818796" elapsed="0.000324"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:33.819564" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:33.819291" elapsed="0.000299"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:49:33.820127" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:49:33.819767" elapsed="0.000447">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:49:33.766295" elapsed="0.054042">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.832954" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:34.832514" elapsed="0.000478"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:34.833061" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:49:34.833242" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:34.832131" elapsed="0.001138"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.840308" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:34.840022" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.840790" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:34.840524" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:34.847741" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:34.847805" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782174,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:34.847902" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:34.843018" elapsed="0.004909"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:34.840915" elapsed="0.007056"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:34.848889" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:34.848721" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:34.840892" elapsed="0.008086"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.852635" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782174,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:34.850070" elapsed="0.002615"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:34.849843" elapsed="0.002877"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:34.849825" elapsed="0.002919"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.855492" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:34.853023" elapsed="0.002516"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:34.852800" elapsed="0.002789"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:34.852783" elapsed="0.002830"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.856211" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:34.855804" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:34.856560" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:34.856308" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.857113" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:34.856811" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:34.856645" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:34.856290" elapsed="0.000905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.857745" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:34.857355" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:34.858073" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:34.857840" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.858643" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:34.858330" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:34.858169" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:34.857822" elapsed="0.000903"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:34.858884" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:34.859722" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:34.859399" elapsed="0.000348"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:34.859906" elapsed="0.002375"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:34.849379" elapsed="0.012967"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:34.862527" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-10T00:49:34.862416" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:34.862397" elapsed="0.000249"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:34.862795" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:34.862866" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:49:34.865156" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782174,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:34.833653" elapsed="0.031531"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:34.865237" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:34.865388" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782174,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:34.831569" elapsed="0.033844"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.866471" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782174, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:34.866031" elapsed="0.000468"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:34.866563" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:34.866721" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782174, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:34.865651" elapsed="0.001097"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:34.867110" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:34.866928" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.867630" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:34.867312" elapsed="0.000343"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.868090" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:49:34.867829" elapsed="0.000286"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:49:34.868286" elapsed="0.000324"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:49:34.821427" elapsed="0.047243"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:49:19.039329" elapsed="15.829394"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:19.038927" elapsed="15.829860"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:19.034294" elapsed="15.834528"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:19.034163" elapsed="15.834700"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.879895" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:34.879593" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:34.879967" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:34.880115" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:34.879230" elapsed="0.000909"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.886695" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:34.886431" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.887134" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:34.886895" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:34.892755" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:34.892811" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782174,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:34.892903" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:34.889271" elapsed="0.003658"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:34.887242" elapsed="0.005729"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:34.893149" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:34.892997" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:34.887224" elapsed="0.006010"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.898593" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782174,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:34.894277" elapsed="0.004366"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:34.894025" elapsed="0.004654"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:34.894007" elapsed="0.004696"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.902488" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:34.899028" elapsed="0.003549"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:34.898759" elapsed="0.003871"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:34.898743" elapsed="0.003923"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.903650" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:34.903067" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:34.904148" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:34.903795" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.904980" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:34.904509" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:34.904269" elapsed="0.000804"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:34.903769" elapsed="0.001336"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.905900" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:34.905343" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:34.906434" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:34.906041" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.907253" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:34.906818" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:34.906576" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:34.906015" elapsed="0.001322"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:34.907489" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:34.908291" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:34.908022" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:34.908471" elapsed="0.002494"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:34.893605" elapsed="0.017424"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:49:34.911203" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:34.911098" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:34.911080" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:34.911435" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:49:34.911506" elapsed="0.000014"/>
</return>
<msg time="2026-04-10T00:49:34.913802" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782174,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:34.880472" elapsed="0.033358"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:34.913881" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:34.914029" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782174,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:49:34.878774" elapsed="0.035280"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:49:34.914099" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:49:34.914284" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782174,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:49:34.874341" elapsed="0.039969"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.915270" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782174, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:34.914884" elapsed="0.000414"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:34.915346" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:34.915498" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782174, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:34.914527" elapsed="0.001044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:34.915931" level="INFO">${value} = 0</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:34.915751" elapsed="0.000205"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:49:34.916422" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:49:34.916134" elapsed="0.000342"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 0.</doc>
<status status="PASS" start="2026-04-10T00:49:34.873854" elapsed="0.042680"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:34.869070" elapsed="0.047513"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:34.868925" elapsed="0.047690"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_del}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:49:18.971285" elapsed="15.945386"/>
</kw>
<doc>Verify flow count is 0 across cluster nodes.</doc>
<status status="PASS" start="2026-04-10T00:49:18.615438" elapsed="16.301382"/>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-10T00:49:34.917939" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-10T00:49:34.917856" elapsed="0.000421"/>
</kw>
<doc>Test suite for Cluster with Bulk Flows - Reconcilliation in a multi DPN environment</doc>
<status status="PASS" start="2026-04-10T00:48:15.930788" elapsed="78.987527"/>
</suite>
<suite id="s1-s2" name="Cluster HA Data Recovery BulkFlow 2Node Cluster" source="/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/suites/openflowplugin/Clustering_Bulkomatic/020__Cluster_HA_Data_Recovery_BulkFlow_2Node_Cluster.robot">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils" type="SETUP">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.013582" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:35.008573" elapsed="0.005127"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-10T00:49:35.008236" elapsed="0.005573"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.019437" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-10T00:49:35.015366" elapsed="0.004124"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-10T00:49:35.019832" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:35.019669" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:35.019625" elapsed="0.000283"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.020676" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:35.020170" elapsed="0.000553"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.021245" level="INFO">${cluster_size} = 3</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-10T00:49:35.020901" elapsed="0.000371"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:49:35.021835" elapsed="0.000319"/>
</kw>
<msg time="2026-04-10T00:49:35.022288" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:35.022341" level="INFO">${possibly_int_of_members} = 3</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:35.021449" elapsed="0.000916"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.022947" level="INFO">${int_of_members} = 3</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:35.022559" elapsed="0.000416"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.024262" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:35.023855" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.024753" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:35.024450" elapsed="0.000339"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.025278" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.024954" elapsed="0.000355"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.028669" elapsed="0.000244"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.029445" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:35.029089" elapsed="0.000383"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.029659" elapsed="0.000238"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.030766" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:35.030443" elapsed="0.000442"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:35.030937" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:49:35.031114" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:35.030102" elapsed="0.001038"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:35.031788" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.165:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x72c8f10bc110&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-10T00:49:35.031317" elapsed="0.000627"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.032114" elapsed="0.000211"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-10T00:49:35.028001" elapsed="0.004386"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:35.027784" elapsed="0.004649"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.033695" elapsed="0.000198"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.034437" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:35.034057" elapsed="0.000408"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.034644" elapsed="0.000230"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.035703" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:35.035377" elapsed="0.000354"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:35.035778" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:35.035936" level="INFO">${session_alias} = ClusterManagement__session_2</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:35.035069" elapsed="0.000893"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:35.036569" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.169:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x72c8f23c83d0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-10T00:49:35.036121" elapsed="0.000562"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.036851" elapsed="0.000198"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-10T00:49:35.033087" elapsed="0.004024"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:35.032523" elapsed="0.004633"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.038028" elapsed="0.000194"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.038771" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:35.038419" elapsed="0.000380"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.038958" elapsed="0.000226"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.040034" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:35.039733" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:35.040108" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:35.040262" level="INFO">${session_alias} = ClusterManagement__session_3</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:35.039393" elapsed="0.000895"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:35.040877" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.171.151:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x72c8f10ea810&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-10T00:49:35.040454" elapsed="0.000533"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.041153" elapsed="0.000196"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-10T00:49:35.037443" elapsed="0.004009"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:35.037247" elapsed="0.004250"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-10T00:49:35.025371" elapsed="0.016156"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.042106" level="INFO">${ClusterManagement__member_index_list} = [1, 2, 3]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:35.041713" elapsed="0.000437"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.042820" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.165', 2: '10.30.170.169', 3: '10.30.171.151'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:35.042398" elapsed="0.000468"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.043407" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1', 'ClusterManagement__session_2', 'ClusterManagement__session_3']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:35.043034" elapsed="0.000415"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-10T00:49:35.023304" elapsed="0.020203"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-10T00:49:35.014973" elapsed="0.028609"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:35.043771" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:35.043654" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:35.043635" elapsed="0.000202"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.047112" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:35.046734" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.047624" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:35.047300" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:35.047697" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:35.047853" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:35.046385" elapsed="0.001493"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:35.048868" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.048605" elapsed="0.000289"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:35.049673" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:35.049473" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:35.052491" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:35.052170" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:35.052151" elapsed="0.000552"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:35.052986" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:35.052857" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.054224" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:35.053294" elapsed="0.001018"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:35.055174" level="INFO">${conn_id} = 79</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.054513" elapsed="0.000688"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.056507" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:35.056733" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:35.055967" elapsed="0.000816"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:35.057068" elapsed="0.000626"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:35.059335" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:35.638710" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:49:35 UTC 2026

  System load:  0.54               Processes:             121
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:48:16 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:35.058800" elapsed="0.580597"/>
</kw>
<msg time="2026-04-10T00:49:35.639522" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:35.058022" elapsed="0.581738"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:35.055423" elapsed="0.584624"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:35.640693" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-10T00:49:35.653687" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-10T00:49:35.653923" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:35.653988" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:35.640319" elapsed="0.013705"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:35.654265" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.655740" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:35.654952" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:35.656170" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:35.655932" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:35.655897" elapsed="0.000376"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:35.656527" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-04-10T00:49:35.656348" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:35.656325" elapsed="0.000345"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:35.656718" elapsed="0.000021"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:35.661008" elapsed="0.001705"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.663047" elapsed="0.000692"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:35.664015" elapsed="0.000284"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:35.657184" elapsed="0.007235"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:35.051690" elapsed="0.612886"/>
</kw>
<msg time="2026-04-10T00:49:35.664657" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:35.050988" elapsed="0.613744"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:49:35.050491" elapsed="0.614354"/>
</kw>
<msg time="2026-04-10T00:49:35.666081" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:35.049961" elapsed="0.616195"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:35.670083" elapsed="0.000451"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.670831" elapsed="0.000204"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:35.671244" elapsed="0.000130"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:35.666629" elapsed="0.004797"/>
</kw>
<msg time="2026-04-10T00:49:35.671524" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:49:35.049113" elapsed="0.622574"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.672157" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:35.671903" elapsed="0.000297"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:49:35.672243" elapsed="0.000031"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:49:35.048235" elapsed="0.624137"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:35.048057" elapsed="0.624355"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:35.673359" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.673088" elapsed="0.000300"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:35.674123" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:35.673984" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:35.677251" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:35.676936" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:35.676916" elapsed="0.000547"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:35.677763" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:35.677634" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.679127" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:35.678071" elapsed="0.001103"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:35.680049" level="INFO">${conn_id} = 82</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:35.679337" elapsed="0.000739"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:35.681468" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:35.681719" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:35.680867" elapsed="0.000905"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:35.682077" elapsed="0.000691"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:35.684340" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:36.273126" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:49:35 UTC 2026

  System load:  0.97               Processes:             121
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.169
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:48:17 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:35.683939" elapsed="0.590393"/>
</kw>
<msg time="2026-04-10T00:49:36.274447" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:35.683117" elapsed="0.591540"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:35.680296" elapsed="0.594654"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:36.275571" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-10T00:49:36.287894" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-10T00:49:36.288236" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:36.288340" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:36.275219" elapsed="0.013176"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:36.288833" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:36.290886" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:36.289779" elapsed="0.001292"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:36.291516" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:36.291253" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:36.291202" elapsed="0.000451"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:36.291929" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:49:36.291734" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:36.291709" elapsed="0.000344"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:36.292105" elapsed="0.000021"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:36.296950" elapsed="0.001116"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:36.298406" elapsed="0.000669"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:36.299369" elapsed="0.000310"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:36.292711" elapsed="0.007093"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:35.676423" elapsed="0.623525"/>
</kw>
<msg time="2026-04-10T00:49:36.300031" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:35.675744" elapsed="0.624365"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:49:35.674988" elapsed="0.625243"/>
</kw>
<msg time="2026-04-10T00:49:36.300294" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:35.674410" elapsed="0.625952"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:36.304164" elapsed="0.000313"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:36.304674" elapsed="0.000149"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:36.304974" elapsed="0.000096"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:36.300856" elapsed="0.004265"/>
</kw>
<msg time="2026-04-10T00:49:36.305215" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:49:35.673621" elapsed="0.631620"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:36.305736" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:36.305419" elapsed="0.000358"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:49:36.305819" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:49:35.672722" elapsed="0.633223"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:35.672517" elapsed="0.633509"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:36.307009" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:36.306708" elapsed="0.000327"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:36.307766" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:36.307627" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:36.310562" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:36.310237" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:36.310219" elapsed="0.000535"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:36.311082" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:36.310906" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:36.312292" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:36.311383" elapsed="0.000956"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:36.313143" level="INFO">${conn_id} = 85</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:36.312499" elapsed="0.000671"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:36.314481" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:36.314699" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:36.313930" elapsed="0.000817"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:36.315050" elapsed="0.000778"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:36.317302" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:36.945592" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:49:36 UTC 2026

  System load:  0.88               Processes:             121
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:48:17 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:36.316914" elapsed="0.629408"/>
</kw>
<msg time="2026-04-10T00:49:36.946440" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:36.316152" elapsed="0.630526"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:36.313390" elapsed="0.633577"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:36.947697" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-10T00:49:36.960244" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-10T00:49:36.960687" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:36.960802" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:36.947254" elapsed="0.013603"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:36.961231" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:36.963415" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:36.962161" elapsed="0.001496"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:36.964192" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:36.963842" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:36.963792" elapsed="0.000572"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:36.964724" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T00:49:36.964473" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:36.964446" elapsed="0.000409"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:36.964907" elapsed="0.000023"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:36.969432" elapsed="0.001366"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:36.971165" elapsed="0.000757"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:36.972388" 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-04-10T00:49:36.965403" elapsed="0.007352"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:36.309759" elapsed="0.663097"/>
</kw>
<msg time="2026-04-10T00:49:36.972916" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:36.309065" elapsed="0.663914"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:49:36.308576" elapsed="0.664483"/>
</kw>
<msg time="2026-04-10T00:49:36.973103" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:36.308047" elapsed="0.665101"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:36.975919" elapsed="0.000311"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:36.976394" elapsed="0.000141"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:36.976723" elapsed="0.000096"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:36.973463" elapsed="0.003408"/>
</kw>
<msg time="2026-04-10T00:49:36.976967" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:49:36.307252" elapsed="0.669742"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:36.977458" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:36.977204" elapsed="0.000294"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:49:36.977610" elapsed="0.000035"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:49:36.306324" elapsed="0.671427"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:36.306133" elapsed="0.671658"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:35.047931" elapsed="1.929901"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:49:35.044060" elapsed="1.933837"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-10T00:49:36.978059" elapsed="0.000217"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:36.992599" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:36.992466" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:36.992445" elapsed="0.000226"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:36.992973" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:36.992830" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:36.993521" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:36.993258" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:36.994045" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:36.993797" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:36.994866" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-10T00:49:36.994634" elapsed="0.000366">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-10T00:49:36.995109" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:49:36.995153" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:36.994250" elapsed="0.000926"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:36.995515" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:36.995252" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:36.995234" elapsed="0.000401"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:36.996377" level="INFO">${ip_address} = 10.30.170.165</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:36.996114" elapsed="0.000289"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:49:36.996450" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:36.996619" level="INFO">${odl_ip} = 10.30.170.165</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:36.995841" elapsed="0.000803"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:36.996800" elapsed="0.000405"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:36.997529" level="INFO">index=88
host=10.30.170.165
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:49:37.000450" elapsed="0.192260"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:37.196738" elapsed="0.000322"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:37.197230" elapsed="0.000178"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:37.197580" elapsed="0.000106"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:37.193990" elapsed="0.003754"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:37.193185" elapsed="0.004607"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:49:36.992169" elapsed="0.205677"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:49:36.979033" elapsed="0.218865"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:36.978656" elapsed="0.219299"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:36.978495" elapsed="0.219573"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:37.211203" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:37.211082" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:37.211058" elapsed="0.000223"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:37.211625" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:37.211468" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:37.212182" level="INFO">{1: 88}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:37.211918" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:37.212634" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:37.212378" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:37.213440" level="FAIL">Dictionary does not contain key '2'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-10T00:49:37.213200" elapsed="0.000378">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-04-10T00:49:37.213689" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:49:37.213735" level="INFO">${old_connection_index} = Dictionary does not contain key '2'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:37.212837" elapsed="0.000921"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:37.214059" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:37.213834" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:37.213816" elapsed="0.000341"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:37.214915" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:37.214649" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:49:37.214989" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:49:37.215146" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:37.214360" 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-04-10T00:49:37.215324" elapsed="0.000442"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:37.216049" level="INFO">index=90
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:49:37.218852" elapsed="0.293711"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:37.517364" elapsed="0.000353"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:37.517977" elapsed="0.000197"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:37.518332" elapsed="0.000109"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:37.514791" elapsed="0.003707"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:37.513973" elapsed="0.004590"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:49:37.210782" elapsed="0.307839"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:49:37.198740" elapsed="0.319931"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:37.198331" elapsed="0.320396"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:37.198184" elapsed="0.320586"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:37.532099" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:37.531973" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:37.531948" elapsed="0.000231"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:37.532486" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:37.532340" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:37.533079" level="INFO">{1: 88, 2: 90}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:37.532808" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:37.533526" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:37.533281" elapsed="0.000309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:37.534364" level="FAIL">Dictionary does not contain key '3'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-10T00:49:37.534122" elapsed="0.000366">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-04-10T00:49:37.534619" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:49:37.534667" level="INFO">${old_connection_index} = Dictionary does not contain key '3'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:37.533751" elapsed="0.000939"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:37.534994" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:37.534767" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:37.534749" elapsed="0.000343"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:37.538299" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:37.538015" elapsed="0.000313"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:49:37.538381" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:49:37.538564" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:37.535294" elapsed="0.003298"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:37.538754" elapsed="0.000413"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:37.539462" level="INFO">index=92
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:49:37.542374" elapsed="0.225871"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:37.772430" elapsed="0.000352"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:37.772956" elapsed="0.000220"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:37.773332" elapsed="0.000109"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:37.769795" elapsed="0.003704"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:37.768857" elapsed="0.004710"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:49:37.531666" elapsed="0.241959"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:49:37.519428" elapsed="0.254247"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:37.519037" elapsed="0.254695"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:37.518888" elapsed="0.254887"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-10T00:49:36.978337" elapsed="0.795485"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-10T00:49:35.014354" elapsed="2.759541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:37.776956" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:37.776826" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:37.776795" elapsed="0.000242"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:37.782037" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:37.781927" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:37.781908" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:37.783172" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:37.782763" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:37.783689" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:37.783364" elapsed="0.006842"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:37.794010" elapsed="0.001004"/>
</return>
<msg time="2026-04-10T00:49:37.795845" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:37.782387" elapsed="0.013500"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:37.805861" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:37.805670" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:37.805634" elapsed="0.000347"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:37.807535" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:37.807372" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:37.807348" elapsed="0.000312"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:37.808407" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:37.807957" elapsed="0.000480"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:37.808943" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:37.808733" elapsed="0.000236"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:37.849496" 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 "p "e "[78Cn "[A[78Cf</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:37.809477" elapsed="0.040279"/>
</kw>
<msg time="2026-04-10T00:49:37.849922" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:37.849969" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:37.809131" elapsed="0.040877"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:37.934667" level="INFO">"l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "2 "0 "_ "_ "C "l "u "s "t "e "r "_ "H "A "_ "D "a "t "a "_ "R "e "c "o "v "e "r "y "_ "B "u "l "k "F "l "o "w "_ "2 "N "o "d "e "_ "C "l "[78Cu "[A[78Cs
 "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:37.850760" elapsed="0.086392"/>
</kw>
<msg time="2026-04-10T00:49:37.939320" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:37.939410" level="INFO">${message_wait} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:37.850265" elapsed="0.089205"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:37.941120" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:37.940194" elapsed="0.001000"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:37.940140" elapsed="0.001082"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:37.942324" level="INFO"> "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "2 "0 "_ "_ "C "l "u "s "t "e "r "_ "H "A "_ "D "a "t "a "_ "R "e "c "o "v "e "r "y "_ "B "u "l "k "F "l "o "w "_ "2 "N "o "d "e "_ "C "l "[78Cu "[A[78Cs
 "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:37.941377" elapsed="0.001100"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:37.942806" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:37.942567" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:37.942533" elapsed="0.000356"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:37.942930" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:37.945357" elapsed="0.001409"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:37.947084" elapsed="0.000518"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:37.947926" elapsed="0.000210"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:37.944393" elapsed="0.003883"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:37.943279" elapsed="0.005049"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:37.807016" elapsed="0.141417"/>
</kw>
<msg time="2026-04-10T00:49:37.948540" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:37.948607" level="INFO">${message} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:37.806234" elapsed="0.142413"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:37.948856" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:49:37.948737" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:37.948716" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:37.949403" elapsed="0.000032"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:37.950324" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:37.950402" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:37.805146" elapsed="0.145370"/>
</kw>
<msg time="2026-04-10T00:49:37.950634" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:37.950680" level="INFO">${output} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:37.797399" elapsed="0.153318"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:37.951054" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:37.950796" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:37.950778" elapsed="0.000355"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:37.797151" elapsed="0.154005"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:37.956713" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:37.956599" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:37.956579" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:37.957852" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:37.957745" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:37.957727" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:37.958347" level="INFO">${karaf_connection_index} = 90</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:37.958071" elapsed="0.000303"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:37.958786" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:37.958537" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:38.002178" 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 "p "e "[78Cn "[A[78Cf</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:37.959326" elapsed="0.044913"/>
</kw>
<msg time="2026-04-10T00:49:38.007740" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:38.007998" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:37.958979" elapsed="0.049103"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:38.086775" level="INFO">"l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "2 "0 "_ "_ "C "l "u "s "t "e "r "_ "H "A "_ "D "a "t "a "_ "R "e "c "o "v "e "r "y "_ "B "u "l "k "F "l "o "w "_ "2 "N "o "d "e "_ "C "l "[78Cu "[A[78Cs
 "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:38.010895" elapsed="0.076315"/>
</kw>
<msg time="2026-04-10T00:49:38.087446" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:38.087519" level="INFO">${message_wait} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.009023" elapsed="0.078596"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.089276" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.088801" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.088747" elapsed="0.000665"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.090224" level="INFO"> "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "2 "0 "_ "_ "C "l "u "s "t "e "r "_ "H "A "_ "D "a "t "a "_ "R "e "c "o "v "e "r "y "_ "B "u "l "k "F "l "o "w "_ "2 "N "o "d "e "_ "C "l "[78Cu "[A[78Cs
 "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:38.089671" elapsed="0.000725"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.090875" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.090509" elapsed="0.003280"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.090481" elapsed="0.003546"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:38.094139" elapsed="0.000093"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:38.097102" elapsed="0.000633"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:38.098051" elapsed="0.000518"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:38.098842" 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-04-10T00:49:38.096113" elapsed="0.003072"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:38.095166" elapsed="0.004069"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:37.957471" elapsed="0.141890"/>
</kw>
<msg time="2026-04-10T00:49:38.099491" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:38.099558" level="INFO">${message} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:37.956949" elapsed="0.142653"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:38.099820" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:49:38.099698" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.099675" elapsed="0.000338"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.100457" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.101153" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.101233" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:37.956262" elapsed="0.145090"/>
</kw>
<msg time="2026-04-10T00:49:38.101451" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:38.101497" level="INFO">${output} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:37.951440" elapsed="0.150095"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.101904" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.101639" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.101620" elapsed="0.000363"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:37.951291" elapsed="0.150716"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.109341" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:38.109231" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.109211" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.110490" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:38.110383" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.110365" elapsed="0.000211"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:38.110992" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:38.110725" elapsed="0.000294"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:38.111370" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:38.111178" elapsed="0.000218"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:38.153816" 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 "p "e "[78Cn "[A[78Cf</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:38.112002" elapsed="0.041970"/>
</kw>
<msg time="2026-04-10T00:49:38.154088" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:38.154134" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.111582" elapsed="0.042589"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:38.228362" level="INFO">"l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "2 "0 "_ "_ "C "l "u "s "t "e "r "_ "H "A "_ "D "a "t "a "_ "R "e "c "o "v "e "r "y "_ "B "u "l "k "F "l "o "w "_ "2 "N "o "d "e "_ "C "l "[78Cu "[A[78Cs
 "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:38.154862" elapsed="0.073860"/>
</kw>
<msg time="2026-04-10T00:49:38.228899" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:38.228948" level="INFO">${message_wait} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.154450" elapsed="0.074537"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.229462" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.229115" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.229075" elapsed="0.000495"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.230104" level="INFO"> "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "2 "0 "_ "_ "C "l "u "s "t "e "r "_ "H "A "_ "D "a "t "a "_ "R "e "c "o "v "e "r "y "_ "B "u "l "k "F "l "o "w "_ "2 "N "o "d "e "_ "C "l "[78Cu "[A[78Cs
 "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:38.229722" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.230503" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.230281" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.230263" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:38.230642" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:38.232069" elapsed="0.000597"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:38.232972" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:38.233728" elapsed="0.000199"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:38.231593" elapsed="0.002468"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:38.230986" elapsed="0.003125"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:38.110127" elapsed="0.124084"/>
</kw>
<msg time="2026-04-10T00:49:38.234309" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:38.234354" level="INFO">${message} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.109600" elapsed="0.124792"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:38.234597" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:38.234471" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.234452" elapsed="0.000230"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.235136" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.235489" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.235578" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:38.108907" elapsed="0.126784"/>
</kw>
<msg time="2026-04-10T00:49:38.235791" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:38.235836" level="INFO">${output} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.102293" elapsed="0.133581"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.236314" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.236055" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.236036" elapsed="0.000357"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:38.102146" elapsed="0.134271"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:37.796445" elapsed="0.440009"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:49:37.781600" elapsed="0.454916"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-10T00:49:37.774526" elapsed="0.462073"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:37.774063" elapsed="0.462582"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-10T00:49:35.007724" elapsed="3.228976"/>
</kw>
<test id="s1-s2-t1" name="Check Shards Status and Initialize Variables" line="30">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:49:38.240731" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:49:38.240416" elapsed="0.000585"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.242029" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:38.241919" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.241901" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.247031" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:38.246922" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.246904" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.248163" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:38.247729" elapsed="0.000461"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.248674" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:38.248352" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:38.248743" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:38.248901" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:38.247333" elapsed="0.001593"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.254219" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:38.254111" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.254092" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.255430" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:38.255324" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.255306" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:38.255985" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:38.255664" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:38.256394" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:38.256173" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:38.291227" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:38.256939" elapsed="0.034527"/>
</kw>
<msg time="2026-04-10T00:49:38.291739" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:38.291788" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.256598" elapsed="0.035227"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:38.372116" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "a "n "d "[C "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:38.292627" elapsed="0.082513"/>
</kw>
<msg time="2026-04-10T00:49:38.375393" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:38.375450" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.292121" elapsed="0.083369"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.376909" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.376107" elapsed="0.000870"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.375610" elapsed="0.001395"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.378039" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "a "n "d "[C "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:38.377154" elapsed="0.001008"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.378461" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.378236" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.378217" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:38.378598" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:38.380291" elapsed="0.000845"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:38.381451" elapsed="0.000512"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:38.382233" elapsed="0.000383"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:38.379573" elapsed="0.003144"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:38.378940" elapsed="0.003841"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:38.255021" elapsed="0.127861"/>
</kw>
<msg time="2026-04-10T00:49:38.382979" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:38.383025" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.254439" elapsed="0.128624"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:38.383249" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:38.383141" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.383122" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.383764" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.384144" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.384219" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:38.253773" elapsed="0.130562"/>
</kw>
<msg time="2026-04-10T00:49:38.384455" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:38.384501" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.249310" elapsed="0.135229"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.385039" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.384634" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.384616" elapsed="0.000505"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:38.249165" elapsed="0.135980"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.390758" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:38.390572" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.390531" 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-04-10T00:49:38.392098" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:38.391964" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.391947" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:38.392641" level="INFO">${karaf_connection_index} = 90</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:38.392314" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:38.393043" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:38.392828" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:38.430125" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:38.393600" elapsed="0.036649"/>
</kw>
<msg time="2026-04-10T00:49:38.430433" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:38.430481" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.393231" elapsed="0.037287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:38.515249" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "a "n "d "[C "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:38.431092" elapsed="0.084422"/>
</kw>
<msg time="2026-04-10T00:49:38.515769" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:38.515817" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.430728" elapsed="0.085128"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.516370" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.516004" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.515971" elapsed="0.000487"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.517026" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "a "n "d "[C "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:38.516629" elapsed="0.000492"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.517407" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.517188" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.517170" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:38.517523" elapsed="0.000057"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:38.519377" elapsed="0.000857"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:38.520518" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:38.521276" elapsed="0.000400"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:38.518736" elapsed="0.003044"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:38.517864" elapsed="0.003979"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:38.391660" elapsed="0.130283"/>
</kw>
<msg time="2026-04-10T00:49:38.522036" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:38.522080" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.391066" elapsed="0.131051"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:38.522302" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:38.522194" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.522176" elapsed="0.000280"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.522881" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.523218" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.523290" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:38.390200" elapsed="0.133198"/>
</kw>
<msg time="2026-04-10T00:49:38.523494" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:38.523538" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.385430" elapsed="0.138161"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.523922" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.523667" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.523650" elapsed="0.000349"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:38.385279" elapsed="0.138744"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.529477" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:38.529370" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.529351" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.530708" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:38.530600" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.530582" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:38.531219" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:38.530919" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:38.531631" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:38.531402" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:38.568015" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:38.532220" elapsed="0.035922"/>
</kw>
<msg time="2026-04-10T00:49:38.568315" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:38.568362" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.531816" elapsed="0.036582"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:38.648139" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "a "n "d "[C "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:38.568953" elapsed="0.079381"/>
</kw>
<msg time="2026-04-10T00:49:38.648520" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:38.648589" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.568603" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.649024" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.648734" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.648702" elapsed="0.000408"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.649611" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "a "n "d "[C "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:38.649258" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.650051" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.649831" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.649812" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:38.650165" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:38.651701" elapsed="0.000794"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:38.652794" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:38.653520" elapsed="0.000378"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:38.651044" elapsed="0.002956"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:38.650466" elapsed="0.003598"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:38.530283" elapsed="0.123879"/>
</kw>
<msg time="2026-04-10T00:49:38.654256" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:38.654300" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.529718" elapsed="0.124620"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:38.654522" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T00:49:38.654416" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.654398" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.655028" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.655633" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.655707" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:38.529026" elapsed="0.126793"/>
</kw>
<msg time="2026-04-10T00:49:38.655916" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:38.655960" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.524329" elapsed="0.131669"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.656362" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.656073" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.656056" elapsed="0.000384"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:38.524183" elapsed="0.132280"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:38.248982" elapsed="0.407514"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:49:38.246558" elapsed="0.410011"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:49:38.241624" elapsed="0.415007"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:38.241153" elapsed="0.415524"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:49:38.237985" elapsed="0.418748"/>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:38.677654" elapsed="0.000230"/>
</kw>
<msg time="2026-04-10T00:49:38.677936" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:38.677004" elapsed="0.000983"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default', 'entity-ownership'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:49:38.676527" elapsed="0.001535"/>
</kw>
<msg time="2026-04-10T00:49:38.678161" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:38.668008" elapsed="0.010198"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:49:38.667616" elapsed="0.010666"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.678736" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:38.678464" elapsed="0.000316"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.684018" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:38.683629" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.684527" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:38.684226" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:38.684615" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:38.684773" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:38.683240" elapsed="0.001558"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:49:38.684953" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.685620" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:38.685269" elapsed="0.000378"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.686040" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:38.685805" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.686444" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:38.686211" elapsed="0.000257"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.689154" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:38.688825" elapsed="0.000356"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:38.689225" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:38.689371" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:38.688464" elapsed="0.000931"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.779351" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:38.778900" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:38.780840" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:38.780034" elapsed="0.000886">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:38.781016" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:38.779581" elapsed="0.001460"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.781632" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:38.781224" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:38.781980" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:38.782145" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:38.781836" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.784559" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:38.784031" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.785808" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:38.785520" elapsed="0.000333"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.786303" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:38.786021" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.786695" 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-04-10T00:49:38.786911" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.787090" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:38.786535" elapsed="0.000612"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.786383" elapsed="0.000796"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:38.787229" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:49:38.787407" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:38.785139" elapsed="0.002293"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:38.784733" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.787656" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.787490" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.784703" elapsed="0.003030"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.788368" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:38.787879" elapsed="0.000517"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:38.788447" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:38.778050" elapsed="0.010543"/>
</kw>
<msg time="2026-04-10T00:49:38.788650" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:38.764960" elapsed="0.023804"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.801523" elapsed="0.000072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.814107" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.826689" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.827464" 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-04-10T00:49:38.828313" 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-04-10T00:49:38.829039" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.828882" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:38.828866" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.829286" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.829481" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.829692" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:38.828808" elapsed="0.000962"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.828541" elapsed="0.001270"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.830530" elapsed="0.000052"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.830668" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:49:38.830902" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:38.758024" elapsed="0.072985"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:38.834172" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:38.833880" elapsed="0.000367">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:38.834443" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:38.833373" elapsed="0.001119"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.835048" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.834646" elapsed="0.000470"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.835764" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:38.835436" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:38.835156" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.834593" elapsed="0.001282"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.839174" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:38.836816" elapsed="0.002405"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:38.839300" elapsed="0.000066"/>
</return>
<msg time="2026-04-10T00:49:38.839641" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:38.832054" elapsed="0.007694"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:38.842628" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:38.842361" elapsed="0.000331">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:38.842882" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:38.841913" elapsed="0.001014"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:38.843310" elapsed="0.000077"/>
</return>
<status status="PASS" start="2026-04-10T00:49:38.843060" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.843010" elapsed="0.000488"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.844294" elapsed="0.000039"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.845172" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.845281" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:49:38.847358" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:38.840791" elapsed="0.006674"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.851310" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:38.850920" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.852537" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:38.852125" elapsed="0.000678"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:38.892706" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:38.894397" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:49:38 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:38.895109" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:38.855292" elapsed="0.039900"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:38.852930" elapsed="0.042455"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.897117" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.896238" elapsed="0.001082"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.852880" elapsed="0.044528"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.907182" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:38.902241" elapsed="0.005437"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:38.901298" elapsed="0.006432"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.901244" elapsed="0.006520"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.910661" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:38.908180" elapsed="0.002533"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:38.907890" elapsed="0.002860"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.907865" elapsed="0.002910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.911462" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:38.911017" elapsed="0.000474"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.911855" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.911607" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.912430" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:38.912101" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:38.911937" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.911586" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.913079" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:38.912710" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.913429" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.913197" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.914103" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:38.913796" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:38.913508" elapsed="0.000658"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.913178" elapsed="0.001009"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:38.914376" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:38.915243" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:38.914937" elapsed="0.000332"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:38.915447" elapsed="0.002510"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:38.899326" elapsed="0.018770"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.918474" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:38.918243" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.918188" elapsed="0.000484"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:38.931021" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:38.919427" elapsed="0.011665"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:38.931202" elapsed="0.000093"/>
</return>
<msg time="2026-04-10T00:49:38.931622" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:38.848138" elapsed="0.083597"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:38.932370" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:49:38.932573" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:38.697852" elapsed="0.234749"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.933045" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.932704" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.932684" elapsed="0.000616"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:38.933335" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:38.693664" elapsed="0.239798"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:38.689465" elapsed="0.244041"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.689447" elapsed="0.244083"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:38.934212" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:38.934099" elapsed="0.000158"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:49:38.934379" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:38.934279" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.934081" elapsed="0.000377"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.934649" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:49:38.934771" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:38.933792" elapsed="0.001005"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.935420" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:38.934987" elapsed="0.000460"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.936088" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:38.935624" elapsed="0.000492"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.942006" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:38.941553" elapsed="0.000502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:38.942668" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:38.942213" elapsed="0.000500"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:38.963520" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:38.963753" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:38 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:38 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-2-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastApplied":137,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:45:27.749","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"455.8 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":7926168},"timestamp":1775782178,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:38.964040" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:38.954248" elapsed="0.009950"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:38.942782" elapsed="0.021841"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:38.964909" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:38.964671" elapsed="0.000701"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.942764" elapsed="0.022645"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.016620" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-2-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastApplied":137,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:45:27.749","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"455.8 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":7926168},"timestamp":1775782178,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:38.968677" elapsed="0.048093"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:38.967280" elapsed="0.049559"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:38.967253" elapsed="0.049636"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.020589" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.017985" elapsed="0.002709"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.017007" elapsed="0.003737"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.016975" elapsed="0.003809"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.022312" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.021481" elapsed="0.000893"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.023038" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.022561" elapsed="0.000573"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.024121" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.023605" elapsed="0.000563"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.023182" elapsed="0.001037"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.022525" elapsed="0.001729"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.025790" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.024954" elapsed="0.000897"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.026486" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.026018" elapsed="0.000571"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.027465" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.026964" elapsed="0.000549"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.026629" elapsed="0.000950"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.025998" elapsed="0.001617"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:39.027842" elapsed="0.000663"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:39.029363" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.028834" elapsed="0.000591"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.029850" elapsed="0.002464"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:38.966249" elapsed="0.066255"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.032728" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:39.032596" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.032577" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:39.036620" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:39.032948" elapsed="0.003703"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:39.036707" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:49:39.036881" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:38.937149" elapsed="0.099917"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:39.037140" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:49:39.037309" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:38.936355" elapsed="0.100981"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.038646" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.038110" elapsed="0.000566"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:39.038727" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:39.038919" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:39.037730" elapsed="0.001233"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:39.039362" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 137, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.039150" elapsed="0.000240"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:39.039769" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.039568" elapsed="0.000226"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:39.039866" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:49:39.040057" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:38.687825" elapsed="0.352258"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:39.040143" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:39.040294" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:38.687091" elapsed="0.353227"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.040690" elapsed="0.000197"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.040435" elapsed="0.000489"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.041097" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.040948" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.041316" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.041173" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.040416" elapsed="0.000971"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:38.686920" elapsed="0.354492"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.044057" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.043705" elapsed="0.000380"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:39.044132" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:49:39.044288" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:39.043158" elapsed="0.001155"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.135277" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.134881" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:39.136124" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:39.135865" elapsed="0.000410">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:39.136374" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:39.135501" elapsed="0.000900"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.137063" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:39.136667" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:39.137397" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:39.137589" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:39.137255" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.138025" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.137778" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.139062" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.138806" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.139532" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.139266" 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-04-10T00:49:39.139911" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.140116" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.140291" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:39.139772" elapsed="0.000577"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.139629" elapsed="0.000751"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:39.140450" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:49:39.140635" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:39.138467" elapsed="0.002194"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.138151" elapsed="0.002541"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.141040" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.140718" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.138127" elapsed="0.002994"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.141724" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.141269" elapsed="0.000483"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:39.141801" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:39.134220" elapsed="0.007705"/>
</kw>
<msg time="2026-04-10T00:49:39.141979" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:39.121460" elapsed="0.020602"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.157133" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.169756" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.182099" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.182892" 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-04-10T00:49:39.183666" 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-04-10T00:49:39.184227" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.184079" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:39.184062" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.184500" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.184710" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.184897" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:39.184012" elapsed="0.000960"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.183788" elapsed="0.001225"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.185733" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.185852" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:49:39.186077" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:39.114914" elapsed="0.071271"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:39.189058" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:39.188805" elapsed="0.000320">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:39.189312" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:39.188320" elapsed="0.001035"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.189882" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.189486" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.190576" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.190263" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.189988" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.189436" elapsed="0.001252"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.193877" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:39.191419" elapsed="0.002504"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:39.194001" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:49:39.194311" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:39.187179" elapsed="0.007236"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:39.197173" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:39.196932" elapsed="0.000307">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:39.197462" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:39.196483" elapsed="0.001024"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:39.197906" elapsed="0.000079"/>
</return>
<status status="PASS" start="2026-04-10T00:49:39.197657" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.197606" elapsed="0.000485"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.198842" elapsed="0.000038"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.199775" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.199889" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:49:39.202253" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:39.195241" elapsed="0.007120"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.206406" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.205977" elapsed="0.000534"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.207894" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.207245" 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-04-10T00:49:39.235077" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:39.235817" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:49:39 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:39.236246" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:39.210421" elapsed="0.025869"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.208185" elapsed="0.028221"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.237033" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.236540" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.208119" elapsed="0.029079"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.245444" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.240253" elapsed="0.006180"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.239870" elapsed="0.006639"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.239832" elapsed="0.006756"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.250518" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.247193" elapsed="0.003430"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.246757" elapsed="0.003927"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.246722" elapsed="0.004002"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.251808" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.251140" elapsed="0.000714"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.252409" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.252044" elapsed="0.000863"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.253816" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.253252" elapsed="0.000605"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.252967" elapsed="0.000943"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.252004" elapsed="0.001938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.254839" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.254225" elapsed="0.000656"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.255422" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.255033" elapsed="0.000482"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.256344" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.255836" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.255581" elapsed="0.000850"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.254998" elapsed="0.001461"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:39.256975" elapsed="0.000418"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:39.257963" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.257630" elapsed="0.000360"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.258190" elapsed="0.003380"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:39.238531" elapsed="0.023250"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.262262" elapsed="0.000075"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:39.261991" elapsed="0.000438"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.261898" elapsed="0.000576"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:39.275107" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:39.263337" elapsed="0.011858"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:39.275337" elapsed="0.000114"/>
</return>
<msg time="2026-04-10T00:49:39.275832" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:39.203066" elapsed="0.072902"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:39.276624" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:49:39.276861" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:39.053293" elapsed="0.223603"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.277473" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.277031" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.277003" elapsed="0.000819"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:39.277867" 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="PASS" start="2026-04-10T00:49:39.048852" elapsed="0.229180"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.044411" elapsed="0.233678"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.044366" elapsed="0.233756"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.279033" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:39.278878" elapsed="0.000213"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:49:39.279245" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:49:39.279119" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.278854" elapsed="0.000496"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.279616" elapsed="0.000031"/>
</kw>
<msg time="2026-04-10T00:49:39.279776" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:39.278445" elapsed="0.001366"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.280740" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.280062" elapsed="0.000715"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.281600" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.280992" elapsed="0.000647"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.289850" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.289061" elapsed="0.000866"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.290718" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.290154" 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-04-10T00:49:39.318608" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:39.318826" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:39 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:39 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":53,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-2-shard-inventory-operational","LastIndex":137,"RaftState":"Leader","LastApplied":137,"LastCommittedTransactionTime":"2026-04-10 00:49:15.788","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:45:27.740","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.490","active":true,"matchIndex":137,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":138},{"timeSinceLastActivity":"00:00:00.490","active":true,"matchIndex":137,"voting":true,"id":"member-3-shard-inventory-operational","nextIndex":138}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"789.7 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":51,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-3-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-2-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":7926168},"timestamp":1775782179,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:39.319124" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:39.307349" elapsed="0.011911"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.290885" elapsed="0.028813"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.320049" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.319754" elapsed="0.000885"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.290853" elapsed="0.029825"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.327362" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":53,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-2-shard-inventory-operational","LastIndex":137,"RaftState":"Leader","LastApplied":137,"LastCommittedTransactionTime":"2026-04-10 00:49:15.788","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:45:27.740","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.490","active":true,"matchIndex":137,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":138},{"timeSinceLastActivity":"00:00:00.490","active":true,"matchIndex":137,"voting":true,"id":"member-3-shard-inventory-operational","nextIndex":138}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"789.7 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":51,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-3-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-2-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":7926168},"timestamp":1775782179,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.323473" elapsed="0.004061"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.322352" elapsed="0.005279"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.322324" elapsed="0.005363"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.332862" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.329066" elapsed="0.004088"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.327821" elapsed="0.005464"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.327789" elapsed="0.005592"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.337750" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.335000" elapsed="0.002925"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.339644" elapsed="0.000090"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.338382" elapsed="0.001470"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.341923" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.340879" elapsed="0.001112"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.339942" elapsed="0.002121"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.338311" elapsed="0.003802"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.344125" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.343019" elapsed="0.001196"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.345282" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.344456" elapsed="0.000948"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.346683" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.345943" elapsed="0.000807"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.345458" elapsed="0.001362"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.344427" elapsed="0.002442"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:39.347205" elapsed="0.000909"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:39.349373" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.348652" elapsed="0.000809"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.349899" elapsed="0.003298"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:39.321396" elapsed="0.031971"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.353593" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:39.353444" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.353425" elapsed="0.000239"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:39.357478" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:39.353815" elapsed="0.003694"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:39.357635" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:49:39.357811" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:39.283005" elapsed="0.074832"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:39.357896" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:39.358048" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:39.281946" elapsed="0.076129"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.359192" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.358697" elapsed="0.000525"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:39.359272" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:39.359453" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:39.358319" elapsed="0.001165"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:39.360024" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 137, 'CommittedTransactionsCount': 51, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.359813" elapsed="0.000238"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:39.360411" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.360209" elapsed="0.000227"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:39.360483" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:39.360880" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:39.042536" elapsed="0.318370"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:39.360965" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:39.361117" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:39.041809" elapsed="0.319332"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.361444" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.361222" elapsed="0.000279"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.361750" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.361524" elapsed="0.000457"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.362154" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.362004" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.361204" elapsed="0.001024"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:39.041633" elapsed="0.320619"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.364752" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.364309" elapsed="0.000471"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:39.364826" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:39.364975" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:39.363962" elapsed="0.001038"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.452409" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.452009" elapsed="0.000634"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:39.453469" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:39.453173" elapsed="0.000397">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:39.453668" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:39.452829" elapsed="0.000864"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.454252" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:39.453860" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:39.454610" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:39.454769" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:39.454444" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.455207" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.454955" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.456251" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.455993" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.456779" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.456459" 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-04-10T00:49:39.457144" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.457353" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.457528" elapsed="0.000035"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:39.457006" elapsed="0.000596"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.456860" elapsed="0.000774"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:39.457683" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:49:39.457855" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:39.455669" elapsed="0.002212"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.455334" elapsed="0.002579"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.458086" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.457938" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.455310" elapsed="0.002853"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.458766" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.458308" elapsed="0.000486"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:39.458843" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:39.451362" elapsed="0.007607"/>
</kw>
<msg time="2026-04-10T00:49:39.459023" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:39.438615" elapsed="0.020491"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.471695" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.484370" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.496839" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.497636" 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-04-10T00:49:39.498395" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.498993" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.498840" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:39.498823" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.499233" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.499417" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.499621" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:39.498771" elapsed="0.000927"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.498525" elapsed="0.001214"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.500445" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.500580" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:49:39.500826" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:39.432015" elapsed="0.068919"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:39.503885" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:39.503612" elapsed="0.000348">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:39.504149" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:39.503132" elapsed="0.001061"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.504772" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.504324" elapsed="0.000521"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.505461" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.505160" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.504884" elapsed="0.000650"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.504274" elapsed="0.001315"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.508824" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:39.506329" elapsed="0.002555"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:39.508971" elapsed="0.000064"/>
</return>
<msg time="2026-04-10T00:49:39.509289" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:39.501956" elapsed="0.007438"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:39.512228" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:39.511982" elapsed="0.000310">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:39.512487" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:39.511531" elapsed="0.001003"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:39.513025" elapsed="0.000079"/>
</return>
<status status="PASS" start="2026-04-10T00:49:39.512774" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.512721" elapsed="0.000492"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.514030" elapsed="0.000039"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.514913" elapsed="0.000040"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.515028" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:49:39.518050" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:39.510286" elapsed="0.007874"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.522302" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.521894" elapsed="0.000511"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.523616" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.523178" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:39.552096" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:39.552561" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:49:39 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:39.552873" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:39.526408" elapsed="0.026493"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.523860" elapsed="0.029107"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.553296" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.553018" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.523808" elapsed="0.029601"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.558097" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.555231" elapsed="0.003190"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.554992" elapsed="0.003466"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.554970" elapsed="0.003513"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.561137" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.558826" elapsed="0.002358"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.558596" elapsed="0.002624"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.558576" elapsed="0.002668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.561858" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.561446" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.562217" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.561978" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.562842" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.562463" elapsed="0.000406"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.562300" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.561959" elapsed="0.000969"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.563475" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.563110" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.563849" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.563609" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.564393" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.564091" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.563931" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.563590" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:39.564718" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:39.565579" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.565261" elapsed="0.000345"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.565782" elapsed="0.002436"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:39.554215" elapsed="0.014143"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.568851" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:39.568573" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.568473" elapsed="0.000531"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:39.578120" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:39.569750" elapsed="0.008423"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:39.578257" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:49:39.578625" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:39.518879" elapsed="0.059855"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:39.579199" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:39.579379" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:39.373450" elapsed="0.205956"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.579813" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.579498" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.579480" elapsed="0.000599"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:39.580115" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:39.369266" elapsed="0.210979"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.365067" elapsed="0.215223"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.365050" elapsed="0.215265"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.581053" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:39.580915" elapsed="0.000196"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:49:39.581266" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:49:39.581138" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.580897" elapsed="0.000465"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.581590" elapsed="0.000218"/>
</kw>
<msg time="2026-04-10T00:49:39.581940" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:39.580569" elapsed="0.001404"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.582658" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.582171" elapsed="0.000521"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.583416" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.582889" elapsed="0.000559"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.589587" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.589104" elapsed="0.000535"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.590371" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.589800" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:39.608981" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:39.609125" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:39 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:39 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-2-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":137,"LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:45:27.748","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"400.4 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":7926168},"timestamp":1775782179,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:39.609331" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:39.601896" elapsed="0.007542"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.590492" elapsed="0.019232"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.609930" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.609759" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.590472" elapsed="0.019803"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.615401" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-2-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":137,"LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:45:27.748","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"400.4 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":7926168},"timestamp":1775782179,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.612668" elapsed="0.002854"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.611524" elapsed="0.004072"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.611505" elapsed="0.004131"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.619044" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.616588" elapsed="0.002554"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.615719" elapsed="0.003471"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.615700" elapsed="0.003528"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.620786" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.619983" elapsed="0.000865"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.621481" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.621013" elapsed="0.000572"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.622461" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.621954" elapsed="0.000552"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.621623" elapsed="0.000949"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.620994" elapsed="0.001615"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.624114" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.623238" elapsed="0.000936"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.625028" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.624341" elapsed="0.000776"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.626193" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.625526" elapsed="0.000712"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.625153" elapsed="0.001135"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.624321" elapsed="0.002001"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:39.626585" elapsed="0.000622"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:39.628072" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.627514" elapsed="0.000618"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.628443" elapsed="0.002621"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:39.610818" elapsed="0.020409"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.631429" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:39.631299" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.631281" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:39.635249" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:39.631806" elapsed="0.003472"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:39.635331" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:49:39.635516" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:39.584715" elapsed="0.051017"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:39.635797" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:39.635953" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:39.583887" elapsed="0.052092"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.637118" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.636588" elapsed="0.000559"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:39.637196" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:39.637373" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:39.636214" elapsed="0.001186"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:39.637780" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 137, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.637576" elapsed="0.000232"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:39.638165" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.637965" elapsed="0.000226"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:39.638238" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:39.638391" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:39.363335" elapsed="0.275082"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:39.638476" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:39.638648" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:39.362615" elapsed="0.276058"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.638972" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.638755" elapsed="0.000444"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.639368" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.639222" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.639651" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.639444" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.638737" elapsed="0.000989"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:39.362428" elapsed="0.277322"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:38.686514" elapsed="0.953269"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:39.639826" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:39.640028" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:49:39.640073" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:49:38.682519" elapsed="0.957577"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.640560" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:49:39.640638" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:39.640272" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.640962" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.640746" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.640729" elapsed="0.000308"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.643169" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:49:39.641174" elapsed="0.002043"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:49:39.643681" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.643418" elapsed="0.000290"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:39.643756" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:49:38.679926" elapsed="0.963986"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:49:38.679535" elapsed="0.964425"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.648364" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:39.647986" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.648890" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:39.648567" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:39.648960" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:39.649112" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:39.647615" elapsed="0.001521"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:49:39.649291" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.649950" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:39.649618" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.650368" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:39.650134" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.650795" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:39.650562" elapsed="0.000258"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.653275" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.652954" elapsed="0.000348"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:39.653347" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:39.653493" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:39.652578" elapsed="0.000940"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.741931" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.741432" elapsed="0.000534"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:39.742762" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:39.742486" elapsed="0.000352">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:39.742933" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:39.742145" elapsed="0.000813"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.743512" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:39.743129" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:39.743862" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:39.744022" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:39.743719" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.744515" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.744265" 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-04-10T00:49:39.745605" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.745325" elapsed="0.000326"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.746091" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.745816" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.746454" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.746677" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.746856" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:39.746315" elapsed="0.000600"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.746172" elapsed="0.000775"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:39.746995" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:49:39.747162" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:39.744996" elapsed="0.002192"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.744659" elapsed="0.002562"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.747396" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.747246" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.744635" elapsed="0.002838"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.748081" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.747635" elapsed="0.000474"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:39.748159" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:39.740805" elapsed="0.007479"/>
</kw>
<msg time="2026-04-10T00:49:39.748338" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:39.727437" elapsed="0.020988"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.761295" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.776450" elapsed="0.000047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.789613" elapsed="0.000242"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.790648" 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-04-10T00:49:39.791428" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.792200" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.792020" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:39.792000" elapsed="0.000291"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.792461" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.792698" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.792957" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:39.791940" elapsed="0.001101"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.791647" elapsed="0.001438"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.793833" elapsed="0.000038"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.793960" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:49:39.794223" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:39.720912" elapsed="0.073422"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:39.797486" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:39.797175" elapsed="0.000405">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:39.797779" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:39.796613" elapsed="0.001214"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.798369" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.797964" elapsed="0.000475"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.799196" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.798887" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.798481" elapsed="0.000791"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.797912" elapsed="0.001400"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.802820" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:39.800086" elapsed="0.002794"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:39.802964" elapsed="0.000069"/>
</return>
<msg time="2026-04-10T00:49:39.803300" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:39.795378" elapsed="0.008031"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:39.806204" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:39.805946" elapsed="0.000324">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:39.806459" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:39.805432" elapsed="0.001071"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:39.806905" elapsed="0.000081"/>
</return>
<status status="PASS" start="2026-04-10T00:49:39.806654" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.806602" elapsed="0.000494"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.807928" 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-04-10T00:49:39.808714" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.808892" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:49:39.811148" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:39.804264" elapsed="0.006997"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.815423" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.815021" elapsed="0.000513"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.816740" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.816260" 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-04-10T00:49:39.837754" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:39.838713" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:39.839210" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:39.819116" elapsed="0.020156"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.816989" elapsed="0.022415"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.840322" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.839512" elapsed="0.000988"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.816938" elapsed="0.023692"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.847649" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.843615" elapsed="0.004492"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.843262" elapsed="0.004896"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.843232" elapsed="0.004960"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.851252" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.848679" elapsed="0.002621"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.848306" elapsed="0.003029"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.848280" elapsed="0.003079"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.851998" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.851580" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.852372" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.852118" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.853029" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.852684" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.852454" elapsed="0.000638"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.852099" elapsed="0.001014"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.853703" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.853314" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.854066" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.853830" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.854643" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.854307" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.854147" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.853811" elapsed="0.000915"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:39.854913" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:39.855780" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.855466" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.855985" elapsed="0.002534"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:39.842180" elapsed="0.016500"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.859059" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:39.858815" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.858763" elapsed="0.000452"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:39.870093" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:39.860048" elapsed="0.010099"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:39.870231" elapsed="0.000087"/>
</return>
<msg time="2026-04-10T00:49:39.870916" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:39.811967" elapsed="0.059062"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:39.871643" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:49:39.871848" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:39.662959" elapsed="0.208918"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.872260" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.871967" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.871948" elapsed="0.000570"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:39.872575" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:39.658762" elapsed="0.213956"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.653610" elapsed="0.219154"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.653592" elapsed="0.219197"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.873487" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:39.873364" elapsed="0.000170"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:49:39.873696" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:49:39.873574" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.873346" elapsed="0.000435"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.873947" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:49:39.874069" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:39.873074" elapsed="0.001020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.874748" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.874284" elapsed="0.000499"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.875424" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.874944" elapsed="0.000509"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.881915" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.881302" elapsed="0.000667"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.882610" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.882145" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:39.905256" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:39.905456" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:39 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:39 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-2-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastApplied":43,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:45:27.717","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"302.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":10171},"timestamp":1775782179,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:39.905767" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:39.895321" elapsed="0.010597"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.882732" elapsed="0.023550"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.906591" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.906332" elapsed="0.000710"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.882710" elapsed="0.024367"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.914226" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-2-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastApplied":43,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:45:27.717","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"302.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":10171},"timestamp":1775782179,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.910218" elapsed="0.004171"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.908886" elapsed="0.005573"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.908831" elapsed="0.005681"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.919421" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:39.915920" elapsed="0.003658"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.914653" elapsed="0.004998"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.914626" elapsed="0.005078"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.921683" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.920627" elapsed="0.001117"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.922391" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.921910" elapsed="0.000568"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.923435" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.922934" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.922516" elapsed="0.001016"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.921890" elapsed="0.001694"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.925001" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.924203" elapsed="0.000860"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.925706" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.925229" elapsed="0.000566"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.926673" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.926159" elapsed="0.000560"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.925832" elapsed="0.000937"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.925209" elapsed="0.001594"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:39.927028" elapsed="0.000686"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:39.928523" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.928020" elapsed="0.000660"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.928996" elapsed="0.002446"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:39.907821" elapsed="0.023800"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:39.931825" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:39.931695" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.931676" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:39.935656" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:39.932042" elapsed="0.003644"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:39.935739" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:49:39.935905" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:39.876468" elapsed="0.059463"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:39.936051" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:39.936217" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:39.875709" elapsed="0.060534"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.937384" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:39.936905" elapsed="0.000508"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:39.937462" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:39.937663" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:39.936476" elapsed="0.001214"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:39.938241" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 43, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.938042" elapsed="0.000226"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:39.938637" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.938424" elapsed="0.000238"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:39.938707" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:39.938858" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:39.651962" elapsed="0.286920"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:39.938939" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:49:39.939085" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:39.651235" elapsed="0.287875"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:39.939404" elapsed="0.000205"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.939190" elapsed="0.000457"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.939817" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.939671" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:39.940035" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:39.939894" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.939173" elapsed="0.000935"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:39.651067" elapsed="0.289066"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:39.942698" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:39.942356" elapsed="0.000369"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:39.942770" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:39.942921" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:39.942016" elapsed="0.000930"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.031376" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.030947" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.032219" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:40.031958" elapsed="0.000419">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:40.032475" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:40.031607" elapsed="0.000893"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.033106" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:40.032685" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.033447" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:40.033629" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:40.033301" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.034069" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.033818" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.035231" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.034949" elapsed="0.000331"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.035776" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.035447" elapsed="0.000356"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.036146" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.036394" 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-04-10T00:49:40.036598" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:40.036005" elapsed="0.000656"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.035860" elapsed="0.000855"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:40.036772" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:49:40.037031" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:40.034585" elapsed="0.002473"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.034203" elapsed="0.002889"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.037270" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.037119" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.034177" elapsed="0.003172"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.038186" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.037500" elapsed="0.000714"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:40.038284" elapsed="0.000040"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:40.030202" elapsed="0.008241"/>
</kw>
<msg time="2026-04-10T00:49:40.038562" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:40.017110" elapsed="0.021584"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.051905" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.065298" elapsed="0.000075"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.078380" elapsed="0.000068"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.079277" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.080088" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.080794" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.080633" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:40.080611" elapsed="0.000272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.081127" 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-04-10T00:49:40.081338" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.081529" elapsed="0.000039"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:40.080529" elapsed="0.001096"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.080243" elapsed="0.001426"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.082397" elapsed="0.000037"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.082529" elapsed="0.000069"/>
</return>
<msg time="2026-04-10T00:49:40.082818" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:40.010470" elapsed="0.072461"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.086036" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:40.085725" elapsed="0.000388">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:40.086308" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:40.085206" elapsed="0.001147"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.086910" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.086486" elapsed="0.000490"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.087745" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.087296" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.087015" elapsed="0.000804"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.086433" elapsed="0.001423"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.091022" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:40.088615" elapsed="0.002510"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:40.091208" elapsed="0.000067"/>
</return>
<msg time="2026-04-10T00:49:40.091533" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:40.084014" elapsed="0.007794"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.095068" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:40.094612" elapsed="0.000526">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:40.095400" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:40.094145" elapsed="0.001303"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:40.095961" elapsed="0.000081"/>
</return>
<status status="PASS" start="2026-04-10T00:49:40.095703" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.095539" elapsed="0.000613"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.097041" elapsed="0.000038"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.097819" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.097928" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:49:40.100214" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:40.092647" elapsed="0.007678"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.104323" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.103905" elapsed="0.000522"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.105698" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.105256" elapsed="0.000539"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:40.121880" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:40.122537" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:40.122927" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:40.108131" elapsed="0.014839"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.105929" elapsed="0.017152"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.123619" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.123157" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.105876" elapsed="0.017913"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.130738" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.126508" elapsed="0.004727"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.126152" elapsed="0.005138"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.126121" elapsed="0.005207"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.135367" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.131844" elapsed="0.003590"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.131451" elapsed="0.004031"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.131423" elapsed="0.004093"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.136447" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.135857" elapsed="0.000628"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.137050" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.136658" elapsed="0.000476"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.137763" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.137396" elapsed="0.000394"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.137167" elapsed="0.000659"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.136630" elapsed="0.001218"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.138392" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.138031" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.138769" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.138509" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.139307" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.139010" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.138850" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.138490" elapsed="0.000898"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:40.139581" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:40.140417" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.140119" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.140638" elapsed="0.002448"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:40.125009" elapsed="0.018204"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.143581" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:40.143343" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.143293" elapsed="0.000441"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:40.153029" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:40.144472" elapsed="0.008613"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:40.153172" elapsed="0.000075"/>
</return>
<msg time="2026-04-10T00:49:40.153518" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:40.101201" elapsed="0.052444"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:40.154165" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:49:40.154356" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:39.951502" elapsed="0.202882"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.154793" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.154480" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.154461" elapsed="0.000620"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:40.155118" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:39.947277" elapsed="0.207986"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:39.943013" elapsed="0.212296"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:39.942996" elapsed="0.212339"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.156044" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:40.155924" elapsed="0.000169"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:49:40.156219" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:40.156116" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.155906" elapsed="0.000407"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.156479" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:49:40.156648" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:40.155626" elapsed="0.001050"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.157326" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.156870" elapsed="0.000484"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.158055" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.157567" elapsed="0.000520"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.164018" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.163533" elapsed="0.000536"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.164801" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.164236" elapsed="0.000613"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:40.185356" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:40.185524" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:40 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:40 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":21,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-2-shard-topology-operational","LastIndex":43,"RaftState":"Leader","LastApplied":43,"LastCommittedTransactionTime":"2026-04-10 00:49:15.696","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:45:27.707","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.406","active":true,"matchIndex":43,"voting":true,"id":"member-1-shard-topology-operational","nextIndex":44},{"timeSinceLastActivity":"00:00:00.406","active":true,"matchIndex":43,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":44}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"586.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":21,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":10171},"timestamp":1775782180,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:40.185856" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:40.176418" elapsed="0.009600"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.164923" elapsed="0.021489"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.186766" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.186476" elapsed="0.000841"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.164902" elapsed="0.022457"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.195217" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":21,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-2-shard-topology-operational","LastIndex":43,"RaftState":"Leader","LastApplied":43,"LastCommittedTransactionTime":"2026-04-10 00:49:15.696","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:45:27.707","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.406","active":true,"matchIndex":43,"voting":true,"id":"member-1-shard-topology-operational","nextIndex":44},{"timeSinceLastActivity":"00:00:00.406","active":true,"matchIndex":43,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":44}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"586.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":21,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":10171},"timestamp":1775782180,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.190758" elapsed="0.004644"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.189381" elapsed="0.006099"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.189351" elapsed="0.006187"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.200131" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.197241" elapsed="0.002998"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.195706" elapsed="0.004586"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.195677" elapsed="0.004656"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.201910" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.201070" elapsed="0.000906"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.202659" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.202155" elapsed="0.000596"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.203736" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.203152" elapsed="0.000632"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.202790" elapsed="0.001048"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.202134" elapsed="0.001742"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.205646" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.204640" elapsed="0.001070"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.206410" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.205887" elapsed="0.000628"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.207477" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.206925" elapsed="0.000599"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.206572" elapsed="0.001020"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.205865" elapsed="0.001764"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:40.207869" elapsed="0.000648"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:40.209539" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.208992" elapsed="0.000628"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.209919" elapsed="0.002564"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:40.188183" elapsed="0.024555"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.212961" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:40.212823" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.212802" elapsed="0.000290"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:40.217139" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:40.213250" elapsed="0.003922"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:40.217293" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:49:40.217475" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:40.159096" elapsed="0.058407"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:40.217583" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:40.217739" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:40.158309" elapsed="0.059456"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.218997" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.218438" elapsed="0.000589"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:40.219078" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:40.219279" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:40.218040" elapsed="0.001269"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:40.219747" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 43, 'CommittedTransactionsCount': 21, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.219471" elapsed="0.000305"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:40.220140" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.219938" elapsed="0.000231"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:40.220221" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:40.220378" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:39.941388" elapsed="0.279016"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:40.220463" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:40.220704" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:39.940474" elapsed="0.280257"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.221099" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.220820" elapsed="0.000347"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.221417" elapsed="0.000215"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.221199" elapsed="0.000473"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.221849" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.221697" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.220800" elapsed="0.001126"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:39.940303" elapsed="0.281648"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.224384" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.224042" elapsed="0.000370"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:40.224459" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:40.224691" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:40.223692" elapsed="0.001026"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.314534" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.314131" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.315472" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:40.315185" elapsed="0.000379">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:40.315663" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:40.314838" elapsed="0.000850"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.316244" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:40.315857" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.316592" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:40.316761" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:40.316431" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.317208" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.316944" 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-04-10T00:49:40.318279" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.318026" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.318773" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.318487" elapsed="0.000312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.319134" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.319339" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.319519" elapsed="0.000038"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:40.318995" elapsed="0.000601"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.318854" elapsed="0.000773"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:40.319674" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:49:40.319844" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:40.317694" elapsed="0.002175"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.317335" elapsed="0.002566"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.320075" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.319926" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.317311" elapsed="0.002841"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.320749" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.320296" elapsed="0.000481"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:40.320825" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:40.313468" elapsed="0.007482"/>
</kw>
<msg time="2026-04-10T00:49:40.321005" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:40.299512" elapsed="0.021620"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.333830" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.346480" elapsed="0.000094"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.359227" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.360117" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.360956" elapsed="0.000039"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.361669" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.361490" elapsed="0.000240"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:40.361467" elapsed="0.000291"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.361925" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.362115" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.362304" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:40.361398" elapsed="0.000984"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.361138" elapsed="0.001287"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.363250" elapsed="0.000038"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.363381" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:49:40.363683" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:40.292853" elapsed="0.070945"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.367030" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:40.366651" elapsed="0.000460">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:40.367311" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:40.366074" elapsed="0.001284"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.367940" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.367495" elapsed="0.000517"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.368773" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.368333" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.368052" elapsed="0.000799"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.367443" elapsed="0.001450"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.372156" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:40.369710" elapsed="0.002493"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:40.372287" elapsed="0.000068"/>
</return>
<msg time="2026-04-10T00:49:40.372845" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:40.364876" elapsed="0.008128"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.376098" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:40.375817" elapsed="0.000355">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:40.376366" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:40.375342" elapsed="0.001071"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:40.376884" elapsed="0.000095"/>
</return>
<status status="PASS" start="2026-04-10T00:49:40.376615" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.376500" elapsed="0.000617"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.377896" elapsed="0.000224"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.378885" elapsed="0.000044"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.379010" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:49:40.382837" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:40.373979" elapsed="0.008969"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.387075" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.386650" elapsed="0.000534"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.388327" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.387926" elapsed="0.000501"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:40.408123" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:40.409266" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:40.409889" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:40.390912" elapsed="0.019048"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.388700" elapsed="0.021408"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.410931" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.410223" elapsed="0.000901"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.388507" elapsed="0.022708"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.419412" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.415480" elapsed="0.004301"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.414972" elapsed="0.004846"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.414927" elapsed="0.004916"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.422495" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.420153" elapsed="0.002402"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.419925" elapsed="0.002667"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.419906" elapsed="0.002710"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.423225" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.422822" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.423643" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.423345" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.424206" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.423894" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.423728" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.423326" elapsed="0.000965"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.425012" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.424474" elapsed="0.000564"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.425582" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.425297" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.426166" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.425830" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.425667" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.425110" elapsed="0.001142"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:40.426455" elapsed="0.000428"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:40.427432" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.427122" elapsed="0.000335"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.427653" elapsed="0.002582"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:40.413273" elapsed="0.017092"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.430738" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:40.430496" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.430445" elapsed="0.000446"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:40.440477" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:40.431651" elapsed="0.008881"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:40.440644" elapsed="0.000078"/>
</return>
<msg time="2026-04-10T00:49:40.441007" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:40.383675" elapsed="0.057442"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:40.441625" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:49:40.441811" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:40.233327" elapsed="0.208512"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.442226" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.441929" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.441910" elapsed="0.000556"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:40.442502" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:40.229006" elapsed="0.213645"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.224790" elapsed="0.217907"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.224771" elapsed="0.217950"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.443360" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:40.443249" elapsed="0.000157"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:49:40.443533" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:49:40.443430" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.443231" elapsed="0.000414"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.443804" elapsed="0.000024"/>
</kw>
<msg time="2026-04-10T00:49:40.443928" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:40.442960" elapsed="0.000996"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.444530" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.444141" elapsed="0.000433"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.445230" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.444733" elapsed="0.000525"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.450953" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.450485" elapsed="0.000516"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.451687" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.451158" 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-04-10T00:49:40.471374" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:40.471520" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:40 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:40 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-2-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":43,"LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:45:27.716","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"268.8 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":10171},"timestamp":1775782180,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:40.471770" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:40.462934" elapsed="0.008943"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.451800" elapsed="0.020336"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.472346" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.472172" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.451782" elapsed="0.021077"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.478174" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-2-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":43,"LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:45:27.716","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"268.8 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":10171},"timestamp":1775782180,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.475161" elapsed="0.003196"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.474173" elapsed="0.004264"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.474154" elapsed="0.004341"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.483850" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.480062" elapsed="0.003935"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.478643" elapsed="0.005426"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.478615" elapsed="0.005510"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.486051" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.485080" elapsed="0.001034"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.486772" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.486283" elapsed="0.000578"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.487810" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.487236" elapsed="0.000621"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.486899" elapsed="0.001009"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.486263" elapsed="0.001680"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.489374" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.488593" elapsed="0.000844"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.490147" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.489636" elapsed="0.000607"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.491160" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.490646" elapsed="0.000561"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.490286" elapsed="0.000972"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.489616" elapsed="0.001680"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:40.491524" elapsed="0.000662"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:40.493021" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.492498" elapsed="0.000584"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.493417" elapsed="0.002465"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:40.473422" elapsed="0.022622"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.496246" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:40.496118" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.496099" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:40.500262" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:40.496471" elapsed="0.003822"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:40.500348" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:49:40.500519" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:40.446227" elapsed="0.054335"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:40.500672" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:40.500827" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:40.445476" elapsed="0.055377"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.502081" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.501519" elapsed="0.000592"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:40.502160" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:40.502338" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:40.501093" elapsed="0.001272"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:40.502748" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 43, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.502527" elapsed="0.000249"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:40.503134" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.502933" elapsed="0.000227"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:40.503207" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:40.503358" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:40.223062" elapsed="0.280321"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:40.503441" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:49:40.503607" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:40.222318" elapsed="0.281314"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.503935" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.503716" elapsed="0.000449"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.504335" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.504189" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.504572" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.504413" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.503698" elapsed="0.000949"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:40.222126" elapsed="0.282546"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:39.650868" elapsed="0.853836"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:40.504752" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:49:40.504989" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:49:40.505037" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:49:39.646883" elapsed="0.858178"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.505557" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:49:40.505638" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:40.505264" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.505949" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.505732" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.505715" elapsed="0.000312"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.508404" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:49:40.506163" elapsed="0.002291"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:49:40.508906" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.508683" elapsed="0.000254"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:40.508986" elapsed="0.000031"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:49:39.644279" elapsed="0.864943"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:49:39.644049" elapsed="0.865223"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.513904" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:40.513458" elapsed="0.000476"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.514420" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:40.514101" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:40.514498" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:49:40.514692" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:40.513027" elapsed="0.001691"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:49:40.514879" elapsed="0.000165"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.515614" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:40.515210" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.516061" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:40.515809" elapsed="0.000279"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.516481" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:40.516242" elapsed="0.000266"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.519293" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.518912" elapsed="0.000411"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:40.519375" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:49:40.519591" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:40.518521" elapsed="0.001098"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.607949" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.607513" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.608782" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:40.608501" elapsed="0.000360">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:40.608956" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:40.608163" elapsed="0.000817"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.609591" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:40.609147" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.609922" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:40.610147" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:40.609781" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.610670" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.610400" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.611711" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.611439" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.612186" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.611920" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.612562" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.612771" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.612949" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:40.612403" elapsed="0.000603"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.612264" elapsed="0.000773"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:40.613085" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:49:40.613274" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:40.611114" elapsed="0.002186"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.610797" elapsed="0.002535"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.613506" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.613357" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.610774" elapsed="0.002829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.614193" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.613751" elapsed="0.000470"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:40.614270" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:40.606851" elapsed="0.007543"/>
</kw>
<msg time="2026-04-10T00:49:40.614448" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:40.594139" elapsed="0.020398"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.627254" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.640173" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.653036" elapsed="0.000056"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.653960" 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-04-10T00:49:40.654761" 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-04-10T00:49:40.655449" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.655295" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:40.655275" 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-04-10T00:49:40.655718" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.655907" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.656096" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:40.655216" elapsed="0.000957"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.654968" elapsed="0.001248"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.656958" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.657085" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:49:40.657367" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:40.587786" elapsed="0.069693"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.660496" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:40.660201" elapsed="0.000385">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:40.660779" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:40.659709" elapsed="0.001116"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.661408" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.660958" elapsed="0.000518"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.662107" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.661809" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.661516" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.660906" elapsed="0.001310"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.665498" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:40.663062" elapsed="0.002496"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:40.665640" elapsed="0.000067"/>
</return>
<msg time="2026-04-10T00:49:40.665960" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:40.658512" elapsed="0.007552"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.668970" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:40.668691" elapsed="0.000353">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:40.669237" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:40.668226" elapsed="0.001084"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:40.669721" elapsed="0.000081"/>
</return>
<status status="PASS" start="2026-04-10T00:49:40.669447" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.669395" elapsed="0.000514"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.670757" 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-04-10T00:49:40.671525" elapsed="0.000053"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.671651" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:49:40.674178" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:40.667091" elapsed="0.007197"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.678258" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.677841" elapsed="0.000520"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.679913" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.679290" 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-04-10T00:49:40.699315" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:40.700354" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:40.700897" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:40.682368" elapsed="0.018597"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.680146" elapsed="0.020960"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.702037" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.701245" elapsed="0.000982"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.680093" elapsed="0.022224"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.711035" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.706630" elapsed="0.004808"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.706082" elapsed="0.005395"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.706034" elapsed="0.005468"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.714143" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.711838" elapsed="0.002351"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.711607" elapsed="0.002615"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.711587" elapsed="0.002659"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.714916" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.714459" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.715274" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.715035" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.715842" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.715519" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.715356" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.715016" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.716467" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.716107" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.716838" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.716601" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.717426" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.717080" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.716920" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.716582" elapsed="0.000928"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:40.717701" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:40.718560" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.718247" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.718766" elapsed="0.002429"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:40.704232" elapsed="0.017116"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.721717" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:40.721482" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.721430" elapsed="0.000439"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:40.731074" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:40.722625" elapsed="0.008499"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:40.731203" elapsed="0.000070"/>
</return>
<msg time="2026-04-10T00:49:40.731538" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:40.675108" elapsed="0.056554"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:40.732125" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:40.732306" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:40.528479" elapsed="0.203855"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.732690" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.732420" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.732402" elapsed="0.000514"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:40.732950" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:40.524070" elapsed="0.209009"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.519703" elapsed="0.213421"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.519682" elapsed="0.213467"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.733822" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:40.733710" elapsed="0.000159"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:49:40.733992" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:40.733891" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.733692" elapsed="0.000383"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.734226" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:49:40.734345" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:40.733402" elapsed="0.000969"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.734943" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.734563" elapsed="0.000406"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.735605" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.735127" elapsed="0.000507"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.741260" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.740813" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.741940" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.741486" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:40.759587" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:40.759728" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:40 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:40 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":74,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":74,"Leader":"member-2-shard-default-operational","LastIndex":75,"RaftState":"Follower","LastApplied":75,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":75,"LastLeadershipChangeTime":"2026-04-10 00:45:27.721","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"166.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":75,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":91316},"timestamp":1775782180,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:40.759927" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:40.753863" elapsed="0.006171"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.742052" elapsed="0.018240"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.760486" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.760324" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.742035" elapsed="0.018952"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.768286" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":74,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":74,"Leader":"member-2-shard-default-operational","LastIndex":75,"RaftState":"Follower","LastApplied":75,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":75,"LastLeadershipChangeTime":"2026-04-10 00:45:27.721","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"166.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":75,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":91316},"timestamp":1775782180,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.763939" elapsed="0.004522"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.762570" elapsed="0.005967"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.762521" elapsed="0.006140"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.772451" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.769988" elapsed="0.002675"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.768811" elapsed="0.003907"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.768782" elapsed="0.003976"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.774274" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.773434" elapsed="0.000904"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.775044" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.774516" elapsed="0.000621"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.776177" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.775516" elapsed="0.000720"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.775177" elapsed="0.001126"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.774493" elapsed="0.001860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.778169" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.777268" elapsed="0.000964"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.778931" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.778407" elapsed="0.000620"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.779957" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.779408" elapsed="0.000597"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.779067" elapsed="0.000992"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.778386" elapsed="0.001710"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:40.780335" elapsed="0.000731"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:40.781986" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.781438" elapsed="0.000612"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.782343" elapsed="0.002676"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:40.761577" elapsed="0.023612"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.785430" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:40.785267" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.785247" elapsed="0.000258"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:40.789383" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:40.785669" elapsed="0.003747"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:40.789471" elapsed="0.000156"/>
</return>
<msg time="2026-04-10T00:49:40.789807" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:40.736594" elapsed="0.053245"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:40.789965" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:49:40.790156" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:40.735851" elapsed="0.054333"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.791481" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578218...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.790956" elapsed="0.000555"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:40.791581" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:49:40.791766" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578218...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:40.790449" elapsed="0.001345"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:40.792171" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 75, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.791956" elapsed="0.000242"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:40.792621" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.792357" elapsed="0.000294"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:40.792702" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:40.792867" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:40.517879" elapsed="0.275013"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:40.792954" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:40.793131" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:40.517006" elapsed="0.276153"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.793511" elapsed="0.000213"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.793247" elapsed="0.000516"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.793937" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.793788" elapsed="0.000206"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.794170" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.794018" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.793228" elapsed="0.001020"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:40.516822" elapsed="0.277451"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.796950" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.796618" elapsed="0.000360"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:40.797024" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:40.797207" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:40.796251" elapsed="0.000995"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.887377" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.886949" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.888363" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:40.888084" elapsed="0.000356">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:40.888672" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:40.887602" elapsed="0.001095"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.889258" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:40.888868" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.889700" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:40.889887" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:40.889534" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.890341" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.890088" 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-04-10T00:49:40.891448" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.891193" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.891951" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.891681" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.892327" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.892534" elapsed="0.000039"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.892728" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:40.892187" elapsed="0.000599"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.892042" elapsed="0.000775"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:40.892866" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:49:40.893034" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:40.890858" elapsed="0.002202"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.890480" elapsed="0.002612"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.893267" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.893117" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.890456" elapsed="0.002887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.893978" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.893510" elapsed="0.000496"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:40.894054" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:40.886226" elapsed="0.007953"/>
</kw>
<msg time="2026-04-10T00:49:40.894233" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:40.873509" elapsed="0.020844"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.907139" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.919536" elapsed="0.000066"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.932089" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.932927" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.933753" 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-04-10T00:49:40.934355" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.934200" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:40.934180" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.934616" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.934807" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.934994" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:40.934125" elapsed="0.000944"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.933880" elapsed="0.001231"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.935863" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.935986" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:49:40.936239" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:40.866880" elapsed="0.069470"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.939371" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:40.939081" elapsed="0.000364">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:40.939653" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:40.938598" elapsed="0.001102"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.940236" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.939836" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.940948" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.940645" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.940343" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.939784" elapsed="0.001275"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.944557" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:40.941978" elapsed="0.002628"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:40.944685" elapsed="0.000067"/>
</return>
<msg time="2026-04-10T00:49:40.945012" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:40.937402" elapsed="0.007716"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:40.948286" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:40.948007" elapsed="0.000354">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:40.948638" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:40.947538" elapsed="0.001147"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:40.949084" elapsed="0.000083"/>
</return>
<status status="PASS" start="2026-04-10T00:49:40.948823" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.948769" elapsed="0.000508"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.950154" elapsed="0.000038"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.950937" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.951048" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:49:40.953324" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:40.946202" elapsed="0.007249"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.957500" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.957074" elapsed="0.000680"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.958859" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.958463" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:40.973750" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:40.974203" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:40.974465" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:40.961240" elapsed="0.013254"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.959081" elapsed="0.015515"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.974950" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.974653" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.959030" elapsed="0.016033"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.979677" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.976896" elapsed="0.003108"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.976653" elapsed="0.003387"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.976631" elapsed="0.003434"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.982784" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:40.980377" elapsed="0.002454"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.980147" elapsed="0.002718"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.980128" elapsed="0.002762"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.983492" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.983097" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.983890" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.983647" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.984445" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.984136" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.983972" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.983627" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.985129" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.984765" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:40.985504" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:40.985248" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:40.986061" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:40.985762" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.985601" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.985228" elapsed="0.000916"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:40.986321" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:40.987176" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:40.986876" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:40.987375" elapsed="0.004141"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:40.975879" elapsed="0.015790"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:40.992033" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:40.991807" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.991754" elapsed="0.000433"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:41.001982" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:40.992968" elapsed="0.009068"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:41.002122" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:49:41.002467" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:40.954327" elapsed="0.048268"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:41.003077" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:41.003256" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:40.807986" elapsed="0.195298"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.003675" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.003374" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.003356" elapsed="0.000569"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:41.003960" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:40.801982" elapsed="0.202106"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:40.797370" elapsed="0.206762"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:40.797305" elapsed="0.206851"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.004818" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:41.004708" elapsed="0.000155"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:49:41.004986" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:49:41.004885" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.004690" elapsed="0.000377"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.005226" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:49:41.005345" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:41.004390" elapsed="0.000981"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.006013" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.005592" elapsed="0.000448"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.006681" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.006198" elapsed="0.000513"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.012461" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.012006" elapsed="0.000504"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.013223" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.012782" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:41.031285" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:41.031449" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:41 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:41 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":21,"SnapshotIndex":76,"InMemoryJournalLogSize":4,"ReplicatedToAllIndex":76,"Leader":"member-2-shard-default-operational","LastIndex":80,"RaftState":"Leader","LastApplied":77,"LastCommittedTransactionTime":"2026-04-10 00:45:29.867","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":80,"LastLeadershipChangeTime":"2026-04-10 00:45:27.710","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.212","active":true,"matchIndex":77,"voting":true,"id":"member-1-shard-default-operational","nextIndex":78},{"timeSinceLastActivity":"00:00:00.212","active":true,"matchIndex":77,"voting":true,"id":"member-3-shard-default-operational","nextIndex":78}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"426.5 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":9,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":77,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":19,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":91521},"timestamp":1775782181,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:41.031689" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:41.024873" elapsed="0.006922"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.013338" elapsed="0.018741"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.032294" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.032115" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.013319" elapsed="0.019613"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.037941" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":21,"SnapshotIndex":76,"InMemoryJournalLogSize":4,"ReplicatedToAllIndex":76,"Leader":"member-2-shard-default-operational","LastIndex":80,"RaftState":"Leader","LastApplied":77,"LastCommittedTransactionTime":"2026-04-10 00:45:29.867","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":80,"LastLeadershipChangeTime":"2026-04-10 00:45:27.710","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.212","active":true,"matchIndex":77,"voting":true,"id":"member-1-shard-default-operational","nextIndex":78},{"timeSinceLastActivity":"00:00:00.212","active":true,"matchIndex":77,"voting":true,"id":"member-3-shard-default-operational","nextIndex":78}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"426.5 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":9,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":77,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":19,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":91521},"timestamp":1775782181,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.035137" elapsed="0.002921"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.034253" elapsed="0.003854"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.034233" elapsed="0.003914"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.041630" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.039114" elapsed="0.002615"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.038231" elapsed="0.003547"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.038212" elapsed="0.003603"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.043243" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.042459" elapsed="0.000846"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.043961" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.043472" elapsed="0.000578"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.045042" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.044423" elapsed="0.000666"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.044088" elapsed="0.001052"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.043452" elapsed="0.001723"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.046601" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.045853" elapsed="0.000811"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.047293" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.046830" elapsed="0.000549"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.048259" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.047761" elapsed="0.000544"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.047416" elapsed="0.000938"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.046809" elapsed="0.001580"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:41.048716" elapsed="0.000618"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:41.050182" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.049676" elapsed="0.000567"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.050528" elapsed="0.002613"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:41.033525" elapsed="0.019781"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.053556" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:41.053383" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.053364" elapsed="0.000264"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:41.057562" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:41.053781" elapsed="0.003813"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:41.057712" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:49:41.057886" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:41.007706" elapsed="0.050208"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:41.057973" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:41.058128" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:41.006929" elapsed="0.051226"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.059310" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578218...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.058780" elapsed="0.000560"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:41.059390" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:41.059587" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578218...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:41.058399" elapsed="0.001217"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:41.059982" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 77, 'CommittedTransactionsCount': 9, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 2, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.059776" elapsed="0.000234"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:41.060360" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.060165" elapsed="0.000220"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:41.060431" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:41.060683" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:40.795637" elapsed="0.265071"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:41.060768" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:49:41.060916" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:40.794696" elapsed="0.266244"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.061243" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.061023" elapsed="0.000277"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.061580" elapsed="0.000195"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.061324" elapsed="0.000489"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.061986" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.061836" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.061005" elapsed="0.001056"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:40.794452" elapsed="0.267634"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.064610" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.064213" elapsed="0.000427"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:41.064686" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:41.064836" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:41.063863" elapsed="0.000998"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.155762" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.155267" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:41.156844" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:41.156532" elapsed="0.000394">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:41.157025" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:41.156111" elapsed="0.000940"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.157674" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:41.157226" elapsed="0.000484"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:41.158029" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:41.158194" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:41.157881" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.158657" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.158384" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.159808" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.159523" elapsed="0.000330"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.160293" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.160019" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.160686" 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-04-10T00:49:41.160903" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.161082" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:41.160522" elapsed="0.000619"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.160374" elapsed="0.000798"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:41.161221" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:49:41.161394" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:41.159178" elapsed="0.002241"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.158803" elapsed="0.002650"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.161713" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.161479" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.158775" elapsed="0.003021"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.162400" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.161947" elapsed="0.000482"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:41.162476" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:41.154408" elapsed="0.008215"/>
</kw>
<msg time="2026-04-10T00:49:41.162683" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:41.140893" elapsed="0.021908"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.175822" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.189365" elapsed="0.000078"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.202292" elapsed="0.000068"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.203367" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.204188" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.204844" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.204687" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:41.204668" 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-04-10T00:49:41.205091" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.205280" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.205466" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:41.204607" elapsed="0.000987"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.204324" elapsed="0.001445"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.206505" elapsed="0.000052"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.206650" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:49:41.206919" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:41.133869" elapsed="0.073163"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:41.210185" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:41.209859" elapsed="0.000404">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:41.210562" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:41.209263" elapsed="0.001360"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.211191" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.210756" elapsed="0.000503"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.212206" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.211839" elapsed="0.000394"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.211300" elapsed="0.000979"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.210705" elapsed="0.001614"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.216017" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:41.213244" elapsed="0.002820"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:41.216145" elapsed="0.000068"/>
</return>
<msg time="2026-04-10T00:49:41.216470" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:41.208099" elapsed="0.008501"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:41.219460" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:41.219186" elapsed="0.000345">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:41.219878" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:41.218733" elapsed="0.001190"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:41.220313" elapsed="0.000080"/>
</return>
<status status="PASS" start="2026-04-10T00:49:41.220058" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.220006" elapsed="0.000494"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.221245" 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-04-10T00:49:41.222051" elapsed="0.000038"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.222163" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:49:41.224581" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:41.217523" elapsed="0.007166"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.228736" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.228305" elapsed="0.000533"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.229974" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.229591" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:41.249890" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:41.250869" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:41.251378" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:41.232401" elapsed="0.019038"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.230196" elapsed="0.021419"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.252379" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.251746" elapsed="0.000853"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.230145" elapsed="0.022538"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.260841" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.257210" elapsed="0.003977"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.256646" elapsed="0.004577"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.256539" elapsed="0.004710"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.263883" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.261592" elapsed="0.002338"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.261333" elapsed="0.002633"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.261313" elapsed="0.002677"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.264733" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.264217" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.265177" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.264879" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.266013" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.265502" elapsed="0.000554"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.265277" elapsed="0.000826"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.264856" elapsed="0.001274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.266803" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.266341" elapsed="0.000498"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.267257" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.266959" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.267879" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.267562" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.267353" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.266930" elapsed="0.001035"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:41.268150" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:41.269051" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.268740" elapsed="0.000338"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.269284" elapsed="0.002907"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:41.254481" elapsed="0.017868"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.272797" elapsed="0.000068"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:41.272506" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.272444" elapsed="0.000552"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:41.284091" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:41.274057" elapsed="0.010094"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:41.284245" elapsed="0.000084"/>
</return>
<msg time="2026-04-10T00:49:41.284682" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:41.225367" elapsed="0.059454"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:41.285343" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:49:41.285535" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:41.073486" elapsed="0.212131"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.286008" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.285711" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.285692" elapsed="0.000589"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:41.286327" 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="PASS" start="2026-04-10T00:49:41.069205" elapsed="0.217279"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.064930" elapsed="0.221629"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.064912" elapsed="0.221681"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.287333" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:41.287205" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:49:41.287575" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:49:41.287422" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.287185" elapsed="0.000503"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.287884" elapsed="0.000027"/>
</kw>
<msg time="2026-04-10T00:49:41.288031" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:41.286876" elapsed="0.001192"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.288800" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.288294" elapsed="0.000539"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.289667" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.289030" elapsed="0.000676"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.296951" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.296411" elapsed="0.000600"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.297782" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.297213" 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-04-10T00:49:41.319746" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:41.319910" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:41 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:41 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":76,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":76,"Leader":"member-2-shard-default-operational","LastIndex":77,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":77,"LastLogIndex":77,"LastLeadershipChangeTime":"2026-04-10 00:45:27.718","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"262.5 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":77,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":91398},"timestamp":1775782181,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:41.320144" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:41.311862" elapsed="0.008415"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.297917" elapsed="0.022684"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.320838" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.320642" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.297896" elapsed="0.023344"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.328794" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":76,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":76,"Leader":"member-2-shard-default-operational","LastIndex":77,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":77,"LastLogIndex":77,"LastLeadershipChangeTime":"2026-04-10 00:45:27.718","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"262.5 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":77,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":91398},"timestamp":1775782181,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.324708" elapsed="0.004262"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.323302" elapsed="0.005743"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.323273" elapsed="0.005830"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.334443" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.330661" elapsed="0.003934"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.329226" elapsed="0.005420"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.329199" elapsed="0.005497"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.336169" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.335344" elapsed="0.000888"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.336921" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.336408" elapsed="0.000607"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.338003" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.337399" elapsed="0.000653"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.337055" elapsed="0.001051"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.336386" elapsed="0.001758"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.339610" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.338814" elapsed="0.000860"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.340433" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.339936" elapsed="0.000590"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.341455" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.340932" elapsed="0.000574"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.340584" elapsed="0.001094"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.339913" elapsed="0.001810"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:41.341970" elapsed="0.000671"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:41.343476" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.342962" elapsed="0.000594"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.343858" elapsed="0.002802"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:41.322229" elapsed="0.024596"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.347029" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:41.346899" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.346880" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:41.350893" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:41.347251" elapsed="0.003672"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:41.350976" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:49:41.351141" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:41.290946" elapsed="0.060222"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:41.351270" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:41.351426" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:41.289984" elapsed="0.061470"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.352574" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578218...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.352081" elapsed="0.000524"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:41.352654" elapsed="0.000204"/>
</return>
<msg time="2026-04-10T00:49:41.353008" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578218...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:41.351726" elapsed="0.001309"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:41.353398" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 77, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.353194" elapsed="0.000232"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:41.353836" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.353601" elapsed="0.000261"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:41.353911" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:41.354067" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:41.063240" elapsed="0.290852"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:41.354150" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:41.354316" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:41.062435" elapsed="0.291907"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.354664" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.354424" elapsed="0.000470"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.355065" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.354918" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.355287" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.355144" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.354406" elapsed="0.000953"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:41.062260" elapsed="0.293123"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:40.516577" elapsed="0.838839"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:41.355458" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:41.355679" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:49:41.355726" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:49:40.512259" elapsed="0.843491"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.356198" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:49:41.356275" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:41.355927" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.356658" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.356368" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.356350" elapsed="0.000387"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.358903" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:49:41.356874" elapsed="0.002078"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:49:41.359346" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.359155" elapsed="0.000217"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:41.359420" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:49:40.509623" elapsed="0.849970"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:49:40.509367" elapsed="0.850274"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:49:38.679398" elapsed="2.680276"/>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:49:38.679009" elapsed="2.680721"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.364855" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:41.364446" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.365352" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:41.365046" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:41.365423" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:41.365596" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:41.364066" elapsed="0.001570"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:49:41.365795" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.366447" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:41.366113" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.366889" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:41.366649" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.367305" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:41.367066" elapsed="0.000264"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.369845" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.369472" elapsed="0.000400"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:41.369918" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:41.370068" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:41.369129" elapsed="0.000964"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.458913" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.458466" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:41.459778" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:41.459473" elapsed="0.000381">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:41.459955" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:41.459128" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.460536" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:41.460148" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:41.460891" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:41.461163" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:41.460744" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.461632" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.461352" 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-04-10T00:49:41.462757" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.462478" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.463236" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.462966" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.463613" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.463823" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.464000" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:41.463458" elapsed="0.000599"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.463315" elapsed="0.000773"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:41.464135" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:49:41.464302" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:41.462143" elapsed="0.002184"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.461799" elapsed="0.002560"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.464532" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.464383" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.461775" elapsed="0.002848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.465217" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.464770" elapsed="0.000476"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:41.465294" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:41.457783" elapsed="0.007637"/>
</kw>
<msg time="2026-04-10T00:49:41.465476" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:41.444859" elapsed="0.020748"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.478267" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.490750" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.503363" elapsed="0.000051"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.504270" 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-04-10T00:49:41.505243" 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-04-10T00:49:41.505894" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.505740" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:41.505720" 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-04-10T00:49:41.506138" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.506323" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.506508" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:41.505645" elapsed="0.000953"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.505371" elapsed="0.001269"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.507349" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.507470" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:49:41.507748" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:41.438267" elapsed="0.069592"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:41.510928" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:41.510613" elapsed="0.000390">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:41.511198" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:41.510066" elapsed="0.001177"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.511794" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.511376" elapsed="0.000487"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.512484" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.512182" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.511902" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.511323" elapsed="0.001409"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.515903" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:41.513479" elapsed="0.002565"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:41.516130" elapsed="0.000069"/>
</return>
<msg time="2026-04-10T00:49:41.516457" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:41.508886" elapsed="0.007935"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:41.519757" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:41.519451" elapsed="0.000379">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:41.520025" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:41.518993" elapsed="0.001077"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:41.520469" elapsed="0.000099"/>
</return>
<status status="PASS" start="2026-04-10T00:49:41.520214" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.520160" elapsed="0.000518"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.521599" elapsed="0.000042"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.522399" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.522510" elapsed="0.000134"/>
</return>
<msg time="2026-04-10T00:49:41.524871" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:41.517678" elapsed="0.007300"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.529142" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.528719" elapsed="0.000528"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.530419" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.530031" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:41.553217" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:41.554231" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:41.554761" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:41.532915" elapsed="0.021910"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.530736" elapsed="0.024235"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.555727" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.555078" elapsed="0.000819"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.530683" elapsed="0.025294"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.563377" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.559502" elapsed="0.004357"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.559167" elapsed="0.004745"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.559137" elapsed="0.004809"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.567367" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.564382" elapsed="0.003032"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.564062" elapsed="0.003387"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.564036" elapsed="0.003436"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.568116" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.567710" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.568478" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.568236" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.569080" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.568771" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.568606" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.568217" elapsed="0.000945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.569747" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.569343" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.570101" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.569867" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.570658" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.570341" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.570181" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.569847" elapsed="0.000893"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:41.570916" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:41.571776" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.571457" elapsed="0.000345"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.571978" elapsed="0.002497"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:41.557847" elapsed="0.016774"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.574974" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:41.574754" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.574703" elapsed="0.000422"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:41.584264" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:41.575874" elapsed="0.008447"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:41.584424" elapsed="0.000080"/>
</return>
<msg time="2026-04-10T00:49:41.584805" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:41.525688" elapsed="0.059226"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:41.585388" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:41.585584" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:41.378496" elapsed="0.207116"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.586059" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.585708" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.585689" elapsed="0.000634"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:41.586357" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:41.374285" elapsed="0.212201"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.370163" elapsed="0.216368"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.370144" elapsed="0.216430"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:49:41.587223" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:41.587113" elapsed="0.000170"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.587342" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:41.587306" elapsed="0.000074"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.587095" elapsed="0.000307"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.587583" elapsed="0.000024"/>
</kw>
<msg time="2026-04-10T00:49:41.587705" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:41.586816" elapsed="0.000915"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.588331" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.587916" elapsed="0.000442"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.589009" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.588516" elapsed="0.000523"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.595047" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.594571" elapsed="0.000528"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.595723" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.595258" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:41.616339" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:41.616510" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:41 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:41 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":40023,"Leader":"member-2-shard-inventory-config","LastIndex":40024,"RaftState":"Follower","LastApplied":40024,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:45:27.738","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"232.8 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3420},"timestamp":1775782181,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:41.617029" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:41.607448" elapsed="0.009691"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.595839" elapsed="0.021572"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.617682" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.617450" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.595820" elapsed="0.022264"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.627012" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":40023,"Leader":"member-2-shard-inventory-config","LastIndex":40024,"RaftState":"Follower","LastApplied":40024,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:45:27.738","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"232.8 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3420},"timestamp":1775782181,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.621152" elapsed="0.006043"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.619785" elapsed="0.007465"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.619756" elapsed="0.007537"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.631005" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.628309" elapsed="0.002800"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.627384" elapsed="0.003776"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.627363" elapsed="0.003836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.632705" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.631892" elapsed="0.000875"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.633416" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.632940" elapsed="0.000562"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.634444" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.633931" elapsed="0.000561"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.633540" elapsed="0.001016"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.632919" elapsed="0.001675"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.636001" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.635229" elapsed="0.000833"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.636802" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.636230" elapsed="0.000660"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.637838" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.637267" elapsed="0.000618"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.636928" elapsed="0.001008"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.636210" elapsed="0.001761"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:41.638206" elapsed="0.000657"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:41.639714" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.639176" elapsed="0.000600"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.640065" elapsed="0.002670"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:41.618685" elapsed="0.024217"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.643107" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:41.642978" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.642959" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:41.646944" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:41.643327" elapsed="0.003647"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:41.647026" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:49:41.647193" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:41.590039" elapsed="0.057181"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:41.647348" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:41.647504" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:41.589256" elapsed="0.058275"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.648743" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782181, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.648154" elapsed="0.000619"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:41.648823" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:41.649000" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782181, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:41.647795" elapsed="0.001233"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:41.649391" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 40024, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInit...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.649188" elapsed="0.000231"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:41.649832" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.649592" elapsed="0.000268"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:41.649908" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:41.650063" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:41.368505" elapsed="0.281583"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:41.650146" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:49:41.650293" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:41.367787" elapsed="0.282531"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.650634" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.650399" elapsed="0.000464"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.651034" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.650888" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.651255" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.651112" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.650382" elapsed="0.000945"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:41.367600" elapsed="0.283751"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.653847" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.653474" elapsed="0.000401"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:41.653920" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:41.654068" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:41.653129" elapsed="0.000964"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.740839" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.740403" elapsed="0.000470"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:41.741672" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:41.741393" elapsed="0.000356">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:41.741954" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:41.741049" elapsed="0.000931"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.742533" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:41.742147" elapsed="0.000493"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:41.742950" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:41.743104" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:41.742807" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.743535" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.743288" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.744630" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.744358" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.745113" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.744838" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.745474" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.745702" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.745906" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:41.745333" elapsed="0.000631"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.745191" elapsed="0.000805"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:41.746044" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:49:41.746213" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:41.744025" elapsed="0.002214"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.743682" elapsed="0.002589"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.746447" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.746296" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.743659" elapsed="0.002866"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.747133" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.746686" elapsed="0.000475"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:41.747210" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:41.739701" elapsed="0.007635"/>
</kw>
<msg time="2026-04-10T00:49:41.747391" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:41.726517" elapsed="0.020979"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.760645" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.773190" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.785776" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.786635" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.787408" 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-04-10T00:49:41.788011" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.787858" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:41.787839" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.788253" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.788440" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.788640" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:41.787784" elapsed="0.000933"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.787532" elapsed="0.001226"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.789462" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.789598" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:49:41.789841" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:41.720118" elapsed="0.069850"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:41.792937" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:41.792636" elapsed="0.000375">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:41.793200" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:41.792155" elapsed="0.001090"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.793787" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.793377" elapsed="0.000505"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.794497" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.794198" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.793925" elapsed="0.000661"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.793326" elapsed="0.001299"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.797803" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:41.795363" elapsed="0.002503"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:41.797946" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:49:41.798267" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:41.790972" elapsed="0.007401"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:41.801288" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:41.801032" elapsed="0.000320">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:41.801692" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:41.800468" elapsed="0.001271"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:41.802158" elapsed="0.000081"/>
</return>
<status status="PASS" start="2026-04-10T00:49:41.801906" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.801820" elapsed="0.000528"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.803104" 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-04-10T00:49:41.803887" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.803998" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:49:41.806321" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:41.799210" elapsed="0.007258"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.810339" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.809944" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.811578" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.811175" elapsed="0.000503"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:41.825185" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:41.825639" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:41.825846" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:41.814086" elapsed="0.011830"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.811809" elapsed="0.014164"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.826267" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.826017" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.811756" elapsed="0.014621"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.830793" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.828111" elapsed="0.003109"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.827884" elapsed="0.003374"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.827864" elapsed="0.003419"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.833949" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.831628" elapsed="0.002368"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.831365" elapsed="0.002665"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.831346" elapsed="0.002709"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.834661" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.834251" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.835021" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.834781" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.835618" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.835265" elapsed="0.000381"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.835103" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.834761" elapsed="0.000941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.836277" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.835884" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.836651" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.836395" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.837193" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.836894" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.836733" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.836376" elapsed="0.000899"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:41.837445" elapsed="0.000469"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:41.838402" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.838104" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.838633" elapsed="0.002426"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:41.827142" elapsed="0.014043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.841539" elapsed="0.000065"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:41.841317" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.841265" elapsed="0.000441"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:41.850865" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:41.842480" elapsed="0.008437"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:41.851001" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:49:41.851339" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:41.807150" elapsed="0.044298"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:41.852006" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:49:41.852188" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:41.662647" elapsed="0.189569"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.852593" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.852306" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.852287" elapsed="0.000546"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:41.852867" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:41.658413" elapsed="0.194586"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.654162" elapsed="0.198881"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.654144" elapsed="0.198923"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:49:41.853714" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:41.853605" elapsed="0.000170"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.853836" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:41.853799" elapsed="0.000099"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.853587" elapsed="0.000334"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.854076" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:49:41.854198" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:41.853305" elapsed="0.000918"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.854808" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.854400" elapsed="0.000435"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.855458" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.854991" elapsed="0.000496"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.861265" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.860807" elapsed="0.000508"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.861952" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.861472" elapsed="0.000525"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:41.881536" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:41.881695" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:41 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:41 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":20004,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":40023,"Leader":"member-2-shard-inventory-config","LastIndex":40024,"RaftState":"Leader","LastApplied":40024,"LastCommittedTransactionTime":"2026-04-10 00:49:17.580","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:45:27.728","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.494","active":true,"matchIndex":40024,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":40025},{"timeSinceLastActivity":"00:00:00.494","active":true,"matchIndex":40024,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":40025}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"781.0 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":2,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":6,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3458},"timestamp":1775782181,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:41.881936" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:41.873954" elapsed="0.008093"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.862067" elapsed="0.020238"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.882500" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.882339" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.862047" elapsed="0.020866"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.887813" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":20004,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":40023,"Leader":"member-2-shard-inventory-config","LastIndex":40024,"RaftState":"Leader","LastApplied":40024,"LastCommittedTransactionTime":"2026-04-10 00:49:17.580","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:45:27.728","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.494","active":true,"matchIndex":40024,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":40025},{"timeSinceLastActivity":"00:00:00.494","active":true,"matchIndex":40024,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":40025}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"781.0 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":2,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":6,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3458},"timestamp":1775782181,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.885079" elapsed="0.002853"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.884202" elapsed="0.003780"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.884183" elapsed="0.003838"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.891500" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:41.889004" elapsed="0.002704"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.888107" elapsed="0.003652"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.888088" elapsed="0.003710"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.893243" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.892444" elapsed="0.000868"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.893996" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.893485" elapsed="0.000599"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.894988" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.894458" elapsed="0.000577"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.894124" elapsed="0.000962"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.893464" elapsed="0.001658"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.896715" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.895906" elapsed="0.000869"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.897407" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.896943" elapsed="0.000550"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.898390" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.897875" elapsed="0.000561"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.897530" elapsed="0.000955"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.896923" elapsed="0.001596"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:41.898764" elapsed="0.000618"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:41.900209" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.899706" elapsed="0.000563"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.900703" elapsed="0.002498"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:41.883440" elapsed="0.019927"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:41.903594" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:41.903444" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.903424" elapsed="0.000243"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:41.907562" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:41.903817" elapsed="0.003776"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:41.907698" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:49:41.907871" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:41.856474" elapsed="0.051425"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:41.907958" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:41.908112" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:41.855734" elapsed="0.052405"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.909369" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782181, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:41.908860" elapsed="0.000539"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:41.909448" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:41.909648" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782181, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:41.908378" elapsed="0.001297"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:41.910083" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 40024, 'CommittedTransactionsCount': 2, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True,...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.909836" elapsed="0.000275"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:41.910470" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.910270" elapsed="0.000226"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:41.910558" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:41.910717" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:41.652483" elapsed="0.258259"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:41.910801" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:41.910952" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:41.651708" elapsed="0.259269"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.911278" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.911059" elapsed="0.000277"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:41.911583" elapsed="0.000191"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.911359" elapsed="0.000453"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:41.911983" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:41.911835" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.911041" elapsed="0.001018"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:41.651520" elapsed="0.260563"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:41.914517" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:41.914195" elapsed="0.000363"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:41.914606" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:41.914754" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:41.913820" elapsed="0.000958"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.001389" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.000998" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.002339" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:42.002078" elapsed="0.000341">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:42.002514" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:42.001706" elapsed="0.000833"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.003113" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:42.002725" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.003447" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:42.003621" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:42.003305" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.004052" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.003806" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.005102" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.004848" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.005592" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.005309" 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-04-10T00:49:42.005951" elapsed="0.000058"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.006193" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.006368" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:42.005813" elapsed="0.000612"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.005672" elapsed="0.000784"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:42.006503" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:49:42.006696" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:42.004501" elapsed="0.002220"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.004176" elapsed="0.002577"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.006926" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.006778" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.004152" elapsed="0.002849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.007603" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.007146" elapsed="0.000485"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:42.007680" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:42.000168" elapsed="0.007635"/>
</kw>
<msg time="2026-04-10T00:49:42.007858" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:41.987348" elapsed="0.020596"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.020616" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.033162" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.045818" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.046690" 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-04-10T00:49:42.047474" 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-04-10T00:49:42.048174" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.047940" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:42.047921" elapsed="0.000341"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.048428" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.048638" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.048826" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:42.047865" elapsed="0.001036"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.047622" elapsed="0.001321"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.049687" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.049811" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:49:42.050094" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:41.981101" elapsed="0.069106"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.053246" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:42.052950" elapsed="0.000371">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:42.053514" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:42.052442" elapsed="0.001135"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.054127" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.053711" elapsed="0.000484"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.054825" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.054511" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.054234" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.053659" elapsed="0.001279"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.058178" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:42.055773" elapsed="0.002451"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:42.058344" elapsed="0.000066"/>
</return>
<msg time="2026-04-10T00:49:42.058688" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:42.051240" elapsed="0.007556"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.061669" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:42.061392" elapsed="0.000347">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:42.061933" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:42.060953" elapsed="0.001025"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:42.062391" elapsed="0.000081"/>
</return>
<status status="PASS" start="2026-04-10T00:49:42.062136" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.062083" elapsed="0.000520"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.063349" elapsed="0.000038"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.064157" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.064266" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:49:42.066706" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:42.059822" elapsed="0.006994"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.070956" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.070529" elapsed="0.000529"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.072153" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.071775" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:42.090455" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:42.091451" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:42.091980" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:42.074709" elapsed="0.017334"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.072375" elapsed="0.019812"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.092937" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.092296" elapsed="0.000812"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.072324" elapsed="0.020864"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.100912" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.097157" elapsed="0.004128"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.096649" elapsed="0.004673"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.096601" elapsed="0.004746"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.104102" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.101675" elapsed="0.002475"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.101429" elapsed="0.002756"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.101410" elapsed="0.002798"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.104886" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.104419" elapsed="0.000494"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.105245" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.105006" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.105814" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.105488" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.105326" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.104987" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.106485" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.106121" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.106855" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.106621" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.107396" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.107096" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.106937" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.106601" elapsed="0.000879"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:42.107672" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:42.108512" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.108214" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.108745" elapsed="0.002472"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:42.094960" elapsed="0.016384"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.111717" elapsed="0.000055"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:42.111476" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.111424" elapsed="0.000450"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:42.121069" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:42.112644" elapsed="0.008475"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:42.121199" elapsed="0.000070"/>
</return>
<msg time="2026-04-10T00:49:42.121536" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:42.067493" elapsed="0.054171"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:42.122162" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:42.122343" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:41.923259" elapsed="0.199112"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.122744" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.122457" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.122440" elapsed="0.000539"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:42.123014" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:41.919057" elapsed="0.204086"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:41.914844" elapsed="0.208343"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:41.914827" elapsed="0.208384"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:49:42.123852" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:42.123741" elapsed="0.000172"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.123974" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:42.123936" elapsed="0.000078"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.123723" elapsed="0.000314"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.124185" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:49:42.124304" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:42.123444" elapsed="0.000886"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.124902" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.124506" elapsed="0.000423"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.125559" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.125086" elapsed="0.000504"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.131293" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.130851" elapsed="0.000491"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.131951" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.131498" elapsed="0.000498"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:42.150381" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:42.150520" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:42 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:42 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":40023,"Leader":"member-2-shard-inventory-config","LastIndex":40024,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":40024,"LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:45:27.737","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"281.2 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3458},"timestamp":1775782182,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:42.150991" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:42.143197" elapsed="0.007902"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.132064" elapsed="0.019293"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.151562" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.151387" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.132046" elapsed="0.019868"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.157804" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":40023,"Leader":"member-2-shard-inventory-config","LastIndex":40024,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":40024,"LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:45:27.737","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"281.2 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3458},"timestamp":1775782182,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.154015" elapsed="0.004014"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.153128" elapsed="0.005007"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.153109" elapsed="0.005087"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.163230" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.159719" elapsed="0.003611"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.158320" elapsed="0.005059"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.158292" elapsed="0.005125"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.164957" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.164174" elapsed="0.000845"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.165681" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.165187" elapsed="0.000585"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.166696" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.166165" elapsed="0.000578"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.165815" elapsed="0.000977"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.165166" elapsed="0.001662"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.168253" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.167466" elapsed="0.000849"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.169024" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.168485" elapsed="0.000626"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.169998" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.169482" elapsed="0.000593"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.169149" elapsed="0.000982"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.168465" elapsed="0.001701"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:42.170393" elapsed="0.000648"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:42.171890" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.171352" elapsed="0.000600"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.172235" elapsed="0.002641"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:42.152412" elapsed="0.022623"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.175234" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:42.175108" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.175089" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:42.179105" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:42.175451" elapsed="0.003684"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:42.179186" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:49:42.179350" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:42.126596" elapsed="0.052780"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:42.179468" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:42.179653" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:42.125809" elapsed="0.053871"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.180798" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782182, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.180262" elapsed="0.000565"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:42.180875" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:42.181051" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782182, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:42.179915" elapsed="0.001163"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:42.181437" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 40024, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInit...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.181236" elapsed="0.000228"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:42.181837" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.181636" elapsed="0.000226"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:42.181908" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:42.182081" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:41.913193" elapsed="0.268914"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:42.182166" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:49:42.182316" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:41.912425" elapsed="0.269915"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.182654" elapsed="0.000188"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.182420" elapsed="0.000460"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.183050" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.182904" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.183269" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.183127" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.182402" elapsed="0.000938"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:41.912253" elapsed="0.271111"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:41.367377" elapsed="0.816019"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:42.183440" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:42.183673" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:49:42.183720" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:49:41.363331" elapsed="0.820414"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.184200" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:49:42.184277" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:42.183931" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.184649" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.184368" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.184351" elapsed="0.000378"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.187655" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:49:42.184874" elapsed="0.002830"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:49:42.188106" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.187915" elapsed="0.000218"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:42.188181" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:49:41.360739" elapsed="0.827600"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:49:41.360497" elapsed="0.827889"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.192949" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:42.192535" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.193435" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:42.193136" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:42.193505" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:42.193678" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:42.192158" elapsed="0.001544"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:49:42.193857" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.194520" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:42.194191" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.194959" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:42.194723" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.195364" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:42.195132" elapsed="0.000257"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.197829" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.197489" elapsed="0.000367"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:42.197901" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:42.198048" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:42.197149" elapsed="0.000958"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.287368" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.286964" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.288203" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:42.287936" elapsed="0.000347">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:42.288375" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:42.287593" elapsed="0.000807"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.288970" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:42.288580" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.289300" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:42.289463" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:42.289160" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.289944" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.289670" 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-04-10T00:49:42.291101" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.290840" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.291604" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.291312" elapsed="0.000322"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.291966" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.292171" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.292349" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:42.291826" elapsed="0.000581"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.291686" elapsed="0.000751"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:42.292484" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:49:42.292669" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:42.290494" elapsed="0.002201"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.290172" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.292903" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.292751" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.290146" elapsed="0.002833"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.293579" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.293125" elapsed="0.000482"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:42.293655" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:42.286305" elapsed="0.007476"/>
</kw>
<msg time="2026-04-10T00:49:42.293834" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:42.273304" elapsed="0.020615"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.306674" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.319100" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.331722" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.332504" elapsed="0.000036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.333296" elapsed="0.000035"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.333881" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.333729" elapsed="0.000251"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:42.333713" elapsed="0.000291"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.334187" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.334380" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.334582" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:42.333662" elapsed="0.000998"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.333416" elapsed="0.001285"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.335416" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.335535" elapsed="0.000066"/>
</return>
<msg time="2026-04-10T00:49:42.335783" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:42.266757" elapsed="0.069137"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.338882" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:42.338623" elapsed="0.000327">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:42.339141" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:42.338115" elapsed="0.001070"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.339727" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.339319" elapsed="0.000476"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.340412" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.340111" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.339835" elapsed="0.000650"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.339267" elapsed="0.001256"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.343871" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:42.341322" elapsed="0.002595"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:42.343996" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:49:42.344317" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:42.336933" elapsed="0.007489"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.347264" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:42.347014" elapsed="0.000317">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:42.347522" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:42.346567" elapsed="0.001015"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:42.347968" elapsed="0.000082"/>
</return>
<status status="PASS" start="2026-04-10T00:49:42.347717" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.347665" elapsed="0.000493"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.348936" elapsed="0.000038"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.349952" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.350063" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:49:42.352385" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:42.345277" elapsed="0.007319"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.356638" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.356057" elapsed="0.000690"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.358036" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.357474" 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-04-10T00:49:42.378406" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:42.379443" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:42.380010" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:42.360441" elapsed="0.019635"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.358290" elapsed="0.021928"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.380988" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.380327" elapsed="0.000842"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.358239" elapsed="0.023015"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.391394" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.385684" elapsed="0.006051"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.385067" elapsed="0.006711"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.385016" elapsed="0.006788"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.394421" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.392112" elapsed="0.002357"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.391885" elapsed="0.002618"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.391866" elapsed="0.002662"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.395186" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.394792" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.395561" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.395306" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.396128" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.395816" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.395651" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.395286" elapsed="0.000928"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.396782" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.396397" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.397196" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.396901" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.397807" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.397463" elapsed="0.000371"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.397298" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.396883" elapsed="0.001008"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:42.398068" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:42.398955" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.398653" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.399157" elapsed="0.002304"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:42.383255" elapsed="0.018360"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.401975" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:42.401752" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.401700" elapsed="0.000427"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:42.411622" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:42.402929" elapsed="0.008748"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:42.411759" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:49:42.412101" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:42.353285" elapsed="0.058924"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:42.412696" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:42.412877" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:42.207862" elapsed="0.205043"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.413250" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.412991" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.412974" elapsed="0.000508"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:42.413518" 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="PASS" start="2026-04-10T00:49:42.203676" elapsed="0.210003"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.198180" elapsed="0.215543"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.198162" elapsed="0.215585"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:49:42.414392" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:42.414282" elapsed="0.000171"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.414515" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:42.414476" elapsed="0.000107"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.414264" elapsed="0.000343"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.414763" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:49:42.414883" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:42.413980" elapsed="0.000928"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.415460" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.415082" elapsed="0.000405"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.416122" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.415661" elapsed="0.000488"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.421908" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.421427" elapsed="0.000530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.422604" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.422114" elapsed="0.000535"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:42.442065" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:42.442285" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:42 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:42 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.806","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"241.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782182,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:42.442581" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:42.434247" elapsed="0.008487"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.422716" elapsed="0.020370"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.443352" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.443130" elapsed="0.000700"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.422698" elapsed="0.021169"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.450670" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.806","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"241.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782182,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.446829" elapsed="0.004072"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.445542" elapsed="0.005430"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.445517" elapsed="0.005510"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.455626" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.452390" elapsed="0.003337"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.451147" elapsed="0.004629"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.451120" elapsed="0.004694"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.457297" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.456456" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.458013" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.457526" elapsed="0.000575"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.459015" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.458494" elapsed="0.000567"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.458138" elapsed="0.000973"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.457506" elapsed="0.001640"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.460583" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.459801" elapsed="0.000846"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.461276" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.460813" elapsed="0.000559"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.462523" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.461794" elapsed="0.000797"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.461411" elapsed="0.001238"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.460793" elapsed="0.001891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:42.463074" elapsed="0.000680"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:42.464754" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.464068" elapsed="0.000749"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.465105" elapsed="0.002591"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:42.444574" elapsed="0.023291"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.468079" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:42.467945" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.467925" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:42.471994" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:42.468301" elapsed="0.003724"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:42.472079" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:49:42.472250" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:42.417115" elapsed="0.055162"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:42.472337" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:42.472491" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:42.416362" elapsed="0.056156"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.473887" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782182, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.473362" elapsed="0.000554"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:42.474036" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:42.474247" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782182, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:42.472963" elapsed="0.001313"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:42.474659" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.474438" elapsed="0.000250"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:42.475049" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.474848" elapsed="0.000229"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:42.475125" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:42.475280" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:42.196527" elapsed="0.278779"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:42.475365" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:49:42.475513" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:42.195821" elapsed="0.279718"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.475885" elapsed="0.000194"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.475662" elapsed="0.000455"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.476290" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.476141" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.476513" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.476368" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.475643" elapsed="0.001038"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:42.195653" elapsed="0.281053"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.479256" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.478919" elapsed="0.000364"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:42.479329" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:42.479476" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:42.478429" elapsed="0.001072"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.567022" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.566608" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.567995" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:42.567735" elapsed="0.000336">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:42.568165" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:42.567230" elapsed="0.000960"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.568761" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:42.568357" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.569092" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:42.569251" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:42.568951" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.569784" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.569511" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.570887" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.570629" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.571364" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.571095" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.571737" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.571943" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.572119" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:42.571599" elapsed="0.000578"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.571442" elapsed="0.000765"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:42.572254" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:49:42.572420" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:42.570254" elapsed="0.002192"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.569911" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.572667" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.572503" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.569887" elapsed="0.002858"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.573349" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.572907" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:42.573425" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:42.565849" elapsed="0.007716"/>
</kw>
<msg time="2026-04-10T00:49:42.573623" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:42.553060" elapsed="0.020666"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.586809" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.599297" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.611793" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.612628" 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-04-10T00:49:42.613408" 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-04-10T00:49:42.614085" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.613931" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:42.613912" 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-04-10T00:49:42.614462" 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-04-10T00:49:42.614704" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.614894" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:42.613856" elapsed="0.001113"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.613613" elapsed="0.001399"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.615755" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.615878" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:49:42.616129" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:42.546589" elapsed="0.069654"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.619345" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:42.619040" elapsed="0.000379">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:42.619631" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:42.618533" elapsed="0.001144"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.620209" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.619809" elapsed="0.000467"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.620929" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.620628" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.620318" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.619759" elapsed="0.001283"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.624440" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:42.621983" elapsed="0.002504"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:42.624707" elapsed="0.000068"/>
</return>
<msg time="2026-04-10T00:49:42.625034" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:42.617298" elapsed="0.007840"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.627909" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:42.627636" elapsed="0.000342">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:42.628168" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:42.627160" elapsed="0.001053"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:42.628692" elapsed="0.000079"/>
</return>
<status status="PASS" start="2026-04-10T00:49:42.628347" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.628294" elapsed="0.000584"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.629642" elapsed="0.000039"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.630430" elapsed="0.000038"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.630649" elapsed="0.000061"/>
</return>
<msg time="2026-04-10T00:49:42.632977" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:42.625989" elapsed="0.007099"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.637164" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.636749" elapsed="0.000518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.638388" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.637986" elapsed="0.000500"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:42.648586" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:42.649019" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:42.649240" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:42.640872" elapsed="0.008395"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.638637" elapsed="0.010686"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.649642" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.649369" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.638579" elapsed="0.011174"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.656085" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.652033" elapsed="0.004547"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.651703" elapsed="0.004932"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.651672" elapsed="0.004999"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.660597" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.657123" elapsed="0.003542"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.656789" elapsed="0.003927"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.656762" elapsed="0.003989"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.661624" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.661040" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.662148" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.661798" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.662900" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.662578" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.662266" elapsed="0.000695"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.661771" elapsed="0.001211"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.663521" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.663162" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.663906" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.663671" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.664444" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.664144" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.663985" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.663652" elapsed="0.000874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:42.664719" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:42.665568" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.665256" elapsed="0.000339"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.665780" elapsed="0.002427"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:42.650606" elapsed="0.017724"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.668694" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:42.668459" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.668408" elapsed="0.000437"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:42.678062" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:42.669596" elapsed="0.008515"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:42.678190" elapsed="0.000068"/>
</return>
<msg time="2026-04-10T00:49:42.678584" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:42.633790" elapsed="0.044905"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:42.679164" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:42.679343" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:42.488218" elapsed="0.191152"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.679720" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.679454" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.679437" elapsed="0.000509"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:42.679980" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:42.483967" elapsed="0.196140"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.479600" elapsed="0.200551"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.479580" elapsed="0.200596"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:49:42.680799" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:42.680693" elapsed="0.000166"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.680919" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:42.680882" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.680675" elapsed="0.000305"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.681127" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:49:42.681245" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:42.680407" elapsed="0.000862"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.681819" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.681435" elapsed="0.000411"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.682479" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.682002" elapsed="0.000506"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.688295" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.687854" elapsed="0.000489"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.688951" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.688499" elapsed="0.000497"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:42.707486" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:42.707874" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:42 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:42 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.797","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.231","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.231","active":true,"matchIndex":-1,"voting":true,"id":"member-3-shard-topology-config","nextIndex":0}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"338.4 μs","CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782182,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:42.708071" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:42.700519" elapsed="0.007661"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.689063" elapsed="0.019375"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.708641" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.708469" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.689045" elapsed="0.019941"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.715621" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.797","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.231","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.231","active":true,"matchIndex":-1,"voting":true,"id":"member-3-shard-topology-config","nextIndex":0}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"338.4 μs","CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782182,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.711406" elapsed="0.004389"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.710208" elapsed="0.005661"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.710190" elapsed="0.005735"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.720356" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.717540" elapsed="0.002917"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.716048" elapsed="0.004459"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.716021" elapsed="0.004546"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.721976" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.721209" elapsed="0.000830"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.722710" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.722207" elapsed="0.000592"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.723710" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.723174" elapsed="0.000582"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.722837" elapsed="0.000971"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.722187" elapsed="0.001656"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.725281" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.724469" elapsed="0.000873"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.725984" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.725507" elapsed="0.000563"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.726987" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.726472" elapsed="0.000563"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.726108" elapsed="0.000977"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.725487" elapsed="0.001633"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:42.727343" elapsed="0.000688"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:42.728950" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.728338" elapsed="0.000672"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.729295" elapsed="0.002475"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:42.709502" elapsed="0.022426"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.732126" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:42.732002" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.731984" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:42.736466" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:42.732340" elapsed="0.004160"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:42.736645" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:49:42.736869" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:42.683485" elapsed="0.053415"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:42.736969" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:49:42.737145" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:42.682756" elapsed="0.054419"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.738469" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782182, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.737875" elapsed="0.000627"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:42.738577" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:49:42.738786" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782182, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:42.737449" elapsed="0.001367"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:42.739254" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.739013" elapsed="0.000270"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:42.739675" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.739442" elapsed="0.000258"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:42.739748" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:42.739899" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:42.477802" elapsed="0.262122"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:42.739982" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:49:42.740135" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:42.477056" elapsed="0.263109"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.740523" elapsed="0.000097"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.740267" elapsed="0.000401"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.740945" elapsed="0.000227"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.740696" elapsed="0.000517"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.741420" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.741241" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.740244" elapsed="0.001264"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:42.476879" elapsed="0.264656"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.744068" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.743735" elapsed="0.000360"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:42.744140" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:42.744287" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:42.743361" elapsed="0.000950"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.830788" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.830359" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.831704" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:42.831433" elapsed="0.000347">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:42.831875" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:42.830992" elapsed="0.000909"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.832457" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:42.832069" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.832808" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:42.832960" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:42.832664" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.833393" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.833145" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.834439" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.834160" elapsed="0.000326"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.834933" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.834665" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.835290" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.835498" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.835698" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:42.835151" elapsed="0.000771"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.835012" elapsed="0.000940"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:42.836000" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:49:42.836166" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:42.833835" elapsed="0.002356"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.833513" elapsed="0.002711"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.836396" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.836248" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.833491" elapsed="0.002981"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.837070" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.836632" elapsed="0.000467"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:42.837147" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:42.829735" elapsed="0.007536"/>
</kw>
<msg time="2026-04-10T00:49:42.837326" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:42.817090" elapsed="0.020316"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.850086" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.862672" elapsed="0.000078"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.875163" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.875961" 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-04-10T00:49:42.876735" 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-04-10T00:49:42.877305" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.877155" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:42.877137" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.877561" 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-04-10T00:49:42.877753" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.877939" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:42.877085" elapsed="0.000931"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.876857" elapsed="0.001200"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.878833" elapsed="0.000037"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.878957" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:49:42.879208" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:42.810902" elapsed="0.068418"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.882388" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:42.882082" elapsed="0.000401">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:42.882700" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:42.881598" elapsed="0.001147"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.883291" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.882884" elapsed="0.000475"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.884013" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.883710" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.883399" elapsed="0.000689"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.882830" elapsed="0.001296"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.887655" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:42.885087" elapsed="0.002616"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:42.887782" elapsed="0.000067"/>
</return>
<msg time="2026-04-10T00:49:42.888105" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:42.880391" elapsed="0.007821"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:42.891161" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:42.890893" elapsed="0.000334">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:42.891417" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:42.890409" elapsed="0.001053"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:42.891882" elapsed="0.000081"/>
</return>
<status status="PASS" start="2026-04-10T00:49:42.891628" elapsed="0.000405"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.891570" elapsed="0.000502"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.892890" elapsed="0.000038"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.893676" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.893786" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:49:42.897515" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:42.889259" elapsed="0.008391"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.901619" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.901205" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.902858" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.902434" elapsed="0.000522"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:42.918928" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:42.919977" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:42.920541" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:42.905431" elapsed="0.015207"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.903086" elapsed="0.017688"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.921474" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.920879" elapsed="0.000817"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.903033" elapsed="0.018749"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.929686" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.925991" elapsed="0.004015"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.925422" elapsed="0.004620"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.925374" elapsed="0.004693"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.932734" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.930370" elapsed="0.002411"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.930146" elapsed="0.002670"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.930128" elapsed="0.002713"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.933423" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.933036" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.933800" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.933556" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.934355" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.934046" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.933882" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.933522" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.935032" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.934669" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.935388" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.935151" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.935956" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.935651" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.935470" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.935132" elapsed="0.000909"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:42.936214" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:42.937067" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.936772" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:42.937269" elapsed="0.002353"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:42.923683" elapsed="0.016063"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.940093" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:42.939876" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.939825" elapsed="0.000417"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:42.949572" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:42.940981" elapsed="0.008642"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:42.949701" elapsed="0.000067"/>
</return>
<msg time="2026-04-10T00:49:42.950027" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:42.898322" elapsed="0.051814"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:42.950641" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:42.950821" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:42.752814" elapsed="0.198033"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.951174" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.950933" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.950915" elapsed="0.000475"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:42.951425" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:42.748633" elapsed="0.202942"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.744377" elapsed="0.207242"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.744360" elapsed="0.207283"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:49:42.952249" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:42.952142" elapsed="0.000168"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:42.952371" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:42.952333" elapsed="0.000078"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.952124" elapsed="0.000310"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.952599" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:49:42.952721" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:42.951871" elapsed="0.000876"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.953286" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.952917" elapsed="0.000396"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.953950" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.953469" elapsed="0.000508"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.959867" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.959406" elapsed="0.000508"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.960497" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.960070" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:42.978662" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:42.978983" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:42 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:42 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.805","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"275.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782182,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:42.979181" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:42.971574" elapsed="0.007712"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.960627" elapsed="0.018910"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.979744" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.979584" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.960609" elapsed="0.019473"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.986103" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:45:27.805","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"275.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782182,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.982660" elapsed="0.003667"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.981760" elapsed="0.004640"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.981742" elapsed="0.004714"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.991438" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:42.987887" elapsed="0.003714"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.986620" elapsed="0.005051"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.986593" elapsed="0.005132"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.993857" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.992840" elapsed="0.001080"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.994597" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.994088" elapsed="0.000598"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.995591" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.995064" elapsed="0.000578"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.994725" elapsed="0.000969"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.994068" elapsed="0.001661"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.997420" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:42.996367" elapsed="0.001114"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:42.998256" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:42.997664" elapsed="0.000682"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:42.999448" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:42.998760" elapsed="0.000735"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:42.998385" elapsed="0.001176"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:42.997644" elapsed="0.001955"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:42.999827" elapsed="0.000627"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:43.001335" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.000831" elapsed="0.000565"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.001701" elapsed="0.002479"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:42.981059" elapsed="0.023289"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.004696" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:43.004423" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.004404" elapsed="0.000367"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:43.008403" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:43.004921" elapsed="0.003513"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:43.008487" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:49:43.008781" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:42.954984" elapsed="0.053825"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:43.008868" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:43.009022" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:42.954190" elapsed="0.054858"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.010155" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782182, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.009673" elapsed="0.000512"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:43.010304" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:43.010485" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782182, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:43.009290" elapsed="0.001271"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:43.010931" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.010725" elapsed="0.000233"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:43.011316" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.011116" elapsed="0.000225"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:43.011388" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:43.011555" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:42.742744" elapsed="0.268838"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:43.011641" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:43.011791" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:42.741955" elapsed="0.269861"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.012117" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.011899" elapsed="0.000448"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.012516" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.012371" elapsed="0.000292"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.012833" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.012688" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.011881" elapsed="0.001053"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:42.741753" elapsed="0.271220"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:42.195436" elapsed="0.817579"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:43.013067" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:43.013275" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:49:43.013321" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:49:42.191361" elapsed="0.821983"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.013814" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:49:43.013890" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:43.013520" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.014196" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.013981" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.013965" elapsed="0.000307"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.016584" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:49:43.014408" elapsed="0.002228"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:49:43.016988" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.016801" elapsed="0.000213"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:43.017061" elapsed="0.000027"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:49:42.188725" elapsed="0.828488"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:49:42.188478" elapsed="0.828782"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.021790" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:43.021380" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.022337" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:43.022030" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:43.022408" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:43.022605" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:43.021005" elapsed="0.001625"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:49:43.022786" elapsed="0.000157"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.023439" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:43.023105" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.023883" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:43.023639" elapsed="0.000270"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.024299" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:43.024060" elapsed="0.000265"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.026849" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.026463" elapsed="0.000413"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:43.026922" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:43.027070" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:43.026122" elapsed="0.000973"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.114059" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.113637" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:43.114928" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:43.114644" elapsed="0.000367">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:43.115105" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:43.114269" elapsed="0.000861"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.115699" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:43.115297" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:43.116033" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:43.116209" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:43.115890" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.116660" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.116394" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.117700" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.117424" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.118175" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.117909" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.118537" elapsed="0.000067"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.118792" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.118970" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:43.118399" elapsed="0.000756"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.118255" elapsed="0.000934"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:43.119239" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:49:43.119410" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:43.117101" elapsed="0.002333"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.116785" elapsed="0.002681"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.119663" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.119491" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.116762" elapsed="0.002981"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.120330" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.119890" elapsed="0.000468"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:43.120407" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:43.112949" elapsed="0.007583"/>
</kw>
<msg time="2026-04-10T00:49:43.120604" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:43.100022" elapsed="0.020670"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.133333" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.145805" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.158243" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.159091" 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-04-10T00:49:43.159931" elapsed="0.000039"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.160520" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.160366" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:43.160349" 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-04-10T00:49:43.160779" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.160967" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.161152" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:43.160295" elapsed="0.000933"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.160063" elapsed="0.001205"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.161993" elapsed="0.000083"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.162166" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:49:43.162404" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:43.093285" elapsed="0.069229"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:43.165602" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:43.165291" elapsed="0.000388">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:43.165872" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:43.164811" elapsed="0.001108"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.166445" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.166053" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.167203" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.166898" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.166568" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.166000" elapsed="0.001320"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.170614" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:43.168187" elapsed="0.002567"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:43.170840" elapsed="0.000068"/>
</return>
<msg time="2026-04-10T00:49:43.171172" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:43.163633" elapsed="0.007648"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:43.174118" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:43.173869" elapsed="0.000313">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:43.174375" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:43.173407" elapsed="0.001014"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:43.174916" elapsed="0.000080"/>
</return>
<status status="PASS" start="2026-04-10T00:49:43.174575" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.174503" elapsed="0.000602"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.175867" 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-04-10T00:49:43.176633" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.176742" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:49:43.178974" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:43.172279" elapsed="0.006804"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.182944" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.182505" elapsed="0.000537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.184145" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.183766" elapsed="0.000474"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:43.205155" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:43.205695" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:43.205913" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:43.186555" elapsed="0.019387"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.184365" elapsed="0.021646"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.206353" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.206064" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.184316" elapsed="0.022152"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.211125" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.208327" elapsed="0.003123"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.208090" elapsed="0.003396"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.208068" elapsed="0.003442"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.214122" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.211848" elapsed="0.002320"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.211620" elapsed="0.002582"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.211600" elapsed="0.002626"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.214880" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.214428" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.215239" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.215000" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.215866" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.215482" elapsed="0.000410"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.215320" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.214980" elapsed="0.000969"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.216497" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.216131" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.216869" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.216632" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.217411" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.217111" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.216950" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.216612" elapsed="0.000881"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:43.217687" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:43.218534" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.218229" elapsed="0.000346"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.218780" elapsed="0.002485"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:43.207310" elapsed="0.014084"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.221762" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:43.221524" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.221472" elapsed="0.000445"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:43.231144" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:43.222717" elapsed="0.008475"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:43.231271" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:49:43.231689" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:43.179756" elapsed="0.052039"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:43.232253" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:43.232434" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:43.035583" elapsed="0.196878"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.232810" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.232562" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.232530" elapsed="0.000498"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:43.233062" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:43.031352" elapsed="0.201838"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.027164" elapsed="0.206070"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.027146" elapsed="0.206113"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:49:43.233886" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:43.233780" elapsed="0.000166"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.234007" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:43.233969" elapsed="0.000078"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.233762" elapsed="0.000308"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.234218" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:49:43.234336" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:43.233491" elapsed="0.000870"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.234938" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.234531" elapsed="0.000434"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.235607" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.235124" elapsed="0.000511"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.241305" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.240865" elapsed="0.000488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.241974" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.241511" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:43.261052" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:43.261187" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:43 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-config","LastIndex":74,"RaftState":"Follower","LastApplied":74,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:45:27.706","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"364.7 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":10671},"timestamp":1775782183,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:43.261378" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:43.253196" elapsed="0.008286"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.242086" elapsed="0.019678"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.261954" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.261796" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.242068" elapsed="0.020221"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.267117" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-config","LastIndex":74,"RaftState":"Follower","LastApplied":74,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:45:27.706","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"364.7 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":10671},"timestamp":1775782183,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.264397" elapsed="0.002873"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.263532" elapsed="0.003787"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.263514" elapsed="0.003843"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.270810" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.268308" elapsed="0.002620"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.267440" elapsed="0.003538"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.267422" elapsed="0.003593"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.272429" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.271667" elapsed="0.000824"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.273199" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.272732" elapsed="0.000554"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.274181" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.273675" elapsed="0.000552"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.273324" elapsed="0.000953"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.272712" elapsed="0.001600"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.275763" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.275006" elapsed="0.000818"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.276632" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.276077" elapsed="0.000643"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.277599" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.277089" elapsed="0.000556"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.276758" elapsed="0.000938"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.275970" elapsed="0.001761"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:43.277957" elapsed="0.000635"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:43.279418" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.278924" elapsed="0.000555"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.279780" elapsed="0.002505"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:43.262854" elapsed="0.019590"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.282695" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:43.282516" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.282498" elapsed="0.000268"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:43.286457" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:43.282911" elapsed="0.003575"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:43.286537" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:49:43.286733" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:43.236594" elapsed="0.050165"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:43.286817" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:43.286966" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:43.235851" elapsed="0.051141"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.288039" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782183, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.287571" elapsed="0.000496"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:43.288155" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:43.288333" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782183, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:43.287216" elapsed="0.001144"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:43.288764" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 74, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.288518" elapsed="0.000273"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:43.289143" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.288946" elapsed="0.000222"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:43.289214" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:43.289367" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:43.025501" elapsed="0.263890"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:43.289450" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:49:43.289645" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:43.024781" elapsed="0.264890"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.289971" elapsed="0.000188"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.289753" elapsed="0.000444"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.290366" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.290221" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.290685" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.290444" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.289735" elapsed="0.001027"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:43.024605" elapsed="0.266182"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.293181" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.292859" elapsed="0.000349"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:43.293253" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:43.293400" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:43.292477" elapsed="0.000949"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.379638" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.379243" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:43.380426" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:43.380169" elapsed="0.000332">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:43.380610" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:43.379833" elapsed="0.000803"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.381186" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:43.380806" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:43.381508" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:43.381750" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:43.381373" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.382221" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.381976" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.383261" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.383006" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.383756" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.383466" 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-04-10T00:49:43.384113" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.384318" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.384491" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:43.383977" elapsed="0.000585"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.383835" elapsed="0.000759"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:43.384640" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:43.384801" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:43.382658" elapsed="0.002167"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.382336" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.385029" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.384882" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.382316" elapsed="0.002788"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.385689" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.385248" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:43.385765" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:43.378589" elapsed="0.007301"/>
</kw>
<msg time="2026-04-10T00:49:43.385945" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:43.365973" elapsed="0.020052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.398585" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.411258" elapsed="0.000052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.424008" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.424829" 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-04-10T00:49:43.425612" 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-04-10T00:49:43.426251" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.426097" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:43.426079" 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-04-10T00:49:43.426495" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.426699" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.426926" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:43.426025" elapsed="0.000978"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.425791" elapsed="0.001253"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.427774" elapsed="0.000039"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.427898" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:49:43.428141" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:43.359673" elapsed="0.068578"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:43.431246" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:43.430958" elapsed="0.000361">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:43.431513" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:43.430444" elapsed="0.001132"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.432103" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.431708" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.432802" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.432481" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.432209" elapsed="0.000667"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.431658" elapsed="0.001257"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.436118" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:43.433753" elapsed="0.002412"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:43.436243" elapsed="0.000163"/>
</return>
<msg time="2026-04-10T00:49:43.436680" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:43.429247" elapsed="0.007541"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:43.439643" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:43.439358" elapsed="0.000356">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:43.439910" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:43.438913" elapsed="0.001044"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:43.440353" elapsed="0.000083"/>
</return>
<status status="PASS" start="2026-04-10T00:49:43.440092" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.440040" elapsed="0.000523"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.441317" elapsed="0.000039"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.442267" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.442444" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:49:43.444796" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:43.437751" elapsed="0.007167"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.449008" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.448599" elapsed="0.000512"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.450382" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.450002" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:43.462730" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:43.463343" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:43.463652" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:43.452809" elapsed="0.010882"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.450625" elapsed="0.013144"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.464181" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.463831" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.450572" elapsed="0.013763"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.470504" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.466773" elapsed="0.004238"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.466414" elapsed="0.004649"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.466385" elapsed="0.004713"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.474852" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.471527" elapsed="0.003391"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.471212" elapsed="0.003755"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.471186" elapsed="0.003816"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.475832" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.475271" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.476330" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.475998" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.477137" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.476700" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.476445" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.475972" elapsed="0.001282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.478033" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.477505" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.478526" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.478196" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.479358" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.478935" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.478668" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.478170" elapsed="0.001304"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:43.479715" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:43.480568" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.480257" elapsed="0.000339"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.480773" elapsed="0.003790"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:43.465391" elapsed="0.019307"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.485050" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:43.484829" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.484778" elapsed="0.000424"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:43.494287" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:43.485955" elapsed="0.008383"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:43.494419" elapsed="0.000069"/>
</return>
<msg time="2026-04-10T00:49:43.494868" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:43.445762" elapsed="0.049215"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:43.495443" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:43.495639" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:43.301890" elapsed="0.193777"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.495997" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.495752" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.495735" elapsed="0.000480"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:43.496251" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:43.297679" elapsed="0.198699"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.293493" elapsed="0.202928"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.293475" elapsed="0.202971"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:49:43.497085" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:43.496980" elapsed="0.000165"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.497204" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:43.497168" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.496963" elapsed="0.000302"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.497410" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:49:43.497529" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:43.496711" elapsed="0.000860"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.498111" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.497744" elapsed="0.000393"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.498790" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.498291" elapsed="0.000529"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.504470" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.504027" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.505182" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.504747" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:43.523638" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:43.523773" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:43 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":21,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-config","LastIndex":74,"RaftState":"Leader","LastApplied":74,"LastCommittedTransactionTime":"2026-04-10 00:45:28.914","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:45:27.691","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.107","active":true,"matchIndex":74,"voting":true,"id":"member-1-shard-default-config","nextIndex":75},{"timeSinceLastActivity":"00:00:00.107","active":true,"matchIndex":74,"voting":true,"id":"member-3-shard-default-config","nextIndex":75}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"419.4 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":3,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":18,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":10671},"timestamp":1775782183,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:43.524142" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:43.516957" elapsed="0.007291"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.505294" elapsed="0.019208"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.524734" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.524534" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.505276" elapsed="0.019801"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.530058" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":21,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-config","LastIndex":74,"RaftState":"Leader","LastApplied":74,"LastCommittedTransactionTime":"2026-04-10 00:45:28.914","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:45:27.691","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.107","active":true,"matchIndex":74,"voting":true,"id":"member-1-shard-default-config","nextIndex":75},{"timeSinceLastActivity":"00:00:00.107","active":true,"matchIndex":74,"voting":true,"id":"member-3-shard-default-config","nextIndex":75}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"419.4 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":3,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":18,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":10671},"timestamp":1775782183,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.527357" elapsed="0.002816"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.526468" elapsed="0.003754"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.526450" elapsed="0.003810"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.534613" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.531250" elapsed="0.003502"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.530343" elapsed="0.004497"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.530324" elapsed="0.004570"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.537043" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.535786" elapsed="0.001342"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.538041" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.537361" elapsed="0.000804"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.539453" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.538707" elapsed="0.000811"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.538217" elapsed="0.001396"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.537333" elapsed="0.002330"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.541049" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.540291" elapsed="0.000821"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.541921" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.541278" elapsed="0.000735"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.542925" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.542384" elapsed="0.000589"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.542051" elapsed="0.000973"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.541258" elapsed="0.001801"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:43.543283" elapsed="0.000637"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:43.544741" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.544228" elapsed="0.000574"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.545087" elapsed="0.002656"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:43.525784" elapsed="0.022119"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.548102" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:43.547977" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.547958" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:43.551961" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:43.548315" elapsed="0.003675"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:43.552043" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:49:43.552243" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:43.499775" elapsed="0.052495"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:43.552328" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:43.552477" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:43.499034" elapsed="0.053469"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.553588" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782183, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.553092" elapsed="0.000526"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:43.553667" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:43.553848" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782183, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:43.552747" elapsed="0.001128"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:43.554238" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 74, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 3, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.554031" elapsed="0.000234"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:43.554635" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.554420" elapsed="0.000244"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:43.554712" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:43.554900" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:43.291876" elapsed="0.263049"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:43.554982" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:49:43.555128" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:43.291124" elapsed="0.264028"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.555447" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.555231" elapsed="0.000274"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.555750" elapsed="0.000188"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.555527" elapsed="0.000448"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.556142" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.555998" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.555215" elapsed="0.001002"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:43.290953" elapsed="0.265286"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.558744" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.558402" elapsed="0.000369"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:43.558831" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:43.558985" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:43.558062" elapsed="0.000947"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.645607" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.645174" elapsed="0.000468"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:43.646517" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:43.646243" elapsed="0.000377">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:43.646725" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:43.645819" elapsed="0.000931"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.647346" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:43.646958" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:43.647693" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:43.647859" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:43.647533" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.648289" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.648042" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.649316" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.649062" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.649811" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.649525" 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-04-10T00:49:43.650168" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.650374" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.650568" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:43.650031" elapsed="0.000597"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.649890" elapsed="0.000771"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:43.650710" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:49:43.650899" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:43.648737" elapsed="0.002188"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.648410" elapsed="0.002548"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.651131" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.650982" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.648387" elapsed="0.002821"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.651812" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.651353" elapsed="0.000488"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:43.651889" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:43.644552" elapsed="0.007463"/>
</kw>
<msg time="2026-04-10T00:49:43.652069" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:43.631630" elapsed="0.020521"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.665004" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.677742" elapsed="0.000079"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.690248" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.691050" 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-04-10T00:49:43.691819" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.692381" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.692232" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:43.692216" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.692639" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.692830" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.693027" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:43.692167" elapsed="0.000937"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.691943" elapsed="0.001201"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.693896" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.694015" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:49:43.694239" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:43.625422" elapsed="0.068933"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:43.697322" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:43.697060" elapsed="0.000328">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:43.697597" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:43.696507" elapsed="0.001136"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.698162" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.697773" elapsed="0.000457"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.698879" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.698556" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.698270" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.697723" elapsed="0.001269"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.702184" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:43.699749" elapsed="0.002480"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:43.702305" elapsed="0.000172"/>
</return>
<msg time="2026-04-10T00:49:43.702758" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:43.695394" elapsed="0.007499"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:43.705693" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:43.705434" elapsed="0.000323">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:43.705947" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:43.704995" elapsed="0.000997"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:43.706370" elapsed="0.000079"/>
</return>
<status status="PASS" start="2026-04-10T00:49:43.706123" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.706072" elapsed="0.000501"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.707344" 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-04-10T00:49:43.708123" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.708234" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:49:43.710554" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:43.703775" elapsed="0.006890"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.714586" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.714180" elapsed="0.000508"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.715836" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.715428" elapsed="0.000506"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:43.734378" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:43.735365" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:43.735849" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:43.718262" elapsed="0.017647"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.716063" elapsed="0.019969"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.736729" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.736131" elapsed="0.000767"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.716011" elapsed="0.020967"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.744176" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.740412" elapsed="0.004255"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.740098" elapsed="0.004621"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.740069" elapsed="0.004685"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.748475" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.745190" elapsed="0.003351"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.744868" elapsed="0.003741"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.744841" elapsed="0.003803"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.749440" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.748908" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.750029" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.749683" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.750842" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.750370" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.750146" elapsed="0.000824"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.749646" elapsed="0.001356"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.751809" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.751261" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.752164" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.751928" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.752745" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.752403" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.752245" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.751909" elapsed="0.000919"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:43.752999" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:43.753855" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.753537" elapsed="0.000344"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.754057" elapsed="0.002425"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:43.738675" elapsed="0.017951"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.756972" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:43.756755" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.756705" elapsed="0.000414"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:43.766290" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:43.757873" elapsed="0.008466"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:43.766417" elapsed="0.000068"/>
</return>
<msg time="2026-04-10T00:49:43.766762" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:43.711370" elapsed="0.055502"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:43.767377" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:43.767570" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:43.567468" elapsed="0.200130"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.767923" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.767683" elapsed="0.000433"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.767666" elapsed="0.000477"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:43.768176" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:43.563246" elapsed="0.205057"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.559076" elapsed="0.209272"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.559059" elapsed="0.209313"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:49:43.769044" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:43.768939" elapsed="0.000165"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.769163" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:43.769127" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.768921" elapsed="0.000303"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.769371" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:49:43.769490" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:43.768666" elapsed="0.000849"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.770078" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.769708" elapsed="0.000397"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.770736" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.770261" elapsed="0.000504"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.776530" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.776096" elapsed="0.000512"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.777190" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.776764" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:43.794523" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:43.794690" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:43 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-config","LastIndex":74,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":74,"LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:45:27.707","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"300.8 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":10671},"timestamp":1775782183,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:43.794881" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:43.788298" elapsed="0.006725"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.777300" elapsed="0.017976"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.795461" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.795306" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.777282" elapsed="0.018603"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.802864" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-config","LastIndex":74,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":74,"LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:45:27.707","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"300.8 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":10671},"timestamp":1775782183,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.799178" elapsed="0.003948"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.797519" elapsed="0.005677"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.797493" elapsed="0.005757"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.808035" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.804600" elapsed="0.003662"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.803365" elapsed="0.004950"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.803339" elapsed="0.005015"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.809842" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.809009" elapsed="0.000896"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.810556" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.810072" elapsed="0.000573"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.811567" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.811048" elapsed="0.000567"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.810691" elapsed="0.000977"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.810053" elapsed="0.001648"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.813092" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.812332" elapsed="0.000820"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.813871" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.813320" elapsed="0.000640"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.814850" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.814334" elapsed="0.000562"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.813999" elapsed="0.000977"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.813300" elapsed="0.001713"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:43.815240" elapsed="0.000647"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:43.816749" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.816205" elapsed="0.000607"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.817101" elapsed="0.002589"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:43.796570" elapsed="0.023286"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.820062" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:43.819933" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.819914" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:43.823924" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:43.820283" elapsed="0.003670"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:43.824005" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:49:43.824171" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:43.771756" elapsed="0.052442"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:43.824255" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:43.824407" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757821...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:43.771000" elapsed="0.053433"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.825521" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782183, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:43.825044" elapsed="0.000830"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:43.825976" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:43.826161" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782183, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:43.824682" elapsed="0.001507"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:43.826575" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 74, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.826351" elapsed="0.000253"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:43.826991" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.826765" elapsed="0.000252"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:43.827064" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:43.827221" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:43.557442" elapsed="0.269804"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:43.827303" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:43.827455" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:43.556655" elapsed="0.270826"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.827797" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:43.827577" elapsed="0.000448"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.828196" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.828049" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.828417" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.828274" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.827558" elapsed="0.000933"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:43.556401" elapsed="0.272115"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:43.024378" elapsed="0.804185"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:43.828609" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:43.828818" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:49:43.828865" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:49:43.020267" elapsed="0.808622"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.829336" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:49:43.829413" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:43.829067" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.829757" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.829507" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.829490" elapsed="0.000344"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.832012" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:49:43.829973" elapsed="0.002087"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:49:43.832411" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.832224" elapsed="0.000213"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:43.832483" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:49:43.017653" elapsed="0.815002"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:49:43.017354" elapsed="0.815348"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:49:41.360363" elapsed="2.472370"/>
</for>
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:49:41.359971" elapsed="2.472819"/>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:49:38.656965" elapsed="5.175924"/>
</kw>
<kw name="Set DPN And Flow Count In Json Add" owner="BulkomaticKeywords">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:43.833802" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_add_bulk_flow_config.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_add_bulk_flow_config.json&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:43.833957" level="INFO">${body} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true",...</msg>
<var>${body}</var>
<arg>/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/openflowplugin/${json_config}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:43.833648" elapsed="0.000336"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.834424" level="INFO">${get_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.834163" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.834932" level="INFO">${put_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "${dpn_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.834638" elapsed="0.000342"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:49:43.835423" level="INFO">${str} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true",...</msg>
<var>${str}</var>
<arg>${body}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.835160" elapsed="0.000290"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.835900" level="INFO">${get_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "1000"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.835644" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.836393" level="INFO">${put_string} = "sal-bulk-flow:flows-per-dpn" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.836102" elapsed="0.000317"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:49:43.836872" level="INFO">${json_body_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true"...</msg>
<var>${json_body_add}</var>
<arg>${str}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.836612" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.837328" level="INFO">${get_string} = "sal-bulk-flow:batch-size" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:batch-size" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.837079" elapsed="0.000275"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.837838" level="INFO">${put_string} = "sal-bulk-flow:batch-size" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:batch-size" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.837530" elapsed="0.000334"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:49:43.838298" level="INFO">${json_body_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "t...</msg>
<var>${json_body_add}</var>
<arg>${json_body_add}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.838039" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.838756" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${json_body_add}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.838499" elapsed="0.000302"/>
</kw>
<return>
<value>${json_body_add}</value>
<status status="PASS" start="2026-04-10T00:49:43.838843" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:43.839041" level="INFO">${temp_json_config_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "t...</msg>
<var>${temp_json_config_add}</var>
<arg>${orig_json_config_add}</arg>
<arg>${switch_count}</arg>
<arg>${flow_count_per_switch}</arg>
<doc>Set new DPN count and flows count per DPN in the Bulkomatic Add json file.</doc>
<status status="PASS" start="2026-04-10T00:49:43.833164" elapsed="0.005904"/>
</kw>
<kw name="Set DPN And Flow Count In Json Get" owner="BulkomaticKeywords">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:43.839900" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_get_bulk_flow_config.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_get_bulk_flow_config.json&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:43.840023" level="INFO">${body} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-t...</msg>
<var>${body}</var>
<arg>/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/openflowplugin/${json_config}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:43.839758" elapsed="0.000292"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.840482" level="INFO">${get_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.840225" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.841025" level="INFO">${put_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "${dpn_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.840730" elapsed="0.000321"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:49:43.841489" level="INFO">${str} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-t...</msg>
<var>${str}</var>
<arg>${body}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.841227" elapsed="0.000288"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.841959" level="INFO">${get_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "1000"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.841708" elapsed="0.000276"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.842442" level="INFO">${put_string} = "sal-bulk-flow:flows-per-dpn" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.842156" elapsed="0.000311"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:49:43.842914" level="INFO">${json_body_get} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-...</msg>
<var>${json_body_get}</var>
<arg>${str}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.842658" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.843376" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${json_body_get}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.843134" elapsed="0.000288"/>
</kw>
<return>
<value>${json_body_get}</value>
<status status="PASS" start="2026-04-10T00:49:43.843463" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:43.843639" level="INFO">${temp_json_config_get} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-...</msg>
<var>${temp_json_config_get}</var>
<arg>${orig_json_config_get}</arg>
<arg>${switch_count}</arg>
<arg>${flow_count_after_add}</arg>
<doc>Set new DPN count and flows count per DPN in the Bulkomatic Get json file.</doc>
<status status="PASS" start="2026-04-10T00:49:43.839332" elapsed="0.004334"/>
</kw>
<kw name="Set DPN And Flow Count In Json Del" owner="BulkomaticKeywords">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:43.844495" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_del_bulk_flow_config.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_del_bulk_flow_config.json&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:43.844633" level="INFO">${body} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true"...</msg>
<var>${body}</var>
<arg>/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/openflowplugin/${json_config}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:43.844353" elapsed="0.000307"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.845107" level="INFO">${get_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.844850" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.845610" level="INFO">${put_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "${dpn_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.845305" elapsed="0.000332"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:49:43.846068" level="INFO">${str} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true"...</msg>
<var>${str}</var>
<arg>${body}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.845811" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.846524" level="INFO">${get_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "1000"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.846271" elapsed="0.000294"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.847234" level="INFO">${put_string} = "sal-bulk-flow:flows-per-dpn" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.846742" elapsed="0.000518"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:49:43.847715" level="INFO">${json_body_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true...</msg>
<var>${json_body_del}</var>
<arg>${str}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.847437" elapsed="0.000306"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.848175" level="INFO">${get_string} = "sal-bulk-flow:batch-size" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:batch-size" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.847920" elapsed="0.000281"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.848694" level="INFO">${put_string} = "sal-bulk-flow:batch-size" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:batch-size" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:43.848380" elapsed="0.000340"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:49:43.849192" level="INFO">${json_body_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "...</msg>
<var>${json_body_del}</var>
<arg>${json_body_del}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.848929" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.849652" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${json_body_del}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.849391" elapsed="0.000308"/>
</kw>
<return>
<value>${json_body_del}</value>
<status status="PASS" start="2026-04-10T00:49:43.849741" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:43.849899" level="INFO">${temp_json_config_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "...</msg>
<var>${temp_json_config_del}</var>
<arg>${orig_json_config_del}</arg>
<arg>${switch_count}</arg>
<arg>${flow_count_per_switch}</arg>
<doc>Set new DPN count and flows count per DPN in the Bulkomatic Del json file.</doc>
<status status="PASS" start="2026-04-10T00:49:43.843942" elapsed="0.005984"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.850430" level="INFO">${temp_json_config_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "t...</msg>
<arg>${temp_json_config_add}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:43.850116" elapsed="0.000357"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.851000" level="INFO">${temp_json_config_get} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-...</msg>
<arg>${temp_json_config_get}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:43.850668" elapsed="0.000376"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.851523" level="INFO">${temp_json_config_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "...</msg>
<arg>${temp_json_config_del}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:43.851221" elapsed="0.000361"/>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:49:38.236772" elapsed="5.614919"/>
</test>
<test id="s1-s2-t2" name="Get Inventory Follower Before Leader Restart" line="49">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:49:43.854818" elapsed="0.000242"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:49:43.854552" elapsed="0.000561"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.856112" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:43.856003" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.855984" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.861126" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:43.861022" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.861004" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.862192" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:43.861814" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.862699" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:43.862380" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:43.862770" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:43.862925" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:43.861420" elapsed="0.001565"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.868637" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:43.868514" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.868496" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.869875" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:43.869770" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.869753" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:43.870381" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.870088" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:43.870840" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:43.870619" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:43.908116" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:43.871404" elapsed="0.036816"/>
</kw>
<msg time="2026-04-10T00:49:43.908382" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:43.908429" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:43.871060" elapsed="0.037407"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:43.986627" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:43.909011" elapsed="0.077782"/>
</kw>
<msg time="2026-04-10T00:49:43.986974" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:43.987041" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:43.908666" elapsed="0.078414"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.987450" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.987177" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.987152" elapsed="0.000381"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:43.988045" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:43.987712" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.988422" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.988203" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.988186" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:43.988533" elapsed="0.000057"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:43.990069" elapsed="0.000783"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:43.991168" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:43.991929" elapsed="0.000361"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:43.989414" elapsed="0.002977"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:43.988862" elapsed="0.003594"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:43.869441" elapsed="0.123138"/>
</kw>
<msg time="2026-04-10T00:49:43.992676" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:43.992723" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:43.868861" elapsed="0.123901"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:43.992947" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:43.992840" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.992822" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.993434" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.993789" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:43.993913" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:43.868171" elapsed="0.125857"/>
</kw>
<msg time="2026-04-10T00:49:43.994126" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:43.994171" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:43.863360" elapsed="0.130848"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:43.994535" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:43.994285" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:43.994268" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:43.863216" elapsed="0.131437"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.000518" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:44.000412" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.000394" 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-04-10T00:49:44.001846" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:44.001739" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.001722" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:44.002351" level="INFO">${karaf_connection_index} = 90</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.002057" elapsed="0.000321"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:44.002767" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:44.002536" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:44.033110" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:44.003315" elapsed="0.029914"/>
</kw>
<msg time="2026-04-10T00:49:44.033403" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:44.033449" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:44.002953" elapsed="0.030533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:44.110355" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:44.034066" elapsed="0.076443"/>
</kw>
<msg time="2026-04-10T00:49:44.110706" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:44.110754" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:44.033702" elapsed="0.077090"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.111156" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.110883" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.110858" elapsed="0.000384"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.111725" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.111390" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.112108" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.111887" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.111869" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:44.112221" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:44.113785" elapsed="0.000812"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.115024" elapsed="0.000541"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:44.115839" 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-04-10T00:49:44.113116" elapsed="0.003184"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:44.112521" elapsed="0.003843"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:44.001416" elapsed="0.115049"/>
</kw>
<msg time="2026-04-10T00:49:44.116576" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:44.116623" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:44.000858" elapsed="0.115803"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:44.117022" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:44.116739" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.116721" elapsed="0.000385"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.117504" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.118037" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.118109" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:44.000070" elapsed="0.118148"/>
</kw>
<msg time="2026-04-10T00:49:44.118314" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:44.118358" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:43.994925" elapsed="0.123470"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.118740" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.118471" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.118454" elapsed="0.000365"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:43.994781" elapsed="0.124061"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.124465" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:44.124357" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.124339" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.125696" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:44.125585" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.125566" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:44.126228" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.125912" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:44.126645" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:44.126412" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:44.162421" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:44.127194" elapsed="0.035334"/>
</kw>
<msg time="2026-04-10T00:49:44.162717" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:44.162763" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:44.126831" elapsed="0.035969"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:44.253796" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:44.163339" elapsed="0.090699"/>
</kw>
<msg time="2026-04-10T00:49:44.254219" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:44.254266" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:44.162974" elapsed="0.091331"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.254688" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.254399" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.254373" elapsed="0.000403"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.255313" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.254940" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.255723" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.255478" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.255459" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:44.255837" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:44.257331" elapsed="0.000782"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.258423" elapsed="0.000532"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:44.259294" elapsed="0.000391"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:44.256707" elapsed="0.003081"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:44.256145" elapsed="0.003735"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:44.125264" elapsed="0.134735"/>
</kw>
<msg time="2026-04-10T00:49:44.260107" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:44.260156" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:44.124707" elapsed="0.135493"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:44.260415" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:49:44.260292" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.260270" 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 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.261022" 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-04-10T00:49:44.261425" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.261510" elapsed="0.000030"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:44.124012" elapsed="0.137676"/>
</kw>
<msg time="2026-04-10T00:49:44.261996" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:44.262049" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:44.119146" elapsed="0.142946"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.262495" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.262187" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.262166" elapsed="0.000430"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:44.118973" elapsed="0.143647"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:43.863042" elapsed="0.399614"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:49:43.860666" elapsed="0.402053"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:49:43.855717" elapsed="0.407107"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:43.855265" elapsed="0.407633"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:49:43.852434" elapsed="0.410534"/>
</kw>
<kw name="Get InventoryConfig Shard Status" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.272692" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:44.272277" elapsed="0.000443"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.273205" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:44.272894" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:44.273277" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:44.273433" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:44.271838" elapsed="0.001620"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:49:44.273631" elapsed="0.000172"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.274321" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:44.273980" elapsed="0.000384"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.274852" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:44.274566" elapsed="0.000319"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.275395" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:44.275043" elapsed="0.000382"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.278534" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.278112" elapsed="0.000483"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:44.278663" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:49:44.278881" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:44.277606" elapsed="0.001319"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.364925" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.364485" elapsed="0.000470"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:44.365783" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:44.365461" elapsed="0.000401">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:44.365957" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:44.365123" elapsed="0.000858"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.366588" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:44.366165" elapsed="0.000452"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:44.366920" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:44.367079" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:44.366781" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.367572" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.367297" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.368666" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.368379" elapsed="0.000332"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.369143" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.368874" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.369522" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.369769" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.369947" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:44.369356" elapsed="0.000649"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.369219" elapsed="0.000829"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:44.370094" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:44.370257" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:44.368043" elapsed="0.002238"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.367734" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.370488" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.370339" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.367713" elapsed="0.002867"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.371163" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.370725" elapsed="0.000466"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:44.371329" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:44.363800" elapsed="0.007714"/>
</kw>
<msg time="2026-04-10T00:49:44.371614" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:44.350093" elapsed="0.021663"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.385577" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.399419" elapsed="0.000057"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.413143" elapsed="0.000054"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.413537" elapsed="0.000091"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.413880" elapsed="0.000075"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.414697" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.414451" elapsed="0.000361"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:44.414423" elapsed="0.000431"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.415138" elapsed="0.000035"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.415496" 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-04-10T00:49:44.415829" elapsed="0.000036"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:44.414358" elapsed="0.001554"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.414099" elapsed="0.001885"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.416313" elapsed="0.000075"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.416594" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:49:44.416782" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:44.339431" elapsed="0.077377"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:44.418849" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:44.418488" elapsed="0.000427">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:44.419075" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:44.417706" elapsed="0.001409"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.420514" elapsed="0.000094"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.419282" elapsed="0.001381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.421501" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.421009" elapsed="0.000552"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.420702" elapsed="0.000911"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.419261" elapsed="0.002388"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.424891" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:44.421852" elapsed="0.003079"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:44.425067" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:49:44.425312" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:44.417208" elapsed="0.008130"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:44.427350" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:44.427015" elapsed="0.000400">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:44.427593" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:44.426200" elapsed="0.001435"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:44.428081" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:49:44.427783" elapsed="0.000438"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.427763" elapsed="0.000497"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.428458" elapsed="0.000074"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.428815" elapsed="0.000073"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.429018" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:49:44.443586" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:44.425722" elapsed="0.017898"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.446389" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.445730" elapsed="0.000807"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.447716" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.447062" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:44.466885" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:44.467530" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:44.468024" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:44.451385" elapsed="0.016705"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.447991" elapsed="0.020180"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.469788" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.468230" elapsed="0.001707"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.447968" elapsed="0.022020"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.477275" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.473368" elapsed="0.004487"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.472935" elapsed="0.005008"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.472891" elapsed="0.005120"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.481318" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.478604" elapsed="0.002772"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.478163" elapsed="0.003274"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.478120" elapsed="0.003366"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.482520" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.481964" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.483011" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.482693" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.483743" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.483386" elapsed="0.000384"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.483139" elapsed="0.000691"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.482662" elapsed="0.001214"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.484767" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.484225" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.485236" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.484923" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.485909" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.485598" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.485363" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.484892" elapsed="0.001148"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:44.486366" elapsed="0.000499"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:44.487718" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.487219" elapsed="0.000545"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.488118" elapsed="0.002501"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:44.471166" elapsed="0.019534"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.491083" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:44.490869" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.490848" elapsed="0.000408"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:44.502243" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:44.491477" elapsed="0.010812"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:44.502427" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:49:44.502692" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:44.444104" elapsed="0.058616"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:44.502792" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:44.502946" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:44.296049" elapsed="0.206924"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.503332" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.503058" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.503041" elapsed="0.000431"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:44.503506" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:44.286139" elapsed="0.217513"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.279024" elapsed="0.224674"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.278999" elapsed="0.224723"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:49:44.504326" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:44.504219" elapsed="0.000168"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.504448" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:44.504411" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.504201" elapsed="0.000309"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.504741" elapsed="0.000024"/>
</kw>
<msg time="2026-04-10T00:49:44.504865" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:44.503952" elapsed="0.000939"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.505427" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.505059" elapsed="0.000394"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.506176" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.505707" elapsed="0.000497"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.511935" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.511663" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.512399" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.512138" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:44.521917" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:44.522066" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:44 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":40023,"Leader":"member-2-shard-inventory-config","LastIndex":40024,"RaftState":"Follower","LastApplied":40024,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:45:27.738","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"234.7 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3420},"timestamp":1775782184,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:44.522277" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:44.514568" elapsed="0.007746"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.512510" elapsed="0.009865"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.522646" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.522411" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.512492" elapsed="0.010275"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.528806" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":40023,"Leader":"member-2-shard-inventory-config","LastIndex":40024,"RaftState":"Follower","LastApplied":40024,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:45:27.738","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"234.7 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3420},"timestamp":1775782184,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.524695" elapsed="0.004395"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.524256" elapsed="0.004963"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.524230" elapsed="0.005028"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.533578" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.529795" elapsed="0.003968"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.529341" elapsed="0.004546"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.529317" elapsed="0.004608"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.535086" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.534271" elapsed="0.000854"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.536112" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.535272" elapsed="0.001019"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.537537" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.536814" elapsed="0.000782"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.536318" elapsed="0.001379"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.535245" elapsed="0.002476"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.538430" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.537886" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.539224" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.538575" elapsed="0.000846"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.540715" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.539986" elapsed="0.000771"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.539453" elapsed="0.001403"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.538541" elapsed="0.002340"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:44.541036" elapsed="0.000733"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:44.542498" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.541984" elapsed="0.000541"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.542738" elapsed="0.002853"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:44.523511" elapsed="0.022175"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.545866" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:44.545758" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.545739" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:44.561944" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:44.546079" elapsed="0.015895"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:44.562027" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:49:44.562191" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:44.507319" elapsed="0.054898"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:44.562325" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:44.562481" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:44.506420" elapsed="0.056087"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.563872" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782184, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.563117" elapsed="0.000784"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:44.563951" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:44.564127" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782184, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:44.562761" elapsed="0.001393"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:44.564522" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 40024, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInit...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.564312" elapsed="0.000253"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:44.564924" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.564723" elapsed="0.000226"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:44.564996" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:44.565150" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:44.276703" elapsed="0.288471"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:44.565233" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:49:44.565382" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:44.275946" elapsed="0.289460"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.565723" elapsed="0.000191"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.565489" elapsed="0.000462"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.566130" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.565975" elapsed="0.000208"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.566348" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.566206" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.565472" elapsed="0.000949"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:44.275709" elapsed="0.290736"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.569153" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.568853" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:44.569226" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:44.569380" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:44.568494" elapsed="0.000910"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.642862" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.642444" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:44.643692" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:44.643422" elapsed="0.000348">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:44.643912" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:44.643057" elapsed="0.000881"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.644512" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:44.644107" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:44.644872" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:44.645092" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:44.644725" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.645524" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.645278" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.646559" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.646288" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.647089" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.646806" elapsed="0.000325"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.647518" elapsed="0.000044"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.647755" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.647982" elapsed="0.000036"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:44.647339" elapsed="0.000736"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.647190" elapsed="0.000932"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:44.648194" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:49:44.648407" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:44.645965" elapsed="0.002469"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.645666" elapsed="0.002802"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.648673" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.648494" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.645646" elapsed="0.003115"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.649379" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.648909" elapsed="0.000498"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:44.649456" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:44.641776" elapsed="0.007874"/>
</kw>
<msg time="2026-04-10T00:49:44.649723" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:44.628365" elapsed="0.021510"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.664100" elapsed="0.000052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.677727" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.691205" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.691619" elapsed="0.000086"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.691947" elapsed="0.000073"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.692765" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.692518" elapsed="0.000316"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:44.692490" elapsed="0.000382"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.693132" 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-04-10T00:49:44.693434" elapsed="0.000034"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.693749" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:44.692425" elapsed="0.001407"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.692166" elapsed="0.001736"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.694214" elapsed="0.000074"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.694455" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:49:44.694654" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:44.618091" elapsed="0.076590"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:44.696756" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:44.696385" elapsed="0.000466">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:44.697007" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:44.695608" elapsed="0.001440"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.698471" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.697194" elapsed="0.001380"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.699437" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.698918" elapsed="0.000565"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.698614" elapsed="0.000920"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.697175" elapsed="0.002410"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.702580" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:44.699792" elapsed="0.002829"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:44.702754" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:44.702980" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:44.695073" elapsed="0.007932"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:44.704938" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:44.704634" elapsed="0.000368">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:44.705187" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:44.703858" elapsed="0.001368"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:44.705705" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-04-10T00:49:44.705375" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.705355" elapsed="0.000530"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.706081" elapsed="0.000075"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.706397" elapsed="0.000073"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.706609" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:49:44.720747" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:44.703356" elapsed="0.017421"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.723258" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.722667" elapsed="0.000723"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.724254" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.723671" 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-04-10T00:49:44.738534" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:44.739309" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:44.740069" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:44.728061" elapsed="0.012112"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.724510" elapsed="0.015826"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.742732" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.740429" elapsed="0.002520"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.724490" elapsed="0.018537"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.750924" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.748155" elapsed="0.003123"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.747863" elapsed="0.003478"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.747831" elapsed="0.003559"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.754348" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.751918" elapsed="0.002477"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.751608" elapsed="0.002848"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.751570" elapsed="0.002934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.755413" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.754869" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.755911" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.755605" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.756753" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.756250" elapsed="0.000529"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.756039" elapsed="0.000801"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.755572" elapsed="0.001313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.757756" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.757223" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.758211" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.757911" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.758869" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.758566" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.758338" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.757880" elapsed="0.001120"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:44.759325" elapsed="0.000519"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:44.760641" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.760189" elapsed="0.000498"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.761019" elapsed="0.002859"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:44.745134" elapsed="0.018826"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.764327" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:44.764128" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.764108" elapsed="0.000379"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:44.774989" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:44.764700" elapsed="0.010332"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:44.775167" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:49:44.775406" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:44.721135" elapsed="0.054332"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:44.775533" elapsed="0.000091"/>
</return>
<msg time="2026-04-10T00:49:44.775760" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:44.578025" elapsed="0.197761"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.776136" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.775871" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.775853" elapsed="0.000435"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:44.776322" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:44.573762" elapsed="0.202688"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.569472" elapsed="0.207022"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.569455" elapsed="0.207063"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:49:44.777145" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:49:44.777039" elapsed="0.000165"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.777263" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:44.777227" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.777022" elapsed="0.000302"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.777472" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:49:44.777623" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:44.776768" elapsed="0.000881"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.778186" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.777817" elapsed="0.000395"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.778839" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.778367" elapsed="0.000499"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.784511" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.784228" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.785069" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.784803" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:44.794806" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:44.794963" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:44 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":20004,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":40023,"Leader":"member-2-shard-inventory-config","LastIndex":40024,"RaftState":"Leader","LastApplied":40024,"LastCommittedTransactionTime":"2026-04-10 00:49:17.580","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:45:27.728","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.308","active":true,"matchIndex":40024,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":40025},{"timeSinceLastActivity":"00:00:00.308","active":true,"matchIndex":40024,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":40025}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"634.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":2,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":6,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3458},"timestamp":1775782184,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:44.795189" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:44.787187" elapsed="0.008039"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.785179" elapsed="0.010107"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.795579" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.795322" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.785162" elapsed="0.010589"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.801721" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":20004,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":40023,"Leader":"member-2-shard-inventory-config","LastIndex":40024,"RaftState":"Leader","LastApplied":40024,"LastCommittedTransactionTime":"2026-04-10 00:49:17.580","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:45:27.728","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.308","active":true,"matchIndex":40024,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":40025},{"timeSinceLastActivity":"00:00:00.308","active":true,"matchIndex":40024,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":40025}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"634.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":2,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":6,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3458},"timestamp":1775782184,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.797689" elapsed="0.004241"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.797246" elapsed="0.004810"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.797220" elapsed="0.004875"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.806433" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.802620" elapsed="0.004031"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.802176" elapsed="0.004613"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.802151" elapsed="0.004676"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.807909" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.807060" elapsed="0.000877"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.808721" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.808057" elapsed="0.000841"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.810205" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.809417" elapsed="0.000830"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.808925" elapsed="0.001430"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.808037" elapsed="0.002342"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.811107" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.810558" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.811879" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.811235" elapsed="0.000821"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.813352" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.812622" elapsed="0.000771"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.812082" elapsed="0.001409"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.811216" elapsed="0.002299"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:44.813687" elapsed="0.000716"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:44.815149" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.814633" elapsed="0.000542"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.815370" elapsed="0.002672"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:44.796496" elapsed="0.021636"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.818408" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:44.818299" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.818278" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:44.834448" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:44.818640" elapsed="0.015837"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:44.834578" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:49:44.834749" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:44.779800" elapsed="0.054976"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:44.834833" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:44.834982" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:44.779081" elapsed="0.055927"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.836090" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782184, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.835628" elapsed="0.000491"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:44.836167" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:44.836344" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782184, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:44.835235" elapsed="0.001136"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:44.836996" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 40024, 'CommittedTransactionsCount': 2, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True,...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.836529" elapsed="0.000494"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:44.837379" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.837180" elapsed="0.000225"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:44.837451" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:44.837620" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:44.567889" elapsed="0.269756"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:44.837705" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:49:44.837854" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:44.566809" elapsed="0.271069"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.838180" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.837961" elapsed="0.000275"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.838465" elapsed="0.000208"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.838259" elapsed="0.000452"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.838881" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.838734" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.837943" elapsed="0.001018"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:44.566634" elapsed="0.272351"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.841599" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.841287" elapsed="0.000339"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:44.841672" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:44.841822" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:44.840945" elapsed="0.000901"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.916148" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.915746" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:44.917070" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:44.916796" elapsed="0.000356">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:44.917246" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:44.916426" elapsed="0.000845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.917839" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:44.917436" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:44.918172" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:44.918335" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:44.918029" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.918782" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.918519" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.919815" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.919559" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.920290" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:44.920021" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.920678" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.920884" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.921065" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:44.920514" elapsed="0.000609"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.920370" elapsed="0.000785"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:44.921205" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:49:44.921372" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:44.919208" elapsed="0.002190"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.918905" elapsed="0.002526"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.921619" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.921456" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.918880" elapsed="0.002818"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.922282" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:44.921842" elapsed="0.000467"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:44.922358" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:44.915025" elapsed="0.007499"/>
</kw>
<msg time="2026-04-10T00:49:44.922620" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:44.901632" elapsed="0.021131"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.938058" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.951624" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.965312" elapsed="0.000054"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.965708" elapsed="0.000076"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.966022" elapsed="0.000074"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.966846" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.966616" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:44.966586" elapsed="0.000366"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.967386" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.967773" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.968073" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:44.966500" elapsed="0.001656"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.966239" elapsed="0.001988"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.968540" elapsed="0.000090"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.968805" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:49:44.968992" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:44.891041" elapsed="0.077977"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:44.971072" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:44.970750" elapsed="0.000393">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:44.971292" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:44.969939" elapsed="0.001394"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.972762" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:44.971480" elapsed="0.001370"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.973764" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:44.973192" elapsed="0.000619"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.972888" elapsed="0.000973"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.971461" elapsed="0.002435"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.976873" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:44.974097" elapsed="0.002818"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:44.977050" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:49:44.977283" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:44.969437" elapsed="0.007872"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:44.979383" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:44.979066" elapsed="0.000382">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:44.979644" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:44.978275" elapsed="0.001410"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:44.980120" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-10T00:49:44.979831" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.979812" elapsed="0.000486"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.980495" elapsed="0.000091"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:44.980834" elapsed="0.000072"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:44.981025" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:49:44.995115" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:44.977822" elapsed="0.017320"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.997875" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.997036" elapsed="0.000971"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:44.998835" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:44.998243" elapsed="0.000720"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:45.022766" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:45.023773" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:45.024672" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:45.002431" elapsed="0.022350"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.999087" elapsed="0.025822"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.027301" elapsed="0.000087"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.025003" elapsed="0.002516"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.999067" elapsed="0.028621"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.035741" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:45.032952" elapsed="0.003119"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:45.032473" elapsed="0.003660"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.032401" elapsed="0.003780"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.038965" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:45.036585" elapsed="0.002426"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:45.036277" elapsed="0.002793"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.036247" elapsed="0.002871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.040025" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:45.039462" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.040483" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.040179" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.041157" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:45.040849" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:45.040628" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.040148" elapsed="0.001139"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.042190" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:45.041685" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.042658" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.042343" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.043298" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:45.042996" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:45.042786" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.042313" elapsed="0.001114"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:45.043801" elapsed="0.000442"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:45.045044" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:45.044599" elapsed="0.000489"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.045418" elapsed="0.002479"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:45.029539" elapsed="0.018437"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.048340" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.048140" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.048120" elapsed="0.000379"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:45.059152" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:45.048769" elapsed="0.010428"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:45.059334" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:49:45.059619" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:44.995498" elapsed="0.064151"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:45.059714" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:45.059867" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:44.850470" elapsed="0.209423"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.060221" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.059976" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.059958" elapsed="0.000408"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:45.060400" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:44.846115" elapsed="0.214409"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:44.841912" elapsed="0.218708"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:44.841895" elapsed="0.218750"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:49:45.061249" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:49:45.061144" elapsed="0.000164"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.061368" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.061331" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.061127" elapsed="0.000301"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.061591" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:49:45.061711" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:45.060876" elapsed="0.000860"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.062271" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:45.061904" elapsed="0.000393"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.062933" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:45.062452" elapsed="0.000508"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.069013" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:45.068707" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.069487" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:45.069224" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:45.079855" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:45.079966" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":40023,"Leader":"member-2-shard-inventory-config","LastIndex":40024,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":40024,"LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:45:27.737","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"343.7 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3458},"timestamp":1775782185,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:45.080122" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:45.071674" elapsed="0.008475"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:45.069619" elapsed="0.010573"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.080377" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.080221" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.069598" elapsed="0.010865"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.084694" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":40023,"Leader":"member-2-shard-inventory-config","LastIndex":40024,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":40024,"LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:45:27.737","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"343.7 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3458},"timestamp":1775782185,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:45.081798" elapsed="0.003090"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:45.081463" elapsed="0.003515"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.081445" elapsed="0.003561"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.088073" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:45.085369" elapsed="0.002837"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:45.085064" elapsed="0.003231"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.085046" elapsed="0.003276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.089089" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:45.088499" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.089890" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.089220" elapsed="0.000846"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.091306" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:45.090584" elapsed="0.000764"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:45.090093" elapsed="0.001353"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.089200" elapsed="0.002270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.092210" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:45.091664" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.092966" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.092338" elapsed="0.000807"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.094432" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:45.093713" elapsed="0.000761"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:45.093171" elapsed="0.001419"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.092319" elapsed="0.002295"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:45.094773" elapsed="0.000722"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:45.096289" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:45.095755" elapsed="0.000560"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.096510" elapsed="0.002937"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:45.081012" elapsed="0.018542"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.099758" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.099648" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.099628" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:45.115947" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:45.099973" elapsed="0.016003"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:45.116029" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:49:45.116194" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:45.063933" elapsed="0.052287"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:45.116313" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:45.116465" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:45.063174" elapsed="0.053317"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.117538" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782185, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:45.117086" elapsed="0.000496"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:45.117632" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:45.117809" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782185, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:45.116737" elapsed="0.001099"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:45.118197" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 40024, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInit...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.117994" elapsed="0.000230"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:45.118599" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.118380" elapsed="0.000246"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:45.118673" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:45.118825" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:44.840078" elapsed="0.278772"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:45.118908" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:49:45.119056" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:44.839324" elapsed="0.279756"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.119379" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:45.119160" elapsed="0.000726"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.120065" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.119909" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.120287" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.120143" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.119143" elapsed="0.001217"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:44.839154" elapsed="0.281230"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:44.275478" elapsed="0.844940"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:45.120463" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:45.120684" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:49:45.120730" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:49:44.270881" elapsed="0.849872"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.121202" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:49:45.121278" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:45.120933" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.121600" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.121369" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.121352" elapsed="0.000327"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.123946" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:49:45.121817" elapsed="0.002177"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:49:45.124390" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.124199" elapsed="0.000217"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:45.124464" elapsed="0.000028"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:49:44.268299" elapsed="0.856363"/>
</kw>
<msg time="2026-04-10T00:49:45.124769" level="INFO">${inv_conf_leader} = 2</msg>
<msg time="2026-04-10T00:49:45.124817" level="INFO">${inv_conf_followers_list} = [1, 3]</msg>
<var>${inv_conf_leader}</var>
<var>${inv_conf_followers_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Get_Leader_And_Followers_For_Shard</arg>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:49:44.267520" elapsed="0.857320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.125322" level="INFO">config inventory Leader is 2 and followers are [1, 3]</msg>
<arg>config inventory Leader is ${inv_conf_leader} and followers are ${inv_conf_followers_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:45.125033" elapsed="0.000334"/>
</kw>
<return>
<value>${inv_conf_leader}</value>
<value>${inv_conf_followers_list}</value>
<status status="PASS" start="2026-04-10T00:49:45.125409" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:45.125664" level="INFO">${inventory_leader} = 2</msg>
<msg time="2026-04-10T00:49:45.125711" level="INFO">${inventory_followers} = [1, 3]</msg>
<var>${inventory_leader}</var>
<var>${inventory_followers}</var>
<doc>Check Status for Inventory Config shard in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:49:44.263253" elapsed="0.862484"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.126209" level="INFO">${Inventory_Pre_Leader_List} = [2]</msg>
<var>${Inventory_Pre_Leader_List}</var>
<arg>${Inventory_Leader}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:45.125918" elapsed="0.000317"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:49:45.126612" level="INFO">${Follower_Node_1} = 1</msg>
<var>${Follower_Node_1}</var>
<arg>${Inventory_Followers}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.126412" elapsed="0.000226"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.127140" level="INFO">${Inventory_Followers} = [1, 3]</msg>
<arg>${Inventory_Followers}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:45.126828" elapsed="0.000352"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.127981" level="INFO">${Follower_Node_1} = 1</msg>
<arg>${Follower_Node_1}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:45.127359" elapsed="0.000664"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.128500" level="INFO">${Inventory_Leader} = 2</msg>
<arg>${Inventory_Leader}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:45.128201" elapsed="0.000357"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.129048" level="INFO">${Inventory_Pre_Leader_List} = [2]</msg>
<arg>${Inventory_Pre_Leader_List}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:45.128742" elapsed="0.000346"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.129709" level="INFO">${Inventory_Pre_Leader} = 2</msg>
<var>${Inventory_Pre_Leader}</var>
<arg>${Inventory_Leader}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:45.129257" elapsed="0.000482"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.130225" level="INFO">${Inventory_Pre_Leader} = 2</msg>
<arg>${Inventory_Pre_Leader}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:49:45.129923" elapsed="0.000342"/>
</kw>
<doc>Find a follower in the inventory config shard</doc>
<status status="PASS" start="2026-04-10T00:49:43.851925" elapsed="1.278453"/>
</test>
<test id="s1-s2-t3" name="Shutdown Leader From Cluster Node" line="61">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:49:45.133579" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:49:45.133295" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.134839" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.134728" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.134707" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.140031" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.139913" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.139895" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.141106" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:45.140729" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.141612" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:45.141293" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:45.141683" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:45.141837" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:45.140327" elapsed="0.001535"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.147519" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.147413" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.147394" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.148777" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.148671" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.148653" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:45.149281" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.148989" elapsed="0.000318"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.149708" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:45.149470" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.190838" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:45.150234" elapsed="0.040745"/>
</kw>
<msg time="2026-04-10T00:49:45.191168" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:45.191218" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.149897" elapsed="0.041358"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.276512" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "h "u "t "d "o "w "n "[78C[C "[A[78CL
 "e "a "d "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:45.191894" elapsed="0.084821"/>
</kw>
<msg time="2026-04-10T00:49:45.276908" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:45.276956" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.191443" elapsed="0.085550"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.277402" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.277103" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.277070" elapsed="0.000419"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.278161" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "h "u "t "d "o "w "n "[78C[C "[A[78CL
 "e "a "d "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:45.277788" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.278572" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.278326" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.278308" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:45.278692" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:45.280299" elapsed="0.000975"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.281578" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:45.282320" elapsed="0.000378"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:45.279593" elapsed="0.003206"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:45.279007" elapsed="0.003858"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:45.148344" elapsed="0.134623"/>
</kw>
<msg time="2026-04-10T00:49:45.283065" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:45.283110" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.147772" elapsed="0.135376"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:45.283400" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:45.283290" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.283271" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.283936" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.284277" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.284350" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:45.147075" elapsed="0.137387"/>
</kw>
<msg time="2026-04-10T00:49:45.284575" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:45.284622" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.142285" elapsed="0.142374"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.284988" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.284737" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.284720" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:45.142136" elapsed="0.142953"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.290884" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.290778" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.290760" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.292128" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.292022" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.292005" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:45.292658" level="INFO">${karaf_connection_index} = 90</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.292340" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.293059" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:45.292845" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.327419" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:45.293601" elapsed="0.033930"/>
</kw>
<msg time="2026-04-10T00:49:45.327724" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:45.327810" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.293247" elapsed="0.034600"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.403009" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "h "u "t "d "o "w "n "[78C[C "[A[78CL
 "e "a "d "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:45.328372" elapsed="0.074829"/>
</kw>
<msg time="2026-04-10T00:49:45.403398" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:45.403447" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.328025" elapsed="0.075462"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.403952" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.403619" elapsed="0.000393"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.403586" elapsed="0.000453"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.404535" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "h "u "t "d "o "w "n "[78C[C "[A[78CL
 "e "a "d "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:45.404185" elapsed="0.000535"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.405013" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.404790" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.404772" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:45.405127" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:45.406673" elapsed="0.000761"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.407730" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:45.408480" 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-04-10T00:49:45.406027" elapsed="0.002934"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:45.405437" elapsed="0.003588"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:45.291698" elapsed="0.117428"/>
</kw>
<msg time="2026-04-10T00:49:45.409222" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:45.409268" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.291105" elapsed="0.118202"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:45.409491" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:45.409384" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.409367" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.410001" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.410336" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.410408" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:45.290417" elapsed="0.120101"/>
</kw>
<msg time="2026-04-10T00:49:45.410633" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:45.410679" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.285367" elapsed="0.125350"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.411044" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.410794" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.410777" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:45.285223" elapsed="0.125922"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.416920" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.416811" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.416792" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.418127" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.418021" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.418004" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:45.418659" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.418340" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.419061" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:45.418847" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.453150" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:45.419598" elapsed="0.033665"/>
</kw>
<msg time="2026-04-10T00:49:45.453486" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:45.453533" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.419246" elapsed="0.034351"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.522726" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "h "u "t "d "o "w "n "[78C[C "[A[78CL
 "e "a "d "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:45.454131" elapsed="0.068763"/>
</kw>
<msg time="2026-04-10T00:49:45.523073" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:45.523121" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.453780" elapsed="0.069379"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.523567" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.523265" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.523233" elapsed="0.000424"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.524181" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "h "u "t "d "o "w "n "[78C[C "[A[78CL
 "e "a "d "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:45.523815" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.524579" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.524340" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.524322" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:45.524696" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:45.526262" elapsed="0.000790"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.527336" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:45.528124" 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-04-10T00:49:45.525615" elapsed="0.002997"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:45.525027" elapsed="0.003650"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:45.417723" elapsed="0.111056"/>
</kw>
<msg time="2026-04-10T00:49:45.528876" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:45.528923" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.417142" elapsed="0.111819"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:45.529150" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:45.529042" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.529023" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.529674" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.530029" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.530102" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:45.416341" elapsed="0.113874"/>
</kw>
<msg time="2026-04-10T00:49:45.530315" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:45.530361" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.411422" elapsed="0.118978"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.530804" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.530531" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.530512" elapsed="0.000369"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:45.411279" elapsed="0.119626"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:45.141957" elapsed="0.388985"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:49:45.139523" elapsed="0.391484"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:49:45.134422" elapsed="0.396646"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.133997" elapsed="0.397121"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:49:45.131144" elapsed="0.400031"/>
</kw>
<kw name="Kill_Single_Member" owner="ClusterManagement">
<kw name="ClusterManagement__Build_List" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.534645" level="INFO">${member_int} = 2</msg>
<var>${member_int}</var>
<arg>${member}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:49:45.534310" elapsed="0.000361"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.535116" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>${member_int}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:45.534829" elapsed="0.000313"/>
</kw>
<return>
<value>${index_list}</value>
<status status="PASS" start="2026-04-10T00:49:45.535187" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:45.535337" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>${member}</arg>
<status status="PASS" start="2026-04-10T00:49:45.533989" elapsed="0.001373"/>
</kw>
<kw name="Return_Member_IP" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.536234" level="INFO">${member_int} = 2</msg>
<var>${member_int}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:49:45.535925" elapsed="0.000335"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:45.536813" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_int}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.536415" elapsed="0.000424"/>
</kw>
<return>
<value>${member_ip}</value>
<status status="PASS" start="2026-04-10T00:49:45.536886" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:45.537035" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>${member}</arg>
<doc>Return the IP address of the member given the member_index.</doc>
<status status="PASS" start="2026-04-10T00:49:45.535567" elapsed="0.001492"/>
</kw>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.543932" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.543789" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.543772" elapsed="0.000229"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.545003" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:45.544621" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.545496" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:45.545192" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:45.545582" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:45.545738" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:45.544223" elapsed="0.001539"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.551318" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.551211" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.551192" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.552501" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.552397" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.552378" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:45.552955" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.552737" elapsed="0.000244"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.553319" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:45.553146" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.584369" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "2 "[C "1 "0 ". "3 "0 ". "1 "7 "0 ". "1 "6 "9 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:45.553857" elapsed="0.030639"/>
</kw>
<msg time="2026-04-10T00:49:45.584618" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:45.584665" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "2 "[C "1 "0 ". "3 "0 ". "1 "7 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.553505" elapsed="0.031197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.587192" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:45.585223" elapsed="0.002029"/>
</kw>
<msg time="2026-04-10T00:49:45.587348" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:45.587392" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.584879" elapsed="0.002540"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.587739" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.587495" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.587477" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.588235" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:45.587983" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.588581" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.588351" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.588333" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:45.588692" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:45.589834" elapsed="0.000351"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.590349" elapsed="0.000147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:45.590669" elapsed="0.000098"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:45.589440" elapsed="0.001377"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:45.588947" elapsed="0.001915"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:45.552096" elapsed="0.038862"/>
</kw>
<msg time="2026-04-10T00:49:45.591049" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:45.591092" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.551556" elapsed="0.039563"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:45.591298" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:45.591195" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.591177" elapsed="0.000203"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.591788" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.592152" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.592224" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:45.550873" elapsed="0.041458"/>
</kw>
<msg time="2026-04-10T00:49:45.592423" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:45.592465" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.546147" elapsed="0.046346"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.592835" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.592585" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.592566" elapsed="0.000381"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:45.546001" elapsed="0.046970"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.598854" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.598746" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.598726" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.600050" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.599945" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.599927" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:45.600486" level="INFO">${karaf_connection_index} = 90</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.600262" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.600853" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:45.600685" elapsed="0.000193"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.630956" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "2 "[C "1 "0 ". "3 "0 ". "1 "7 "0 ". "1 "6 "9 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:45.601368" elapsed="0.029672"/>
</kw>
<msg time="2026-04-10T00:49:45.631143" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:45.631189" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "2 "[C "1 "0 ". "3 "0 ". "1 "7 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.601036" elapsed="0.030190"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.634094" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:45.631772" elapsed="0.002381"/>
</kw>
<msg time="2026-04-10T00:49:45.634250" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:45.634294" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.631401" elapsed="0.002919"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.634635" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.634396" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.634377" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.635106" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:45.634858" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.635433" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.635220" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.635203" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:45.635556" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:45.636726" elapsed="0.000352"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.637242" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:45.637539" 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-04-10T00:49:45.636350" elapsed="0.001364"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:45.635819" elapsed="0.001939"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:45.599618" elapsed="0.038236"/>
</kw>
<msg time="2026-04-10T00:49:45.637945" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:45.637988" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.599087" elapsed="0.038928"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:45.638195" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:45.638090" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.638073" elapsed="0.000240"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.638732" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.639072" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.639145" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:45.598361" elapsed="0.040892"/>
</kw>
<msg time="2026-04-10T00:49:45.639347" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:45.639390" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.593235" elapsed="0.046182"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.639765" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.639493" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.639476" elapsed="0.000366"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:45.593095" elapsed="0.046771"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.645429" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.645322" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.645303" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.646594" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:45.646473" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.646456" elapsed="0.000206"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:45.647023" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.646808" elapsed="0.000241"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.647373" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:45.647206" elapsed="0.000192"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.682339" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "2 "[C "1 "0 ". "3 "0 ". "1 "7 "0 ". "1 "6 "9 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:45.647932" elapsed="0.034491"/>
</kw>
<msg time="2026-04-10T00:49:45.682526" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:45.682597" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "2 "[C "1 "0 ". "3 "0 ". "1 "7 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.647571" elapsed="0.035065"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.685542" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:45.683166" elapsed="0.002453"/>
</kw>
<msg time="2026-04-10T00:49:45.685716" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:45.685760" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.682816" elapsed="0.002970"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.686089" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.685862" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.685843" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.686576" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:45.686310" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.686905" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.686691" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.686674" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:45.687015" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:45.688220" elapsed="0.000401"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.688789" elapsed="0.000158"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:45.689096" elapsed="0.000099"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:45.687780" elapsed="0.001468"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:45.687267" elapsed="0.002027"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:45.646177" elapsed="0.043216"/>
</kw>
<msg time="2026-04-10T00:49:45.689487" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:45.689531" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.645668" elapsed="0.043908"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:45.689766" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:45.689659" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.689639" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.690253" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.690605" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:45.690676" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:45.644984" elapsed="0.045802"/>
</kw>
<msg time="2026-04-10T00:49:45.690881" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:45.690925" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:45.640150" elapsed="0.050802"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.691275" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.691029" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.691012" elapsed="0.000340"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:45.640010" elapsed="0.051365"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:45.545818" elapsed="0.145589"/>
</for>
<arg>Killing ODL${member} ${member_ip}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:49:45.541692" elapsed="0.149772"/>
</kw>
<kw name="Kill_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.693192" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:45.692719" elapsed="0.000500"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.693696" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:45.693378" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:45.693773" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:49:45.693933" level="INFO">${kill_index_list} = [2]</msg>
<var>${kill_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:45.692327" elapsed="0.001630"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.696502" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:45.696124" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.697024" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:45.696716" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:45.697093" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:45.697248" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${original_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:45.694164" elapsed="0.003109"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.698771" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:45.698387" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.699261" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:45.698966" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:45.699331" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:45.699487" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:45.698020" elapsed="0.001491"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:45.700632" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.700349" elapsed="0.000309"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.701432" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:45.701283" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:45.704828" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:45.704100" elapsed="0.000896"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:45.704079" elapsed="0.000946"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.705313" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:45.705178" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.706638" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:45.705687" elapsed="0.001014"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.707631" level="INFO">${conn_id} = 109</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:45.706885" elapsed="0.000773"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:45.709380" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:45.709661" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:45.708842" elapsed="0.000929"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:45.710069" elapsed="0.000613"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:45.712008" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:46.022317" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:49:35 UTC 2026

  System load:  0.97               Processes:             121
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.169
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:36 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:45.711643" elapsed="0.310835"/>
</kw>
<msg time="2026-04-10T00:49:46.022653" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:45.710988" elapsed="0.311784"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:45.707930" elapsed="0.315103"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:46.023739" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh'.</msg>
<msg time="2026-04-10T00:49:46.046808" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:49:46.047130" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:46.047236" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:46.023323" elapsed="0.023968"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:46.047879" elapsed="0.000547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:46.050288" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:46.048933" elapsed="0.001460"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:46.051099" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:46.050655" elapsed="0.000725"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:46.050601" elapsed="0.000843"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:46.052012" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-04-10T00:49:46.051611" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:46.051541" elapsed="0.000874"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:46.052499" elapsed="0.000035"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:46.058832" elapsed="0.001095"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:46.060425" elapsed="0.000716"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:46.061619" elapsed="0.000409"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:46.053316" elapsed="0.008933"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:45.703443" elapsed="0.358945"/>
</kw>
<msg time="2026-04-10T00:49:46.062467" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:45.702797" elapsed="0.359766"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:49:45.702250" elapsed="0.360435"/>
</kw>
<msg time="2026-04-10T00:49:46.062745" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:45.701735" elapsed="0.361081"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:46.067439" 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-04-10T00:49:46.068195" elapsed="0.000215"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:46.068669" elapsed="0.000124"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:46.063246" elapsed="0.005601"/>
</kw>
<msg time="2026-04-10T00:49:46.068939" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:49:45.700876" elapsed="0.368088"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:46.069391" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:46.069145" elapsed="0.000287"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:49:46.069473" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:49:45.699906" elapsed="0.369780"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:45.699721" elapsed="0.370003"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:45.699584" elapsed="0.370177"/>
</for>
<arg>command=${NODE_KILL_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:49:45.697522" elapsed="0.372301"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:46.070283" level="INFO">${updated_index_list} = [1, 2, 3]</msg>
<var>${updated_index_list}</var>
<arg>@{index_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:46.069980" elapsed="0.000328"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{kill_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:46.070460" elapsed="0.000231"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:46.070924" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:46.070817" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:46.070798" elapsed="0.000194"/>
</if>
<kw name="Sleep" owner="BuiltIn">
<msg time="2026-04-10T00:49:47.071894" level="INFO">Slept 1 second.</msg>
<msg time="2026-04-10T00:49:47.072041" level="INFO">Kill -9 closes open files, which may take longer than ssh overhead, but not long enough to warrant WUKS.</msg>
<arg>1s</arg>
<arg>Kill -9 closes open files, which may take longer than ssh overhead, but not long enough to warrant WUKS.</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="PASS" start="2026-04-10T00:49:46.071355" elapsed="1.000819"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Verify_Karaf_Is_Not_Running_On_Member" owner="ClusterManagement">
<kw name="Count_Running_Karafs_On_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:47.076270" level="INFO">${command} = ps axf | grep org.apache.karaf | grep -v grep | wc -l</msg>
<var>${command}</var>
<arg>${NODE_KARAF_COUNT_COMMAND}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:47.075494" elapsed="0.000845"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:47.078332" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:47.077915" elapsed="0.000481"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:47.079865" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:47.079618" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:47.086312" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:47.085383" elapsed="0.001043"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:47.085310" elapsed="0.001192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:47.087321" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:47.086854" elapsed="0.000945"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:47.088855" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:47.088088" elapsed="0.001107"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:47.090654" level="INFO">${conn_id} = 112</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:47.089496" elapsed="0.001268"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:47.092420" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:47.092505" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:47.092108" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.092892" elapsed="0.000367"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:47.094230" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:47.452376" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:49:35 UTC 2026

  System load:  0.97               Processes:             121
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.169
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:45 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:47.093883" elapsed="0.358650"/>
</kw>
<msg time="2026-04-10T00:49:47.452633" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.093482" elapsed="0.359242"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:47.091183" elapsed="0.361805"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:47.453929" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-04-10T00:49:47.476640" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:49:47.477357" level="INFO">${stdout} = 0</msg>
<msg time="2026-04-10T00:49:47.477789" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:47.453444" elapsed="0.024564"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:47.478663" elapsed="0.001165"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:47.482353" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:47.481197" elapsed="0.001693"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:47.483909" elapsed="0.000069"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:47.483211" elapsed="0.000878"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:47.483114" elapsed="0.001126"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:47.485183" elapsed="0.000134"/>
</return>
<status status="PASS" start="2026-04-10T00:49:47.484535" elapsed="0.000890"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:47.484450" elapsed="0.001156"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:47.485812" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.491192" 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-04-10T00:49:47.492142" elapsed="0.000311"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:47.492816" elapsed="0.000272"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:47.486797" elapsed="0.006402"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:47.083146" elapsed="0.410415"/>
</kw>
<msg time="2026-04-10T00:49:47.493722" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.082074" elapsed="0.411729"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:49:47.081209" elapsed="0.412687"/>
</kw>
<msg time="2026-04-10T00:49:47.493939" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.080315" elapsed="0.413672"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.496929" elapsed="0.000319"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:47.497418" elapsed="0.000192"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:47.497763" elapsed="0.000098"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:47.494283" elapsed="0.003630"/>
</kw>
<msg time="2026-04-10T00:49:47.498008" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:49:47.078909" elapsed="0.419124"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:47.498473" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:47.498222" elapsed="0.000295"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:49:47.498577" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:47.498736" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>command=${command}</arg>
<arg>member_index=${member_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:49:47.076930" elapsed="0.421832"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-04-10T00:49:47.498808" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:47.498955" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>member_index=${member_index}</arg>
<doc>Remotely execute grep for karaf process, return count as string.</doc>
<status status="PASS" start="2026-04-10T00:49:47.074624" elapsed="0.424356"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>0</arg>
<arg>${count}</arg>
<arg>Found running Karaf count: ${count}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-04-10T00:49:47.499137" elapsed="0.000384"/>
</kw>
<arg>member_index=${index}</arg>
<doc>Fail if non-zero karaf instances are counted on member of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:47.073479" elapsed="0.426138"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:47.072912" elapsed="0.426739"/>
</iter>
<var>${index}</var>
<value>@{kill_index_list}</value>
<status status="PASS" start="2026-04-10T00:49:47.072363" elapsed="0.427324"/>
</for>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:47.503178" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:47.502771" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:47.503704" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:47.503369" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:47.503775" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:47.503936" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:47.502333" elapsed="0.001627"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:47.505121" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:47.504751" elapsed="0.000397"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:47.505931" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:47.505794" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:47.509463" elapsed="0.000095"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:47.508536" elapsed="0.001119"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:47.508517" elapsed="0.001167"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:47.509973" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:47.509840" elapsed="0.000502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:47.511486" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:47.510519" elapsed="0.001055"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:47.512505" level="INFO">${conn_id} = 115</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:47.511767" elapsed="0.000766"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:47.514204" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:47.514471" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:47.513664" elapsed="0.000922"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.514887" elapsed="0.000719"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:47.517025" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:47.827401" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:49:35 UTC 2026

  System load:  0.54               Processes:             121
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:35 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:47.516679" elapsed="0.310896"/>
</kw>
<msg time="2026-04-10T00:49:47.827730" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.515917" elapsed="0.311921"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:47.512828" elapsed="0.315176"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:47.828731" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:49:47.841400" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:49:47.841677" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:47.841747" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:47.828353" elapsed="0.013429"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:47.842314" elapsed="0.000541"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:47.844445" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:47.843270" elapsed="0.001342"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:47.845259" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:47.844821" elapsed="0.000676"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:47.844773" elapsed="0.000810"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:47.846057" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-04-10T00:49:47.845710" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:47.845674" elapsed="0.000710"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:47.846462" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.851680" elapsed="0.000708"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:47.852708" elapsed="0.000450"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:47.853447" elapsed="0.000274"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:47.847201" elapsed="0.006664"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:47.507934" elapsed="0.346028"/>
</kw>
<msg time="2026-04-10T00:49:47.854021" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.507278" elapsed="0.346803"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:49:47.506744" elapsed="0.347425"/>
</kw>
<msg time="2026-04-10T00:49:47.854211" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.506218" elapsed="0.348038"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.857189" elapsed="0.000317"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:47.857693" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:47.857990" elapsed="0.000097"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:47.854609" elapsed="0.003529"/>
</kw>
<msg time="2026-04-10T00:49:47.858232" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:49:47.505366" elapsed="0.352892"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:47.858745" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:47.858463" elapsed="0.000323"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:49:47.858832" elapsed="0.000033"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:49:47.504331" elapsed="0.354633"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:47.504153" elapsed="0.354848"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:47.859999" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:47.859711" elapsed="0.000325"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:47.860844" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:47.860708" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:47.864454" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:47.863743" elapsed="0.000906"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:47.863721" elapsed="0.000956"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:47.864972" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:47.864829" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:47.866386" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:47.865420" elapsed="0.001047"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:47.867445" level="INFO">${conn_id} = 118</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:47.866663" elapsed="0.000810"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:47.869073" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:47.869391" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:47.868494" elapsed="0.001001"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.869885" elapsed="0.000867"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:47.872176" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:48.196456" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:49:35 UTC 2026

  System load:  0.97               Processes:             121
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.169
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:47 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:47.871793" elapsed="0.324852"/>
</kw>
<msg time="2026-04-10T00:49:48.196805" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.871097" elapsed="0.325830"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:47.867763" elapsed="0.329344"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:48.197828" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:49:48.210740" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:49:48.211111" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:48.211207" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:48.197433" elapsed="0.013827"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:48.211852" elapsed="0.000531"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:48.214042" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:48.212836" elapsed="0.001341"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:48.214802" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:48.214378" elapsed="0.000661"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:48.214331" elapsed="0.000764"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:48.215590" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-04-10T00:49:48.215217" elapsed="0.000644"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:48.215180" elapsed="0.000741"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:48.215998" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:48.222996" elapsed="0.000885"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:48.224262" elapsed="0.000734"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:48.225382" elapsed="0.000311"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:48.216743" elapsed="0.009112"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:47.863093" elapsed="0.362875"/>
</kw>
<msg time="2026-04-10T00:49:48.226037" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.862304" elapsed="0.363810"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:49:47.861768" elapsed="0.364442"/>
</kw>
<msg time="2026-04-10T00:49:48.226262" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:47.861233" elapsed="0.365088"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:48.230284" 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-04-10T00:49:48.230969" elapsed="0.000209"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:48.231370" elapsed="0.000125"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:48.226736" elapsed="0.004843"/>
</kw>
<msg time="2026-04-10T00:49:48.231699" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:49:47.860273" elapsed="0.371459"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:48.232312" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:48.231997" elapsed="0.000366"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:49:48.232421" elapsed="0.000048"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:49:47.859281" elapsed="0.373332"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:47.859098" elapsed="0.373562"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:48.234196" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:48.233866" elapsed="0.000363"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:48.235388" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:48.235203" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:48.240218" elapsed="0.000094"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:48.239254" elapsed="0.001180"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:48.239226" elapsed="0.001245"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:48.240905" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:48.240697" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:48.242640" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:48.241394" elapsed="0.001329"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:48.244074" level="INFO">${conn_id} = 121</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:48.242953" elapsed="0.001157"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:48.246244" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:49:48.246596" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:48.245568" elapsed="0.001150"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:48.247095" elapsed="0.000877"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:49:48.249716" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:49:48.583792" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:49:36 UTC 2026

  System load:  0.88               Processes:             121
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:36 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:49:48.249325" elapsed="0.334615"/>
</kw>
<msg time="2026-04-10T00:49:48.584079" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:48.248351" elapsed="0.335832"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:49:48.244570" elapsed="0.339787"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:49:48.584983" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:49:48.597968" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:49:48.598108" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:49:48.598151" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:49:48.584642" elapsed="0.013532"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:48.598393" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:48.599380" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:48.598848" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:48.599761" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:48.599564" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:48.599518" elapsed="0.000380"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:49:48.600109" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:48.599953" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:48.599937" elapsed="0.000320"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:49:48.600292" elapsed="0.000015"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:48.603493" elapsed="0.000701"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:48.604499" elapsed="0.000442"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:48.605232" elapsed="0.000284"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:48.600631" elapsed="0.005047"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:49:48.238447" elapsed="0.367327"/>
</kw>
<msg time="2026-04-10T00:49:48.605829" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:48.237598" elapsed="0.368283"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:49:48.236835" elapsed="0.369125"/>
</kw>
<msg time="2026-04-10T00:49:48.606001" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:48.235768" elapsed="0.370279"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:48.608894" elapsed="0.000306"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:48.609600" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:48.609901" elapsed="0.000097"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:48.606335" elapsed="0.003715"/>
</kw>
<msg time="2026-04-10T00:49:48.610140" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:49:48.234505" elapsed="0.375660"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:48.610603" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:48.610341" elapsed="0.000305"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:49:48.610689" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:49:48.233217" elapsed="0.377597"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:48.232786" elapsed="0.378066"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:47.504019" elapsed="1.106867"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:49:47.499973" elapsed="1.110972"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-10T00:49:48.610987" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:48.611149" level="INFO">${updated_index_list} = [1, 3]</msg>
<var>${updated_index_list}</var>
<arg>${index_list}</arg>
<arg>${original_index_list}</arg>
<arg>${confirm}</arg>
<doc>If the list is empty, kill all ODL instances. Otherwise, kill members based on ${kill_index_list}
If ${confirm} is True, sleep 1 second and verify killed instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-04-10T00:49:45.691794" elapsed="2.919380"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-10T00:49:48.611226" elapsed="0.000027"/>
</return>
<arg>${Inventory_Leader}</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="PASS" start="2026-04-10T00:49:45.531438" elapsed="3.079914"/>
</kw>
<doc>Shutdown Leader Node and Start it Up</doc>
<status status="PASS" start="2026-04-10T00:49:45.130607" elapsed="3.480859"/>
</test>
<test id="s1-s2-t4" name="Check Shards Status After Leader Shutdown" line="65">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:49:48.615033" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:49:48.614761" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:48.616303" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:48.616195" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:48.616177" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:48.621396" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:48.621291" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:48.621273" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:48.622506" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:48.622120" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:48.623016" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:48.622712" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:48.623086" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:48.623240" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:48.621736" elapsed="0.001528"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:48.628905" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:48.628795" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:48.628776" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:48.630159" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:48.630052" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:48.630035" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:48.630696" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:48.630373" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:48.631103" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:48.630886" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:48.663570" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:48.631690" elapsed="0.031984"/>
</kw>
<msg time="2026-04-10T00:49:48.663845" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:48.663891" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:48.631329" elapsed="0.032598"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:48.734194" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "S "h "u "t "d "o "w "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:48.664442" elapsed="0.069889"/>
</kw>
<msg time="2026-04-10T00:49:48.734497" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:48.734564" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:48.664100" elapsed="0.070504"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:48.734917" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:48.734683" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:48.734663" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:48.735438" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "S "h "u "t "d "o "w "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:48.735139" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:48.735824" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:48.735608" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:48.735590" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:48.735958" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:48.737399" elapsed="0.000824"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:48.738500" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:48.739229" elapsed="0.000375"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:48.736778" elapsed="0.002925"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:48.736233" elapsed="0.003533"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:48.629750" elapsed="0.110114"/>
</kw>
<msg time="2026-04-10T00:49:48.739955" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:48.739998" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:48.629130" elapsed="0.110904"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:48.740217" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:48.740111" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:48.740094" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:48.740723" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:48.741065" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:48.741137" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:49:48.628437" elapsed="0.112809"/>
</kw>
<msg time="2026-04-10T00:49:48.741378" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:48.741422" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:48.623651" elapsed="0.117805"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:48.741832" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:48.741533" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:48.741515" elapsed="0.000410"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:48.623490" elapsed="0.118464"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:48.747662" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:48.747437" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:48.747419" elapsed="0.000316"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:48.748881" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:48.748775" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:48.748758" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:48.749392" level="INFO">${karaf_connection_index} = 90</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:48.749097" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:48.749846" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:48.749632" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:48.750646" level="FAIL">OSError: Socket is closed</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:49:48.750370" elapsed="0.002188">OSError: Socket is closed</status>
</kw>
<msg time="2026-04-10T00:49:48.752749" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:49:48.752795" level="INFO">${message_write} = OSError: Socket is closed</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:48.750033" elapsed="0.002785"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:58.754056" level="FAIL">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:49:48.753334" elapsed="10.001676">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</status>
</kw>
<msg time="2026-04-10T00:49:58.755299" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:49:58.755351" level="INFO">${message_wait} = No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:48.752989" elapsed="10.002387"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:49:58.756617" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Leader Shutdown"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:49:58.755890" elapsed="0.000794">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Leader Shutdown"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:49:58.755518" elapsed="0.001244">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Leader Shutdown"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:49:58.755476" elapsed="0.001320">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Leader Shutdown"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:58.756969" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:58.757202" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:58.757059" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:58.757042" elapsed="0.000239"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:49:58.757327" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:58.758968" elapsed="0.000810"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:58.760065" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:58.760843" elapsed="0.000354"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:58.758265" elapsed="0.003142"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:58.757668" elapsed="0.003806"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:49:48.748445" elapsed="10.013136">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Leader Shutdown"</status>
</kw>
<msg time="2026-04-10T00:49:58.761694" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:49:58.761753" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Leader Shutdown"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:48.747890" elapsed="10.013889"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:58.761973" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:58.761862" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:58.761843" elapsed="0.000197"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:58.762927" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:58.762780" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:58.762762" elapsed="0.000236"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:58.765196" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:58.763180" elapsed="0.002169"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:58.765801" level="INFO">{1: 88, 2: 90, 3: 92}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:58.765512" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:58.766250" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:58.766005" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:58.766845" elapsed="0.000612"/>
</kw>
<msg time="2026-04-10T00:49:58.767602" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:58.767658" level="INFO">${old_connection_index} = 90</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:58.766460" elapsed="0.001222"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:58.768687" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:58.770028" level="FAIL">OSError: Socket is closed</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:49:58.769586" elapsed="0.001248">OSError: Socket is closed</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:58.769079" elapsed="0.001998"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:58.771775" elapsed="0.000337"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:58.771263" elapsed="0.000937"/>
</kw>
<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="PASS" start="2026-04-10T00:49:58.768021" elapsed="0.004226"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:58.767771" elapsed="0.004528"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:58.767745" elapsed="0.004584"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:58.773221" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:58.772908" elapsed="0.000340"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:49:58.773297" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:49:58.773459" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:58.772571" elapsed="0.000914"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:58.773659" elapsed="0.000410"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:58.774358" level="INFO">index=126
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:49:58.774240" elapsed="0.000297"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:49:58.774714" elapsed="0.006006"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:49:58.781934" level="INFO">Logging into '10.30.170.169:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:49:58.784337" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</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="FAIL" start="2026-04-10T00:49:58.781217" elapsed="0.004381">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:58.861613" elapsed="0.000660"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:58.862476" elapsed="0.000223"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:58.862858" elapsed="0.000137"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:58.786656" elapsed="0.076405"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:58.785979" elapsed="0.077138"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:49:58.762445" elapsed="0.100788">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:58.863698" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:58.863788" 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="FAIL" start="2026-04-10T00:49:48.747100" elapsed="10.116820">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<msg time="2026-04-10T00:49:58.864047" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:49:58.864093" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:48.742230" elapsed="10.121888"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:58.864508" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:58.864224" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:58.864200" elapsed="0.000581"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:49:48.742088" elapsed="10.122719"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:58.870475" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:58.870363" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:58.870344" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:49:58.871804" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:58.871693" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:58.871674" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:58.872385" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:58.872062" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:49:58.872818" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:49:58.872597" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:49:58.908329" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:49:58.873405" elapsed="0.035080"/>
</kw>
<msg time="2026-04-10T00:49:58.908704" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:49:58.908758" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:58.873048" elapsed="0.035748"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:49:58.984165" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "S "h "u "t "d "o "w "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:49:58.909405" elapsed="0.075118"/>
</kw>
<msg time="2026-04-10T00:49:58.984850" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:49:58.984921" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:58.909006" elapsed="0.075972"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:58.985613" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:58.985131" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:58.985088" elapsed="0.000691"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:58.986712" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "S "h "u "t "d "o "w "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:58.986064" elapsed="0.000831"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:58.987482" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:58.987051" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:58.986990" elapsed="0.000671"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:49:58.987730" elapsed="0.000068"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:58.990656" elapsed="0.001497"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:49:58.992719" elapsed="0.000807"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:49:58.994039" elapsed="0.001080"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:49:58.989432" elapsed="0.005881"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:49:58.988302" elapsed="0.007100"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:49:58.871355" elapsed="0.124183"/>
</kw>
<msg time="2026-04-10T00:49:58.995683" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:58.995741" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:58.870719" elapsed="0.125074"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:49:58.996071" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T00:49:58.995914" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:58.995884" elapsed="0.000313"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:58.996792" 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-04-10T00:49:58.997240" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:49:58.997339" 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-04-10T00:49:58.869993" elapsed="0.127486"/>
</kw>
<msg time="2026-04-10T00:49:58.997848" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:49:58.997905" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:58.865103" elapsed="0.132853"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:58.998423" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:58.998063" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:58.998039" elapsed="0.000485"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:58.864951" elapsed="0.133625"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:48.623319" elapsed="10.375302"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:49:48.620936" elapsed="10.377760"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:49:48.615904" elapsed="10.382944"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:49:48.615451" elapsed="10.383458"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:49:48.612400" elapsed="10.386581"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.026970" elapsed="0.000274"/>
</kw>
<msg time="2026-04-10T00:49:59.027310" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:59.026212" elapsed="0.001165"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:49:59.025539" elapsed="0.001918"/>
</kw>
<msg time="2026-04-10T00:49:59.027504" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:59.014122" elapsed="0.013442"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:49:59.013380" elapsed="0.014264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.028123" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.027862" elapsed="0.000306"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.033651" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:59.033245" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.034148" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:59.033843" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:59.034222" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:49:59.034385" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:59.032867" elapsed="0.001544"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:49:59.034613" elapsed="0.000158"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.035313" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:59.034933" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.035764" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:59.035503" elapsed="0.000286"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.036188" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:59.035950" elapsed="0.000264"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.038884" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.038387" elapsed="0.000525"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:59.038957" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:59.039161" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:59.037982" elapsed="0.001204"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.097908" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.097494" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.098771" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:59.098455" elapsed="0.000463">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:59.099016" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:59.098115" elapsed="0.000927"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.099829" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:59.099227" elapsed="0.000630"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.100197" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:59.100363" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:59.100047" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.100816" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.100564" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.101918" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.101662" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.102411" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.102140" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.102789" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.102995" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.103219" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:59.102650" elapsed="0.000631"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.102490" elapsed="0.000822"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:59.103360" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:49:59.103529" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:59.101242" elapsed="0.002327"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.100940" elapsed="0.002664"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.103780" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.103629" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.100916" elapsed="0.002940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.104455" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.104001" elapsed="0.000483"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.104534" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:59.096875" elapsed="0.007806"/>
</kw>
<msg time="2026-04-10T00:49:59.104736" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:59.084257" elapsed="0.020533"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.117652" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.130137" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.142765" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.142971" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.143186" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.143583" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.143421" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:59.143406" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.143806" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.143975" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.144142" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:59.143375" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.143270" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.144387" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.144486" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:59.144870" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:59.079849" elapsed="0.065070"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.146833" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:59.146524" elapsed="0.000382">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:59.147002" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:59.146137" elapsed="0.000890"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.147376" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.147122" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.147966" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.147654" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.147458" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.147102" elapsed="0.000947"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.150429" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:59.148200" elapsed="0.002256"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:59.150508" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:59.150880" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:59.145683" elapsed="0.005232"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.152862" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:59.152484" elapsed="0.000446">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:59.153025" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:59.152122" elapsed="0.000928"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:59.153265" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:49:59.153122" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.153104" elapsed="0.000247"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.153500" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.153693" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.153759" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:49:59.156072" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:59.151668" elapsed="0.004442"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.158181" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.157736" elapsed="0.000493"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.158666" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.158387" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:59.178505" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:59.179592" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:59.180108" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:59.161000" elapsed="0.019171"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.158781" elapsed="0.021490"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.180725" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.180334" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.158763" elapsed="0.022158"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.189246" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.183924" elapsed="0.005693"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.183174" elapsed="0.006481"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.183084" elapsed="0.006596"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.192679" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.189972" elapsed="0.002759"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.189739" elapsed="0.003031"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.189721" elapsed="0.003073"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.193386" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.192981" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.193751" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.193491" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.194300" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.193997" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.193833" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.193472" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.194922" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.194558" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.195277" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.195020" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.195840" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.195521" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.195360" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.195002" elapsed="0.000921"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:59.196078" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:59.196907" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.196611" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.197089" elapsed="0.002555"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:59.181830" elapsed="0.017909"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.199953" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:59.199830" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.199806" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:59.208537" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:59.200167" elapsed="0.008415"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:59.208637" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:49:59.209021" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:59.156765" elapsed="0.052296"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.209158" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:49:59.209524" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:59.054835" elapsed="0.154772"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.210601" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.209827" elapsed="0.000966"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.209804" elapsed="0.001034"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.210931" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:59.043504" elapsed="0.167652"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.039259" elapsed="0.171944"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.039239" elapsed="0.171990"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.211980" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:59.211849" elapsed="0.000228"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:49:59.212224" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:59.212102" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.211831" elapsed="0.000527"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.212510" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:49:59.212652" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:59.211526" elapsed="0.001151"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.213299" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.212858" elapsed="0.000471"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.214084" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.213491" elapsed="0.000621"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.221575" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.220815" elapsed="0.000933"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.222836" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.222031" elapsed="0.000965"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:59.233759" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:59.233840" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:59 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:59 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastApplied":137,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.691","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"338.0 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":7926168},"timestamp":1775782199,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:59.234096" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:59.225478" elapsed="0.008659"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.223144" elapsed="0.011051"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.234665" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.234259" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.223089" elapsed="0.011740"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.244438" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastApplied":137,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.691","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"338.0 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":7926168},"timestamp":1775782199,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.238226" elapsed="0.006276"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.237503" elapsed="0.007035"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.237382" elapsed="0.007221"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.247414" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.244984" elapsed="0.002479"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.244744" elapsed="0.002755"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.244697" elapsed="0.002884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.248353" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.247862" elapsed="0.000555"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.248862" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.248607" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.249451" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.249132" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.248965" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.248541" elapsed="0.001031"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.250264" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.249835" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.250739" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.250475" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.251351" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.251003" elapsed="0.000374"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.250840" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.250423" elapsed="0.001037"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:59.251733" elapsed="0.000431"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:59.252822" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.252425" elapsed="0.000448"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.253126" elapsed="0.002513"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:59.235761" elapsed="0.019991"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.256112" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:59.255883" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.255850" elapsed="0.000412"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:59.260032" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:59.256497" elapsed="0.003630"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:59.260217" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:49:59.260506" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:59.215194" elapsed="0.045571"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.260835" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:59.260996" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:59.214330" elapsed="0.046692"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.262377" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.261661" elapsed="0.000746"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:59.262456" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:59.262658" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:59.261255" elapsed="0.001432"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:59.263080" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 137, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.262848" elapsed="0.000260"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:59.263590" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.263306" elapsed="0.000312"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:59.263675" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:59.263837" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:59.037362" elapsed="0.226500"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:59.263920" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:49:59.264071" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:59.036647" elapsed="0.227448"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.264399" elapsed="0.000250"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.264178" elapsed="0.000515"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.264868" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.264718" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.265086" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.264944" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.264160" elapsed="0.000999"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:59.036461" elapsed="0.228722"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.268260" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.267495" elapsed="0.000793"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:59.268335" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:59.268488" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:59.267092" elapsed="0.001421"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.327491" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.327067" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.328336" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:59.328070" elapsed="0.000401">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:59.328587" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:59.327727" elapsed="0.000886"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.329190" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:59.328797" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.329524" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:59.329710" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:59.329382" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.330152" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.329901" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.331239" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.330943" elapsed="0.000345"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.331761" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.331455" 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-04-10T00:49:59.332128" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.332339" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.332515" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:59.331987" elapsed="0.000604"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.331842" elapsed="0.000780"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:59.332670" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:49:59.332852" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:59.330598" elapsed="0.002279"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.330273" elapsed="0.002637"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.333088" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.332935" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.330251" elapsed="0.002914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.333793" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.333307" elapsed="0.000525"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.333885" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:59.326408" elapsed="0.007608"/>
</kw>
<msg time="2026-04-10T00:49:59.334071" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:59.313676" elapsed="0.020448"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.346761" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.358999" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.371585" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.371785" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.371960" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.372330" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.372185" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:59.372170" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.372562" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.372732" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.372897" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:59.372140" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.372038" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.373121" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.373197" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:49:59.373628" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:59.309236" elapsed="0.064429"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.375383" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:59.375095" elapsed="0.000357">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:59.375559" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:59.374745" elapsed="0.000840"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.375903" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.375656" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.376453" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.376158" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.375983" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.375638" elapsed="0.000897"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.378858" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:59.376702" elapsed="0.002182"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:59.378935" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:59.379267" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:59.374284" elapsed="0.005019"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.380947" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:59.380705" elapsed="0.000304">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:59.381139" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:59.380351" elapsed="0.000812"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:59.381369" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:59.381234" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.381216" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.381614" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.381786" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.381851" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:49:59.384147" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:59.379917" elapsed="0.004266"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.386014" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.385753" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.386456" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.386215" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:59.417747" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:59.418693" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:59.419159" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:59.388694" elapsed="0.030526"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.386626" elapsed="0.032734"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.419808" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.419423" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.386606" elapsed="0.033400"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.426996" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.422307" elapsed="0.005176"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.421810" elapsed="0.005726"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.421767" elapsed="0.005827"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.431345" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.428013" elapsed="0.003397"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.427681" elapsed="0.003777"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.427654" elapsed="0.003838"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.432317" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.431768" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.432811" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.432453" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.433614" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.433154" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.432926" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.432428" elapsed="0.001309"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.434471" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.433965" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.435105" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.434776" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.435921" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.435485" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.435218" elapsed="0.000789"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.434751" elapsed="0.001284"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:59.436252" elapsed="0.000385"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:59.437109" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.436805" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.437290" elapsed="0.002607"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:59.420828" elapsed="0.019139"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.440151" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:59.440039" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.440020" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:59.448785" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:59.440386" elapsed="0.008430"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:59.448869" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:49:59.449227" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:59.384803" elapsed="0.064461"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.449379" elapsed="0.000090"/>
</return>
<msg time="2026-04-10T00:49:59.449775" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:59.284124" elapsed="0.165693"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.450777" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.450010" elapsed="0.000931"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.449991" elapsed="0.000991"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.451072" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:59.272992" elapsed="0.178327"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.268653" elapsed="0.182716"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.268634" elapsed="0.182761"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.452135" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:59.452007" elapsed="0.000222"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:49:59.452373" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:59.452254" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.451989" elapsed="0.000516"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.452672" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:49:59.452794" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:59.451706" elapsed="0.001114"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.453405" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.452990" elapsed="0.000442"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.454171" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.453606" elapsed="0.000594"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.461994" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.461269" elapsed="0.000892"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.463166" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.462423" elapsed="0.000944"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:59.475629" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:59.475762" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:59 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:59 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":137,"LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.689","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.146","active":true,"matchIndex":137,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":138},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-operational","nextIndex":137}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"1.891 ms","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":7926168},"timestamp":1775782199,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:59.476143" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:59.465850" elapsed="0.010348"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.463490" elapsed="0.012813"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.476974" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.476407" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.463456" elapsed="0.013833"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.487125" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":137,"LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.689","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.146","active":true,"matchIndex":137,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":138},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-operational","nextIndex":137}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"1.891 ms","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":7926168},"timestamp":1775782199,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.481277" elapsed="0.005951"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.480480" elapsed="0.006829"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.480369" elapsed="0.007026"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.490576" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.487892" elapsed="0.002750"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.487581" elapsed="0.003107"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.487507" elapsed="0.003237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.491660" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.491077" elapsed="0.000643"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.492193" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.491900" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.492868" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.492499" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.492302" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.491849" elapsed="0.001143"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.493802" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.493285" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.494312" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.494028" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.494986" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.494631" elapsed="0.000387"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.494419" elapsed="0.000640"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.493979" elapsed="0.001126"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:59.495435" elapsed="0.000512"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:59.496658" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.496240" elapsed="0.000472"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.497030" elapsed="0.002752"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:59.478741" elapsed="0.021165"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.500308" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:59.500066" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.500025" elapsed="0.000440"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:59.504653" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:59.500742" elapsed="0.004012"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:59.504930" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:49:59.505268" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:59.455210" elapsed="0.050088"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.505366" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:59.505521" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:59.454417" elapsed="0.051182"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.507083" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.506309" elapsed="0.000809"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:59.507173" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:59.507378" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:59.505867" elapsed="0.001538"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:59.507824" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 137, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.507584" elapsed="0.000268"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:59.508264" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.508011" elapsed="0.000280"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:59.508340" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:59.508497" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:59.266458" elapsed="0.242063"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:59.508597" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:59.508752" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:59.265723" elapsed="0.243054"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.509096" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.508865" elapsed="0.000293"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.509408" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.509190" elapsed="0.000540"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.509906" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.509754" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.508845" elapsed="0.001136"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:59.265356" elapsed="0.244649"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:59.036262" elapsed="0.473775"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:59.510081" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:59.510293" level="INFO">${leader_list} = [3]</msg>
<msg time="2026-04-10T00:49:59.510339" level="INFO">${follower_list} = [1]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:49:59.032127" elapsed="0.478235"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.510836" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:49:59.510912" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:59.510542" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.511304" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.511005" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.510987" elapsed="0.000431"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.513775" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:49:59.511581" elapsed="0.002243"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:49:59.514181" level="INFO">${leader} = 3</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.513991" elapsed="0.000215"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:59.514266" elapsed="0.000043"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:49:59.029216" elapsed="0.485240"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:49:59.028979" elapsed="0.485526"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.519079" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:59.518690" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.519635" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:59.519271" elapsed="0.000392"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:59.519710" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:59.519868" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:59.518277" elapsed="0.001616"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:49:59.520051" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.520744" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:59.520383" elapsed="0.000389"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.521176" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:59.520934" elapsed="0.000267"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.521618" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:59.521359" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.524347" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.523873" elapsed="0.000517"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:59.524464" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:49:59.524651" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:59.523479" elapsed="0.001198"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.585367" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.584968" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.586201" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:59.585932" elapsed="0.000346">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:59.586373" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:59.585589" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.586976" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:59.586585" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.587312" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:59.587610" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:59.587169" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.588056" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.587800" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.589102" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.588832" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.589600" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.589312" elapsed="0.000314"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.589965" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.590174" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.590351" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:59.589827" elapsed="0.000582"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.589682" elapsed="0.000759"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:59.590490" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:49:59.590682" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:59.588489" elapsed="0.002218"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.588180" elapsed="0.002559"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.590915" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.590765" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.588157" elapsed="0.002835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.591634" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.591137" elapsed="0.000527"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.591714" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:59.584334" elapsed="0.007507"/>
</kw>
<msg time="2026-04-10T00:49:59.591896" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:59.570911" elapsed="0.021047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.604743" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.617220" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.629487" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.629762" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.629944" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.630332" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.630184" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:59.630168" 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-04-10T00:49:59.630570" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.630742" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.630952" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:59.630137" elapsed="0.000881"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.630026" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.631200" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.631280" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:49:59.631669" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:59.566375" elapsed="0.065342"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.633631" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:59.633316" elapsed="0.000390">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:59.633801" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:59.632919" elapsed="0.000908"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.634192" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.633903" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.634783" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.634464" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.634281" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.633883" elapsed="0.000982"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.637439" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:59.635017" elapsed="0.002451"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:59.637707" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:49:59.638516" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:59.632407" elapsed="0.006158"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.640366" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:59.640071" elapsed="0.000371">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:59.640538" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:59.639710" elapsed="0.001139"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:59.641081" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:49:59.640930" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.640909" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.641402" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.641784" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.641889" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:49:59.644291" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:59.639191" elapsed="0.005140"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.646335" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.646041" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.646800" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.646556" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:59.660766" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:59.661756" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:59.662267" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:59.649131" elapsed="0.013199"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.646917" elapsed="0.015524"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.662950" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.662512" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.646897" elapsed="0.016249"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.669438" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.665299" elapsed="0.004616"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.664941" elapsed="0.005025"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.664909" elapsed="0.005092"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.673383" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.670403" elapsed="0.003028"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.670080" elapsed="0.003386"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.670057" elapsed="0.003433"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.674103" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.673697" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.674444" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.674202" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.675099" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.674719" elapsed="0.000407"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.674527" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.674184" elapsed="0.001001"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.675767" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.675347" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.676104" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.675867" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.676718" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.676400" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.676213" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.675849" elapsed="0.000952"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:59.676956" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:59.677779" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.677468" elapsed="0.000336"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.677960" elapsed="0.002780"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:59.664068" elapsed="0.016741"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.680994" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:59.680881" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.680862" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:59.690911" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:59.681210" elapsed="0.009747"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:59.691026" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:49:59.691506" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:59.644982" elapsed="0.046590"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.691675" elapsed="0.000078"/>
</return>
<msg time="2026-04-10T00:49:59.692049" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:59.540212" elapsed="0.151882"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.693133" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.692303" elapsed="0.001034"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.692282" elapsed="0.001097"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.693473" elapsed="0.000031"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:59.529246" elapsed="0.164447"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.524747" elapsed="0.168994"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.524730" elapsed="0.169036"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.694530" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:59.694391" elapsed="0.000252"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:49:59.694798" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:59.694670" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.694372" elapsed="0.000567"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.695093" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:49:59.695218" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:59.694073" elapsed="0.001172"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.695930" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.695455" elapsed="0.000504"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.696739" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.696122" elapsed="0.000649"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.703925" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.703192" elapsed="0.000897"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.705049" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.704349" elapsed="0.000860"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:59.716994" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:59.717055" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:59 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:59 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Leader","LastApplied":43,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":43},{"timeSinceLastActivity":"00:00:00.026","active":true,"matchIndex":43,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":44}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"1.726 ms","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":10171},"timestamp":1775782199,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:59.717271" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:59.707784" elapsed="0.009524"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.705328" elapsed="0.012039"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.717778" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.717429" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.705295" elapsed="0.012694"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.726071" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Leader","LastApplied":43,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":43},{"timeSinceLastActivity":"00:00:00.026","active":true,"matchIndex":43,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":44}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"1.726 ms","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":10171},"timestamp":1775782199,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.720230" elapsed="0.005977"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.719997" elapsed="0.006289"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.719950" elapsed="0.006438"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.730353" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.727279" elapsed="0.003121"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.726762" elapsed="0.003673"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.726657" elapsed="0.003824"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.731212" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.730769" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.731716" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.731445" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.732298" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.731986" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.731819" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.731371" elapsed="0.001035"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.733108" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.732680" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.733568" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.733311" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.734140" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.733834" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.733669" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.733265" elapsed="0.000977"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:59.734490" elapsed="0.000463"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:59.735609" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.735215" elapsed="0.000446"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.735913" elapsed="0.002500"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:59.718871" elapsed="0.019653"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.738916" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:59.738689" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.738656" elapsed="0.000409"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:59.742906" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:59.739332" elapsed="0.003667"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:59.743121" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:49:59.743447" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:59.697821" elapsed="0.045656"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.743537" elapsed="0.000078"/>
</return>
<msg time="2026-04-10T00:49:59.743744" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:59.696998" elapsed="0.046771"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.745063" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.744361" elapsed="0.000731"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:59.745141" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:59.745315" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:59.743996" elapsed="0.001346"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:59.745893" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 43, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.745506" elapsed="0.000415"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:59.746311" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.746079" elapsed="0.000258"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:59.746385" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:59.746538" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:59.522825" elapsed="0.223766"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:59.746652" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:49:59.746803" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:59.522073" elapsed="0.224755"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.747128" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.746909" elapsed="0.000276"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.747440" elapsed="0.000251"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.747208" elapsed="0.000521"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.747900" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.747753" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.746892" elapsed="0.001081"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:59.521902" elapsed="0.226095"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.750498" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.750041" elapsed="0.000484"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:59.750600" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:59.750749" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:59.749676" elapsed="0.001097"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.808438" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.808056" elapsed="0.000411"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.809315" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:59.809034" elapsed="0.000355">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:59.809483" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:59.808692" elapsed="0.000817"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.810079" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:59.809690" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.810409" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:49:59.810608" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:49:59.810270" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.811042" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.810796" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.812063" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.811807" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.812537" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.812270" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.812907" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.813113" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.813290" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:49:59.812769" elapsed="0.000579"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.812630" elapsed="0.000748"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:49:59.813421" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:59.813598" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:49:59.811465" elapsed="0.002159"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.811158" elapsed="0.002499"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.813831" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.813681" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.811138" elapsed="0.002771"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.814483" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.814053" elapsed="0.000457"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.814575" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:49:59.807395" elapsed="0.007306"/>
</kw>
<msg time="2026-04-10T00:49:59.814756" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:59.794734" elapsed="0.020073"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.827579" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.839883" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.852464" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.852715" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.852904" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.853362" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.853205" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:49:59.853187" 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-04-10T00:49:59.853613" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.853784" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.853950" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:49:59.853143" elapsed="0.000859"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.852997" elapsed="0.001034"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.854181" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.854262" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:49:59.854662" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:49:59.790380" elapsed="0.064321"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.856587" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:59.856268" elapsed="0.000398">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:59.856759" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:59.855872" elapsed="0.000911"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.857118" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.856853" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.857700" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.857386" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.857201" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.856835" elapsed="0.000948"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.860200" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:59.857934" elapsed="0.002292"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:49:59.860278" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:49:59.860798" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:59.855323" elapsed="0.005512"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:49:59.862536" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:49:59.862292" elapsed="0.000337">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:49:59.862725" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:49:59.861953" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:49:59.862957" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:59.862821" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.862802" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.863188" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.863360" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.863426" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:49:59.865734" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:49:59.861494" elapsed="0.004275"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.867646" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.867310" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.868091" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.867849" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:59.884600" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:59.885042" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:49:59.885394" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:59.870239" elapsed="0.015224"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.868200" elapsed="0.017413"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.886070" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.885682" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.868181" elapsed="0.018094"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.895616" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.888829" elapsed="0.007543"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.888264" elapsed="0.008144"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.888219" elapsed="0.008214"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.899108" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.896732" elapsed="0.002421"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.896490" elapsed="0.002698"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.896473" elapsed="0.002739"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.899814" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.899389" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.900150" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.899911" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.900720" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.900401" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.900233" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.899894" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.901323" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.900964" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.901671" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.901421" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.902303" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.902002" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.901753" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.901403" elapsed="0.000984"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:59.902540" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:59.903360" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.903074" elapsed="0.000311"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.903594" elapsed="0.002481"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:59.887174" elapsed="0.018965"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.906316" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:59.906210" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.906191" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:59.914684" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:59.906537" elapsed="0.008177"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:59.914766" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:49:59.915111" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:59.866359" elapsed="0.048789"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.915239" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:49:59.915623" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:59.766008" elapsed="0.149659"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.916645" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.915864" elapsed="0.000950"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.915845" elapsed="0.001011"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.916944" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:59.755132" elapsed="0.162010"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.750840" elapsed="0.166347"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.750822" elapsed="0.166390"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.917953" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:59.917825" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:49:59.918195" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:49:59.918074" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.917807" elapsed="0.000522"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.918478" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:49:59.918616" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:49:59.917508" elapsed="0.001133"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.919217" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.918812" elapsed="0.000431"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.920048" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.919399" elapsed="0.000679"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.927304" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.926607" elapsed="0.000865"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.928478" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.927787" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:49:59.937569" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:49:59.937658" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:49:59 GMT', 'Expires': 'Thu, 09 Apr 2026 23:49:59 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":43,"LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.054","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"353.9 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":10171},"timestamp":1775782199,"status":200} 
 </msg>
<msg time="2026-04-10T00:49:59.937958" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:49:59.931140" elapsed="0.006868"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.928822" elapsed="0.009266"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.938637" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.938175" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.928788" elapsed="0.010071"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.945534" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":43,"LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.054","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"353.9 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":10171},"timestamp":1775782199,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.941933" elapsed="0.003818"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.941531" elapsed="0.004270"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.941466" elapsed="0.004399"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.949362" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:49:59.946386" elapsed="0.003024"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.946057" elapsed="0.003389"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.945994" elapsed="0.003499"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.950253" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.949792" elapsed="0.000513"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.950764" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.950464" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.951344" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.951032" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.950866" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.950418" elapsed="0.001029"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.952165" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.951741" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.952624" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.952368" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.953187" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.952888" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.952724" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.952322" elapsed="0.000966"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:49:59.953537" elapsed="0.000442"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:49:59.954601" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.954239" elapsed="0.000414"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.954907" elapsed="0.002495"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:49:59.940041" elapsed="0.017472"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:49:59.957887" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:49:59.957662" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.957629" elapsed="0.000410"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:49:59.961797" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:49:59.958271" elapsed="0.003619"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:49:59.961978" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:49:59.962262" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:49:59.921113" elapsed="0.041177"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:49:59.962393" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:59.962563" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:49:59.920294" elapsed="0.042297"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.964054" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:49:59.963250" elapsed="0.000834"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:49:59.964133" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:49:59.964311" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757821...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:49:59.962840" elapsed="0.001498"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:59.964737" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 43, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.964496" elapsed="0.000269"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:49:59.965156" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.964921" elapsed="0.000261"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:49:59.965229" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:49:59.965382" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:59.749062" elapsed="0.216344"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:49:59.965464" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:49:59.965631" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:59.748333" elapsed="0.217323"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.965958" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.965738" elapsed="0.000448"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.966358" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.966210" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.966595" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.966436" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.965721" elapsed="0.000948"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:49:59.748163" elapsed="0.218530"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:59.521697" elapsed="0.445030"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:59.966771" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:49:59.966973" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:49:59.967019" level="INFO">${follower_list} = [3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:49:59.517559" elapsed="0.449484"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.967620" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:49:59.967706" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:49:59.967237" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:49:59.968029" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:49:59.967809" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.967791" elapsed="0.000317"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.971983" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:49:59.968246" elapsed="0.003798"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:49:59.972471" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:49:59.972269" elapsed="0.000230"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:49:59.972565" 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="PASS" start="2026-04-10T00:49:59.514847" elapsed="0.457881"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:49:59.514615" elapsed="0.458161"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.977302" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:59.976900" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.977810" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:59.977492" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:49:59.977882" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:49:59.978039" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:49:59.976509" elapsed="0.001555"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:49:59.978219" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.978886" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:49:59.978536" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.979310" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:59.979072" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.979764" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:49:59.979490" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:49:59.982526" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:49:59.982044" elapsed="0.000536"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:49:59.982629" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:49:59.982784" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:49:59.981636" elapsed="0.001174"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.043398" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.042979" elapsed="0.000453"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:00.044267" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:00.043997" elapsed="0.000346">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:00.044436" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:00.043641" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.045036" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:00.044647" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:00.045374" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:00.045535" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:00.045229" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.046058" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.045805" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.047132" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.046873" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.047665" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.047344" elapsed="0.000348"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.048027" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.048244" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.048423" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:00.047887" elapsed="0.000597"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.047747" elapsed="0.000768"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:00.048581" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:50:00.048755" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:00.046528" elapsed="0.002252"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.046184" elapsed="0.002629"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.048992" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.048840" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.046161" elapsed="0.002910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.049694" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.049218" elapsed="0.000504"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:00.049772" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:00.042277" elapsed="0.007621"/>
</kw>
<msg time="2026-04-10T00:50:00.049954" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:00.029432" elapsed="0.020580"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.062687" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.075238" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.087946" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.088153" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.088336" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.088830" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.088677" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:00.088661" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.089056" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.089227" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.089402" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:00.088628" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.088502" elapsed="0.000980"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.089646" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.089725" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:00.090027" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:00.024700" elapsed="0.065363"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:00.091961" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:00.091533" elapsed="0.000504">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:00.092132" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:00.091173" elapsed="0.000984"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.092487" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.092230" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.093065" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.092768" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.092589" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.092212" elapsed="0.000936"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.095487" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:00.093300" elapsed="0.002214"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:00.095642" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:00.095949" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:00.090709" elapsed="0.005275"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:00.097804" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:00.097367" elapsed="0.000502">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:00.097962" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:00.097024" elapsed="0.000964"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:00.098197" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:00.098060" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.098042" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.098431" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.098620" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.098688" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:00.101018" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:00.096587" elapsed="0.004468"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.102860" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.102601" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.103303" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.103061" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:00.115933" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:00.116419" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:00.116957" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:00.105584" elapsed="0.011434"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.103412" elapsed="0.013703"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.117516" elapsed="0.000084"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.117174" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.103394" elapsed="0.014350"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.126317" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.120092" elapsed="0.006963"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.119522" elapsed="0.007614"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.119480" elapsed="0.007711"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.130555" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.127916" elapsed="0.002689"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.127320" elapsed="0.003319"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.127281" elapsed="0.003382"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.131223" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.130837" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.131576" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.131321" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.132151" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.131845" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.131679" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.131303" elapsed="0.000933"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.132866" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.132398" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.133201" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.132965" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.133769" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.133443" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.133282" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.132947" elapsed="0.000906"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:00.134007" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:00.134828" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.134522" elapsed="0.000332"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.135010" elapsed="0.002492"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:00.118593" elapsed="0.018995"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.137772" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:00.137662" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.137643" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:00.146301" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:00.137988" elapsed="0.008344"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:00.146385" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:00.146767" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:00.101665" elapsed="0.045141"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:00.146900" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:50:00.147247" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:49:59.999173" elapsed="0.148117"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.148288" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.147484" elapsed="0.000980"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.147464" elapsed="0.001042"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:00.148616" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:49:59.987181" elapsed="0.161632"/>
</kw>
<status status="PASS" start="2026-04-10T00:49:59.982886" elapsed="0.165973"/>
</branch>
<status status="PASS" start="2026-04-10T00:49:59.982867" elapsed="0.166018"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.149629" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:00.149483" elapsed="0.000241"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:00.149870" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:00.149749" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.149465" elapsed="0.000540"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.150155" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:00.150275" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:00.149179" elapsed="0.001122"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.150906" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.150475" elapsed="0.000458"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.151692" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.151090" elapsed="0.000630"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.158814" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.158094" elapsed="0.000887"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.160006" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.159244" elapsed="0.000925"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:00.171538" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:00.171744" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:00 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":3,"SnapshotIndex":106,"InMemoryJournalLogSize":9,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-default-operational","LastIndex":115,"RaftState":"Leader","LastApplied":113,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":115,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.447","active":true,"matchIndex":113,"voting":true,"id":"member-3-shard-default-operational","nextIndex":114},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-default-operational","nextIndex":107}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"590.9 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":113,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":2,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":92956},"timestamp":1775782200,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:00.172110" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:00.162648" elapsed="0.009517"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.160289" elapsed="0.011961"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.172845" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.172340" elapsed="0.000655"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.160256" elapsed="0.012873"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.180145" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":3,"SnapshotIndex":106,"InMemoryJournalLogSize":9,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-default-operational","LastIndex":115,"RaftState":"Leader","LastApplied":113,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":115,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.447","active":true,"matchIndex":113,"voting":true,"id":"member-3-shard-default-operational","nextIndex":114},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-default-operational","nextIndex":107}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"590.9 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":113,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":2,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":92956},"timestamp":1775782200,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.176276" elapsed="0.003963"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.175940" elapsed="0.004351"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.175872" elapsed="0.004486"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.184617" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.180920" elapsed="0.003771"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.180580" elapsed="0.004163"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.180492" elapsed="0.004319"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.185946" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.185207" elapsed="0.000814"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.186621" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.186242" elapsed="0.000463"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.187436" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.186996" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.186764" elapsed="0.000764"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.186174" elapsed="0.001433"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.188565" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.188022" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.189010" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.188769" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.189600" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.189275" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.189111" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.188722" elapsed="0.000980"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:00.189948" elapsed="0.000430"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:00.190995" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.190653" elapsed="0.000393"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.191292" elapsed="0.002498"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:00.174341" elapsed="0.019561"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.194265" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:00.194037" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.194004" elapsed="0.000413"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:00.198316" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:00.194670" elapsed="0.003741"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:00.198563" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:50:00.198854" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:00.152713" elapsed="0.046169"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:00.198942" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:00.199093" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:00.151935" elapsed="0.047184"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.200657" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578220...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.199772" elapsed="0.000916"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:00.200738" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:00.200920" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578220...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:00.199351" elapsed="0.001596"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:00.201336" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 113, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.201105" elapsed="0.000259"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:00.201823" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.201522" elapsed="0.000327"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:00.201897" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:00.202052" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:59.980942" elapsed="0.221134"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:00.202133" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:00.202282" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:49:59.980211" elapsed="0.222094"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.202619" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.202386" elapsed="0.000290"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.202907" elapsed="0.000187"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.202699" elapsed="0.000432"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.203300" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.203154" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.202369" elapsed="0.001005"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:49:59.980043" elapsed="0.223354"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.205972" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.205468" elapsed="0.000532"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:00.206045" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:00.206194" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:00.205101" elapsed="0.001118"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.264353" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.263954" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:00.265268" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:00.265005" elapsed="0.000338">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:00.265438" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:00.264653" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.266044" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:00.265654" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:00.266379" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:00.266531" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:00.266236" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.266982" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.266735" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.268051" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.267794" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.268530" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.268261" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.268906" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.269113" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.269289" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:00.268766" elapsed="0.000582"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.268625" elapsed="0.000758"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:00.269430" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:00.269612" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:00.267420" elapsed="0.002219"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.267104" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.269847" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.269697" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.267082" elapsed="0.002842"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.270505" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.270071" elapsed="0.000461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:00.270596" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:00.263258" elapsed="0.007464"/>
</kw>
<msg time="2026-04-10T00:50:00.270777" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:00.250656" elapsed="0.020173"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.283345" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.295787" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.308165" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.308362" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.308538" elapsed="0.000035"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.308923" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.308778" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:00.308763" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.309142" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.309310" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.309477" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:00.308732" elapsed="0.000798"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.308630" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.309720" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.309795" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:00.310082" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:00.246302" elapsed="0.063816"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:00.311842" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:00.311558" elapsed="0.000352">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:00.312003" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:00.311194" elapsed="0.000833"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.312373" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.312098" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.312949" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.312655" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.312457" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.312080" elapsed="0.000953"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.315408" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:00.313184" elapsed="0.002251"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:00.315486" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:00.315831" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:00.310754" elapsed="0.005113"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:00.317598" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:00.317313" elapsed="0.000350">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:00.317757" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:00.316973" elapsed="0.000808"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:00.317987" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:00.317853" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.317834" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.318218" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.318387" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.318452" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:00.320692" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:00.316518" elapsed="0.004211"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.322515" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.322261" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.323122" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.322878" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:00.341816" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:00.342760" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:00.343215" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:00.325304" elapsed="0.017973"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.323230" elapsed="0.020143"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.343846" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.343433" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.323213" elapsed="0.020828"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.352448" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.346325" elapsed="0.006496"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.345831" elapsed="0.007027"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.345789" elapsed="0.007094"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.355519" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.353167" elapsed="0.002413"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.352940" elapsed="0.002675"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.352923" elapsed="0.002716"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.356215" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.355829" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.356564" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.356312" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.357111" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.356811" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.356647" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.356294" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.357735" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.357355" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.358063" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.357831" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.358614" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.358304" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.358144" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.357814" elapsed="0.000882"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:00.358845" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:00.359658" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.359351" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.359857" elapsed="0.002474"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:00.344861" elapsed="0.017535"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.362588" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:00.362467" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.362449" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:00.370861" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:00.362804" elapsed="0.008087"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:00.370943" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:00.371320" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:00.321319" elapsed="0.050048"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:00.371476" elapsed="0.000109"/>
</return>
<msg time="2026-04-10T00:50:00.371949" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:00.221467" elapsed="0.150531"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.372945" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.372200" elapsed="0.000903"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.372180" elapsed="0.000964"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:00.373233" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:00.210578" elapsed="0.162848"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.206286" elapsed="0.167186"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.206269" elapsed="0.167228"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.374214" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:00.374088" elapsed="0.000222"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:00.374455" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:00.374335" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.374070" elapsed="0.000536"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.374756" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:00.374876" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:00.373800" elapsed="0.001102"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.375474" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.375069" elapsed="0.000432"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.376261" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.375677" elapsed="0.000613"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.383282" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.382602" elapsed="0.000841"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.384405" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.383716" elapsed="0.000901"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:00.393277" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:00.393337" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:00 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":106,"InMemoryJournalLogSize":11,"ReplicatedToAllIndex":106,"Leader":"member-1-shard-default-operational","LastIndex":117,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":117,"LastLogIndex":117,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"254.1 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":117,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":93038},"timestamp":1775782200,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:00.393564" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:00.387048" elapsed="0.006554"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.384736" elapsed="0.008923"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.394037" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.393720" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.384703" elapsed="0.009490"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.400130" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":106,"InMemoryJournalLogSize":11,"ReplicatedToAllIndex":106,"Leader":"member-1-shard-default-operational","LastIndex":117,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":117,"LastLogIndex":117,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"254.1 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":117,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":93038},"timestamp":1775782200,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.396360" elapsed="0.003858"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.396092" elapsed="0.004177"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.396045" elapsed="0.004288"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.404230" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.400876" elapsed="0.003417"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.400524" elapsed="0.003817"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.400461" elapsed="0.003941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.405210" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.404772" elapsed="0.000489"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.405671" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.405413" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.406249" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.405941" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.405773" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.405367" elapsed="0.000984"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.407039" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.406619" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.407508" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.407263" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.408232" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.407811" elapsed="0.000447"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.407625" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.407214" elapsed="0.001121"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:00.408610" elapsed="0.000427"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:00.409650" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.409296" elapsed="0.000404"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.409949" elapsed="0.002469"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:00.395018" elapsed="0.017508"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.412905" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:00.412680" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.412647" elapsed="0.000408"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:00.416701" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:00.413286" elapsed="0.003509"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:00.416882" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:00.417160" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:00.377301" elapsed="0.039887"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:00.417281" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:00.417434" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:00.376510" elapsed="0.040950"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.418774" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578220...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.418069" elapsed="0.000734"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:00.418852" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:00.419029" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578220...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:00.417704" elapsed="0.001351"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:00.419437" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 117, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.419212" elapsed="0.000253"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:00.419896" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.419638" elapsed="0.000283"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:00.419968" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:00.420121" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:00.204485" elapsed="0.215661"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:00.420203" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:00.420351" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:00.203773" elapsed="0.216601"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.420740" elapsed="0.000191"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.420454" elapsed="0.000514"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.421136" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.420992" elapsed="0.000198"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.421353" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.421213" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.420437" elapsed="0.000988"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:00.203577" elapsed="0.217872"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:49:59.979840" elapsed="0.441642"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:00.421524" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:50:00.421742" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:50:00.421788" level="INFO">${follower_list} = [3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:49:59.975793" elapsed="0.446019"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.422254" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:00.422330" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:00.421987" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.422653" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.422423" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.422405" elapsed="0.000326"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.424976" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:00.422868" elapsed="0.002156"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:00.425428" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.425238" elapsed="0.000216"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:00.425501" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:49:59.973113" elapsed="0.452563"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:49:59.972869" elapsed="0.452854"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:49:59.028837" elapsed="1.396919"/>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:49:59.028417" elapsed="1.397394"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.431151" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:00.430769" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.431656" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:00.431338" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:00.431728" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:00.431922" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:00.430202" elapsed="0.001745"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:00.432102" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.432764" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:00.432416" elapsed="0.000374"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.433182" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:00.432948" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.433604" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:00.433355" elapsed="0.000274"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.436247" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.435762" elapsed="0.000512"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:00.436320" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:00.436473" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:00.435369" elapsed="0.001128"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.495952" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.495522" elapsed="0.000464"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:00.496780" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:00.496502" elapsed="0.000358">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:00.496956" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:00.496159" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.497529" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:00.497147" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:00.497878" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:00.498101" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:00.497736" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.498537" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.498287" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.499579" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.499306" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.500096" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.499788" 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-04-10T00:50:00.500470" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.500702" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.500882" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:00.500325" elapsed="0.000616"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.500179" elapsed="0.000795"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:00.501023" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:00.501192" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:00.498981" elapsed="0.002236"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.498678" elapsed="0.002572"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.501422" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.501275" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.498654" elapsed="0.002846"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.502106" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.501663" elapsed="0.000471"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:00.502182" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:00.494899" elapsed="0.007407"/>
</kw>
<msg time="2026-04-10T00:50:00.502360" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:00.482196" elapsed="0.020216"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.515139" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.527530" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.540039" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.540309" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.540491" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.540913" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.540762" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:00.540746" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.541139" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.541312" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.541753" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:00.540704" elapsed="0.001120"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.540592" elapsed="0.001266"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.542016" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.542097" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:50:00.542458" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:00.477751" elapsed="0.064760"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:00.544427" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:00.544124" elapsed="0.000378">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:00.544614" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:00.543676" elapsed="0.000964"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.544971" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.544712" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.545525" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.545229" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.545051" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.544693" elapsed="0.000931"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.548006" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:00.545775" elapsed="0.002258"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:00.548084" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:00.548399" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:00.543188" elapsed="0.005246"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:00.550190" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:00.549940" elapsed="0.000313">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:00.550347" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:00.549600" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:00.550635" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:00.550451" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.550432" elapsed="0.000288"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.550924" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.551101" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.551167" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:00.553488" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:00.549046" elapsed="0.004479"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.555345" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.555086" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.555804" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.555560" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:00.568568" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:00.569156" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:00.569458" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:00.558200" elapsed="0.011297"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.555948" elapsed="0.013632"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.569840" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.569620" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.555930" elapsed="0.014031"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.575487" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.571500" elapsed="0.004476"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.571090" elapsed="0.004936"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.571057" elapsed="0.005004"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.579774" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.576467" elapsed="0.003372"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.576150" elapsed="0.003778"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.576118" elapsed="0.003844"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.580659" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.580203" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.580995" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.580757" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.581564" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.581240" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.581077" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.580739" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.582172" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.581810" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.582509" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.582270" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.583069" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.582773" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.582610" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.582252" elapsed="0.000901"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:00.583305" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:00.584162" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.583837" elapsed="0.000352"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.584346" elapsed="0.002392"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:00.570464" elapsed="0.016336"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.586977" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:00.586870" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.586852" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:00.595451" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:00.587195" elapsed="0.008287"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:00.595535" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:50:00.595906" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:00.554133" elapsed="0.041811"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:00.596035" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:50:00.596377" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:00.453120" elapsed="0.143299"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.597372" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.596641" elapsed="0.000895"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.596622" elapsed="0.000973"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:00.597686" elapsed="0.000031"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:00.441964" elapsed="0.155922"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.436584" elapsed="0.161349"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.436565" elapsed="0.161393"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:50:00.598686" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:00.598555" elapsed="0.000243"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.598863" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:00.598825" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.598522" elapsed="0.000455"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.599129" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:00.599251" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:00.598248" elapsed="0.001030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.599991" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.599448" elapsed="0.000571"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.600763" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.600180" elapsed="0.000611"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.607855" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.607142" elapsed="0.000911"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.609013" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.608315" elapsed="0.000858"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:00.618952" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:00.619036" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:00 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":null,"LastIndex":40024,"RaftState":"Candidate","LastApplied":40024,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:49:55.617","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"357.1 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":3420},"timestamp":1775782200,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:00.619327" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:00.611665" elapsed="0.007712"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.609297" elapsed="0.010160"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.620032" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.619541" elapsed="0.000634"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.609263" elapsed="0.010989"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.626830" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":null,"LastIndex":40024,"RaftState":"Candidate","LastApplied":40024,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:49:55.617","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"357.1 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":3420},"timestamp":1775782200,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.623149" elapsed="0.003818"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.622834" elapsed="0.004184"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.622770" elapsed="0.004311"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.631142" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:00.627616" elapsed="0.003594"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.627271" elapsed="0.003988"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.627209" elapsed="0.004113"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.632353" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.631719" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.632994" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.632653" elapsed="0.000424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.633810" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.633362" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.633133" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.632588" elapsed="0.001364"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.634905" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.634301" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.635518" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.635183" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.636386" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:00.635968" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:00.635700" elapsed="0.000749"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.635120" elapsed="0.001370"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:00.636757" elapsed="0.000425"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:00.637801" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.637442" elapsed="0.000410"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.638101" elapsed="0.002514"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:00.621377" elapsed="0.019352"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.641184" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:00.640860" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:00.640827" elapsed="0.000511"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:00.644991" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:00.641592" elapsed="0.003495"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:00.645175" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:00.645458" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:00.601828" elapsed="0.043658"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:00.645561" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:00.645716" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:00.601008" elapsed="0.044734"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.647061" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782200, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:00.646338" elapsed="0.000753"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:00.647179" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:00.647359" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782200, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:00.645968" elapsed="0.001418"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:00.647789" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 40024, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInit...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.647560" elapsed="0.000257"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:00.648237" level="INFO">${raft_property} = Candidate</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:00.648001" elapsed="0.000263"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:00.648312" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:00.648468" level="INFO">${raft_state} = Candidate</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:00.434769" elapsed="0.213724"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:00.648579" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:00.648730" level="INFO">${raft_state} = Candidate</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:00.434042" elapsed="0.214713"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.649055" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.648836" elapsed="0.000276"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.649343" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.649136" elapsed="0.000263"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:50:00.649957" level="FAIL">Unrecognized Raft state: Candidate</msg>
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:50:00.649635" elapsed="0.000389">Unrecognized Raft state: Candidate</status>
</kw>
<status status="FAIL" start="2026-04-10T00:50:00.649424" elapsed="0.000668">Unrecognized Raft state: Candidate</status>
</branch>
<status status="FAIL" start="2026-04-10T00:50:00.648819" elapsed="0.001304">Unrecognized Raft state: Candidate</status>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-10T00:50:00.433875" elapsed="0.216301">Unrecognized Raft state: Candidate</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:50:00.433676" elapsed="0.216561">Unrecognized Raft state: Candidate</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.650292" 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-04-10T00:50:00.429477" elapsed="0.220925">Unrecognized Raft state: Candidate</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.650609" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.650846" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:00.650702" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:00.650685" 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-04-10T00:50:00.651058" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:00.651232" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:00.651297" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-10T00:50:00.426809" elapsed="0.224590">Unrecognized Raft state: Candidate</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-10T00:50:00.426585" elapsed="0.224884">Unrecognized Raft state: Candidate</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-10T00:50:00.426438" elapsed="0.225086">Unrecognized Raft state: Candidate</status>
</for>
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-10T00:50:00.426049" elapsed="0.225581">Unrecognized Raft state: Candidate</status>
</kw>
<arg>${Inventory_Followers}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-10T00:49:59.000347" elapsed="1.651428">Unrecognized Raft state: Candidate</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:02.679305" elapsed="0.000279"/>
</kw>
<msg time="2026-04-10T00:50:02.679650" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:02.678642" elapsed="0.001070"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:50:02.678158" elapsed="0.001636"/>
</kw>
<msg time="2026-04-10T00:50:02.679841" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:02.669113" elapsed="0.010774"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:50:02.668443" elapsed="0.011522"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.680423" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:02.680156" elapsed="0.000314"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.685776" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:02.685365" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.686278" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:02.685969" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:02.686352" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:02.686514" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:02.684931" elapsed="0.001608"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:02.686715" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.687371" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:02.687033" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.687847" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:02.687588" elapsed="0.000286"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.688279" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:02.688026" elapsed="0.000280"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.691231" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:02.690754" elapsed="0.000505"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:02.691305" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:02.691458" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:02.690311" elapsed="0.001173"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.749906" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:02.749420" elapsed="0.000517"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:02.750777" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:02.750449" elapsed="0.000408">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:02.751023" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:02.750104" elapsed="0.000945"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.751714" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:02.751218" elapsed="0.000538"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:02.752215" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:02.752383" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:02.752018" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.752863" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:02.752603" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.753994" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:02.753730" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.754486" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:02.754209" elapsed="0.000304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.755054" 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-04-10T00:50:02.755271" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.755450" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:02.754731" elapsed="0.000779"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:02.754584" elapsed="0.000972"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:02.755607" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:50:02.755779" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:02.753373" elapsed="0.002432"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.752990" elapsed="0.002847"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.756013" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:02.755862" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.752967" elapsed="0.003124"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.756695" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:02.756235" elapsed="0.000487"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:02.756773" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:02.748677" elapsed="0.008264"/>
</kw>
<msg time="2026-04-10T00:50:02.757043" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:02.736060" elapsed="0.021041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.770022" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.782186" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.794444" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.794654" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.794831" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.795209" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:02.795062" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:02.795047" 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-04-10T00:50:02.795430" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.795614" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.795782" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:02.795016" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:02.794909" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.796012" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:02.796089" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:02.796381" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:02.731627" elapsed="0.064792"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:02.798162" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:02.797896" elapsed="0.000338">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:02.798326" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:02.797526" elapsed="0.000825"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.798690" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:02.798422" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.799246" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:02.798950" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.798773" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.798404" elapsed="0.000928"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.801697" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:02.799483" elapsed="0.002241"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:02.801776" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:02.802082" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:02.797081" elapsed="0.005036"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:02.803751" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:02.803495" elapsed="0.000320">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:02.803945" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:02.803156" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:02.804178" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:02.804043" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.804026" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.804410" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.804598" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:02.804665" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:02.806960" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:02.802719" elapsed="0.004277"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.808858" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:02.808584" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.809335" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:02.809090" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:02.818901" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:02.819329" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:02.819540" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:02.811514" elapsed="0.008075"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.809448" elapsed="0.010184"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.819816" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:02.819660" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.809429" elapsed="0.010473"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.823710" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:02.820940" elapsed="0.003107"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.820718" elapsed="0.003365"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.820699" elapsed="0.003409"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.826805" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:02.824389" elapsed="0.002463"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.824164" elapsed="0.002722"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.824147" elapsed="0.002763"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.827468" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:02.827085" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.827822" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:02.827582" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.828371" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:02.828069" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.827905" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.827562" elapsed="0.000892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.828987" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:02.828629" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.829354" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:02.829118" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.829902" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:02.829609" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.829433" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.829099" elapsed="0.000885"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:02.830136" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:02.830949" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:02.830657" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:02.831129" elapsed="0.002501"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:02.820277" elapsed="0.013417"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:02.833871" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:02.833765" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.833746" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:02.842752" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:02.834086" elapsed="0.008696"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:02.842835" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:02.843164" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:02.807598" elapsed="0.035604"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:02.843292" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:50:02.843657" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:02.706700" elapsed="0.137000"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.844647" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:02.843896" elapsed="0.000910"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.843877" elapsed="0.000969"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:02.844937" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:02.695734" elapsed="0.149422"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.691597" elapsed="0.153605"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.691571" elapsed="0.153657"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:02.845972" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:02.845827" elapsed="0.000240"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:02.846212" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:02.846092" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.845810" elapsed="0.000540"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.846499" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:50:02.846636" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:02.845519" elapsed="0.001143"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.847241" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:02.846833" elapsed="0.000436"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.848013" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:02.847426" elapsed="0.000617"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.855104" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:02.854392" elapsed="0.000879"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.856311" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:02.855533" elapsed="0.000942"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:02.865705" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:02.865768" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:02 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:02 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastApplied":137,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.691","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"238.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":7926168},"timestamp":1775782202,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:02.865984" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:02.859017" elapsed="0.007003"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.856651" elapsed="0.009427"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.866520" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:02.866140" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.856617" elapsed="0.010082"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.871632" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastApplied":137,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.691","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"238.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":7926168},"timestamp":1775782202,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:02.868884" elapsed="0.002813"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.868605" elapsed="0.003128"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.868504" elapsed="0.003276"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.874695" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:02.872158" elapsed="0.002585"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.871924" elapsed="0.002855"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.871877" elapsed="0.002948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.875556" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:02.875094" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.876015" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:02.875766" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.876622" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:02.876285" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.876116" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.875719" elapsed="0.001008"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.877455" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:02.876986" elapsed="0.000521"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.877946" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:02.877696" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.878531" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:02.878217" elapsed="0.000377"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.878048" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.877646" elapsed="0.001032"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:02.878934" elapsed="0.000433"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:02.880001" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:02.879653" elapsed="0.000400"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:02.880308" elapsed="0.002498"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:02.867515" elapsed="0.015400"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:02.883268" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:02.883045" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.883012" elapsed="0.000408"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:02.887101" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:02.883710" elapsed="0.003486"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:02.887285" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:02.887634" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:02.849096" elapsed="0.038601"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:02.887760" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:02.887920" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:02.848261" elapsed="0.039687"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.889292" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:02.888559" elapsed="0.000762"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:02.889370" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:02.889570" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:02.888175" elapsed="0.001424"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:02.889990" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 137, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:02.889761" elapsed="0.000257"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:02.890415" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:02.890176" elapsed="0.000264"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:02.890487" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:02.890672" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:02.689506" elapsed="0.201192"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:02.890758" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:02.890910" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:02.688750" elapsed="0.202184"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:02.891237" elapsed="0.000194"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.891017" elapsed="0.000452"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.891687" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:02.891498" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.891912" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:02.891768" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.890999" elapsed="0.000987"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:02.688577" elapsed="0.203434"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.894669" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:02.894166" elapsed="0.000532"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:02.894743" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:02.894895" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:02.893793" elapsed="0.001128"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.954167" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:02.953768" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:02.954998" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:02.954732" elapsed="0.000400">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:02.955234" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:02.954371" elapsed="0.000890"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.955854" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:02.955432" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:02.956208" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:02.956414" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:02.956049" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.956899" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:02.956640" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.957993" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:02.957731" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.958477" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:02.958205" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.958863" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.959076" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.959257" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:02.958722" elapsed="0.000596"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:02.958575" elapsed="0.000773"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:02.959395" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:02.959578" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:02.957382" elapsed="0.002224"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.957023" elapsed="0.002617"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.959880" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:02.959666" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.957002" elapsed="0.003000"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:02.960695" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:02.960204" elapsed="0.000519"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:02.960774" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:02.953058" elapsed="0.007845"/>
</kw>
<msg time="2026-04-10T00:50:02.960960" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:02.940389" elapsed="0.020627"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.975174" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:02.987610" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.000323" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.000635" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.000826" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.001276" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.001106" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:03.001088" elapsed="0.000271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.001502" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.001687" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.001857" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:03.001050" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.000917" elapsed="0.001022"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.002086" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.002167" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:50:03.002518" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:02.936003" elapsed="0.066587"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.004514" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.004205" elapsed="0.000402">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:03.004704" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:03.003794" elapsed="0.000936"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.005079" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.004806" elapsed="0.000370"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.005718" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.005387" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.005203" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.004787" elapsed="0.001018"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.008256" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:03.005961" elapsed="0.002324"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:03.008343" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:50:03.008708" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:03.003292" elapsed="0.005454"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.010604" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.010286" elapsed="0.000411">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:03.010868" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:03.009913" elapsed="0.000982"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:03.011118" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:50:03.010972" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.010952" elapsed="0.000253"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.011357" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.011535" elapsed="0.000090"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.011674" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:03.014041" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:03.009410" elapsed="0.004671"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.016136" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.015833" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.016683" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.016355" 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-04-10T00:50:03.036414" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:03.037437" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:03.038010" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:03.019083" elapsed="0.018991"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.016813" elapsed="0.021374"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.038688" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.038256" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.016791" elapsed="0.022097"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.046438" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.041315" elapsed="0.005460"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.040780" elapsed="0.006032"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.040737" elapsed="0.006100"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.049539" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.047122" elapsed="0.002479"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.046894" elapsed="0.002743"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.046876" elapsed="0.002785"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.050234" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.049839" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.050582" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.050331" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.051131" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.050829" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.050665" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.050313" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.051748" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.051372" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.052075" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.051844" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.052628" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.052316" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.052156" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.051826" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:03.052864" elapsed="0.000373"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:03.053720" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.053407" elapsed="0.000339"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.053901" elapsed="0.002375"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:03.039763" elapsed="0.016578"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.056563" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:03.056419" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.056395" elapsed="0.000245"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:03.065307" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:03.056790" elapsed="0.008548"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:03.065392" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:50:03.065780" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:03.014746" elapsed="0.051071"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.065910" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:50:03.066252" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:02.911149" elapsed="0.155145"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.067244" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.066485" elapsed="0.000923"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.066466" elapsed="0.000982"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.067536" 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="PASS" start="2026-04-10T00:50:02.900332" elapsed="0.167417"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:02.894990" elapsed="0.172805"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:02.894973" elapsed="0.172847"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.068531" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:03.068401" elapsed="0.000240"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:03.068790" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:03.068667" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.068383" elapsed="0.000541"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.069074" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:50:03.069216" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:03.068109" elapsed="0.001134"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.069849" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.069415" elapsed="0.000462"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.070624" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.070037" elapsed="0.000616"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.077856" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.077033" elapsed="0.000989"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.079008" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.078285" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:03.089295" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:03.089357" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:03 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:03 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":137,"LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.689","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.122","active":true,"matchIndex":137,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":138},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-operational","nextIndex":137}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"606.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":7926168},"timestamp":1775782203,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:03.089688" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:03.081763" elapsed="0.007980"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.079291" elapsed="0.010553"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.090394" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.089942" elapsed="0.000676"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.079258" elapsed="0.011448"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.098745" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":137,"LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.689","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.122","active":true,"matchIndex":137,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":138},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-operational","nextIndex":137}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"606.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":7926168},"timestamp":1775782203,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.093980" elapsed="0.004855"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.093636" elapsed="0.005248"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.093521" elapsed="0.005427"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.102583" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.099461" elapsed="0.003170"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.099140" elapsed="0.003526"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.099077" elapsed="0.003633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.103402" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.102970" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.103868" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.103627" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.104441" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.104135" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.103971" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.103579" elapsed="0.000983"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.105261" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.104823" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.105721" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.105464" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.106280" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.105983" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.105820" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.105418" elapsed="0.000963"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:03.106644" elapsed="0.000424"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:03.107679" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.107328" elapsed="0.000401"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.107979" elapsed="0.002586"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:03.091941" elapsed="0.018734"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.111036" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:03.110810" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.110776" elapsed="0.000410"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:03.115212" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:03.111417" elapsed="0.003892"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:03.115437" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:03.115747" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:03.071652" elapsed="0.044124"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.115837" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:03.115993" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:03.070870" elapsed="0.045152"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.117490" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.116681" elapsed="0.000840"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:03.117589" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:03.117809" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:03.116251" elapsed="0.001594"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:03.118252" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 137, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.118011" elapsed="0.000269"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:03.118705" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.118439" elapsed="0.000293"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:03.118786" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:03.118949" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:02.893153" elapsed="0.225822"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:03.119034" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:03.119187" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:02.892356" elapsed="0.226857"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.119519" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.119297" 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="PASS" start="2026-04-10T00:50:03.119842" elapsed="0.000194"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.119618" elapsed="0.000457"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.120250" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.120101" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.119277" elapsed="0.001051"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:02.892182" elapsed="0.228171"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:02.688355" elapsed="0.432032"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:03.120432" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:03.120705" level="INFO">${leader_list} = [3]</msg>
<msg time="2026-04-10T00:50:03.120754" level="INFO">${follower_list} = [1]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:02.684190" elapsed="0.436594"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.121282" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:03.121364" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:03.120971" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.121736" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.121460" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.121442" elapsed="0.000386"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.124126" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:03.121971" elapsed="0.002205"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:03.124537" level="INFO">${leader} = 3</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.124347" elapsed="0.000282"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:03.124680" 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="PASS" start="2026-04-10T00:50:02.681521" elapsed="0.443318"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:50:02.681288" elapsed="0.443598"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.129475" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:03.129081" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.129979" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:03.129678" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:03.130049" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:03.130202" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:03.128707" elapsed="0.001520"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:03.130381" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.131080" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:03.130744" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.131499" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:03.131264" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.131920" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:03.131689" elapsed="0.000256"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.134714" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.134166" elapsed="0.000578"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:03.134791" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:03.134945" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:03.133779" elapsed="0.001191"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.193076" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.192684" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.193923" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.193659" elapsed="0.000340">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:03.194092" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:03.193308" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.194695" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:03.194286" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.195023" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:03.195243" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:03.194884" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.195691" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.195426" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.196765" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.196493" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.197258" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.196974" 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-04-10T00:50:03.197631" elapsed="0.000169"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.197986" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.198164" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:03.197478" elapsed="0.000744"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.197337" elapsed="0.000916"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:03.198298" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:03.198463" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:03.196160" elapsed="0.002328"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.195813" elapsed="0.002708"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.198715" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.198562" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.195790" elapsed="0.003002"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.199375" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.198938" elapsed="0.000465"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.199452" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:03.192010" elapsed="0.007582"/>
</kw>
<msg time="2026-04-10T00:50:03.199647" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:03.179388" elapsed="0.020311"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.212169" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.224442" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.236878" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.237178" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.237378" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.237791" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.237640" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:03.237624" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.238018" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.238189" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.238358" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:03.237589" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.237462" elapsed="0.000977"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.238608" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.238688" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:03.238997" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:03.174953" elapsed="0.064081"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.240802" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.240507" elapsed="0.000367">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:03.240968" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:03.240135" 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-04-10T00:50:03.241351" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.241065" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.241924" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.241629" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.241435" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.241047" elapsed="0.000960"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.244314" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:03.242159" elapsed="0.002183"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:03.244393" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:03.244756" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:03.239682" elapsed="0.005109"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.246441" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.246198" elapsed="0.000306">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:03.246614" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:03.245860" elapsed="0.000779"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:03.246845" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:03.246711" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.246693" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.247117" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.247291" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.247359" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:03.249646" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:03.245398" elapsed="0.004285"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.251490" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.251229" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.251951" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.251709" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:03.265165" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:03.266188" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:03.266718" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:03.254655" elapsed="0.012126"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.252061" elapsed="0.014828"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.267318" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.266957" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.252043" elapsed="0.015476"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.274832" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.269997" elapsed="0.005160"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.269459" elapsed="0.005736"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.269415" elapsed="0.005804"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.277975" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.275504" elapsed="0.002518"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.275276" elapsed="0.002781"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.275258" elapsed="0.002822"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.278680" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.278267" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.279015" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.278777" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.279581" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.279261" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.279096" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.278759" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.280185" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.279827" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.280512" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.280280" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.281081" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.280785" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.280610" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.280263" elapsed="0.000900"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:03.281335" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:03.282170" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.281872" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.282350" elapsed="0.002493"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:03.268409" elapsed="0.016500"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.285091" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:03.284981" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.284962" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:03.293523" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:03.285338" elapsed="0.008232"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:03.293625" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:50:03.293982" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:03.250281" elapsed="0.043737"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.294112" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:50:03.294469" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:03.150266" elapsed="0.144246"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.295476" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.294734" elapsed="0.000928"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.294714" elapsed="0.000990"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.295793" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:03.139262" elapsed="0.156732"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.135040" elapsed="0.161001"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.135022" elapsed="0.161045"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.296810" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:03.296681" elapsed="0.000223"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:03.297048" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:03.296929" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.296662" elapsed="0.000519"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.297349" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:03.297471" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:03.296355" elapsed="0.001141"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.298090" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.297685" elapsed="0.000431"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.298851" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.298274" elapsed="0.000607"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.305933" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.305195" elapsed="0.000902"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.307064" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.306356" elapsed="0.000865"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:03.317386" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:03.317449" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:03 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:03 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Leader","LastApplied":43,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":43},{"timeSinceLastActivity":"00:00:00.508","active":true,"matchIndex":43,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":44}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"475.3 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":10171},"timestamp":1775782203,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:03.317682" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:03.309722" elapsed="0.007996"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.307338" elapsed="0.010447"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.318162" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.317845" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.307306" elapsed="0.011046"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.323197" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Leader","LastApplied":43,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":43},{"timeSinceLastActivity":"00:00:00.508","active":true,"matchIndex":43,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":44}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"475.3 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":10171},"timestamp":1775782203,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.320412" elapsed="0.002874"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.320185" elapsed="0.003151"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.320138" elapsed="0.003260"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.327245" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.323939" elapsed="0.003369"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.323617" elapsed="0.003740"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.323527" elapsed="0.003891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.328524" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.327928" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.329167" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.328830" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.330033" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.329608" elapsed="0.000462"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.329348" elapsed="0.000772"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.328766" elapsed="0.001410"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.330957" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.330524" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.331393" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.331155" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.331976" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.331678" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.331490" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.331110" elapsed="0.000966"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:03.332315" elapsed="0.000435"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:03.333348" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.333005" elapsed="0.000395"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.333678" elapsed="0.002448"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:03.319159" elapsed="0.017072"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.336596" elapsed="0.000193"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:03.336362" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.336329" elapsed="0.000560"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:03.340658" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:03.337119" elapsed="0.003634"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:03.340883" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:03.341161" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:03.299907" elapsed="0.041282"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.341247" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:03.341420" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:03.299096" elapsed="0.042350"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.342780" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.342052" elapsed="0.000757"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:03.342858" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:03.343036" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:03.341687" elapsed="0.001376"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:03.343447" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 43, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.343220" elapsed="0.000255"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:03.343930" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.343696" elapsed="0.000260"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:03.344003" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:03.344157" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:03.133122" elapsed="0.211059"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:03.344239" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:03.344428" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:03.132364" elapsed="0.212091"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.344777" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.344553" elapsed="0.000281"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.345065" elapsed="0.000187"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.344858" elapsed="0.000431"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.345492" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.345339" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.344521" elapsed="0.001062"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:03.132196" elapsed="0.213412"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.348259" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.347794" elapsed="0.000492"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:03.348332" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:03.348478" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:03.347388" elapsed="0.001118"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.406383" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.406009" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.407238" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.406974" elapsed="0.000345">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:03.407413" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:03.406630" elapsed="0.000808"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.408011" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:03.407626" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.408338" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:03.408498" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:03.408203" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.408946" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.408700" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.409981" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.409728" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.410463" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.410188" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.410840" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.411046" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.411223" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:03.410702" elapsed="0.000579"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.410560" elapsed="0.000751"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:03.411356" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:03.411514" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:03.409379" elapsed="0.002160"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.409060" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.411762" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.411612" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.409041" elapsed="0.002798"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.412407" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.411981" elapsed="0.000453"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.412482" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:03.405380" elapsed="0.007243"/>
</kw>
<msg time="2026-04-10T00:50:03.412678" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:03.392722" elapsed="0.020008"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.425214" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.437595" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.449888" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.450087" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.450264" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.450643" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.450483" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:03.450469" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.450869" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.451039" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.451206" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:03.450440" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.450341" elapsed="0.001001"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.451498" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.451596" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:03.451864" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:03.388331" elapsed="0.063569"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.453586" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.453297" elapsed="0.000354">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:03.453743" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:03.452958" elapsed="0.000810"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.454080" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.453837" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.454634" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.454323" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.454160" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.453819" elapsed="0.000898"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.457024" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:03.454867" elapsed="0.002184"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:03.457101" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:03.457428" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:03.452498" elapsed="0.004966"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.459161" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.458922" elapsed="0.000301">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:03.459315" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:03.458583" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:03.459559" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:50:03.459410" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.459392" elapsed="0.000253"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.459791" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.459961" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.460027" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:03.463539" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:03.458134" elapsed="0.005457"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.465360" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.465105" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.465919" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.465664" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:03.484505" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:03.485481" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:03.485980" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:03.468081" elapsed="0.017961"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.466030" elapsed="0.020111"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.486576" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.486200" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.466012" elapsed="0.020761"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.494925" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.489054" elapsed="0.006195"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.488523" elapsed="0.006763"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.488480" elapsed="0.006830"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.497991" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.495611" elapsed="0.002441"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.495368" elapsed="0.002720"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.495350" elapsed="0.002761"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.498677" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.498278" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.499008" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.498775" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.499567" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.499252" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.499090" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.498757" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.500171" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.499813" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.500499" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.500267" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.501056" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.500762" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.500597" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.500249" elapsed="0.000891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:03.501291" elapsed="0.000417"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:03.502149" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.501875" elapsed="0.000300"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.502329" elapsed="0.002478"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:03.487575" elapsed="0.017295"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.505045" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:03.504940" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.504921" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:03.513585" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:03.505256" elapsed="0.008360"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:03.513670" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:03.513986" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:03.464174" elapsed="0.049848"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.514112" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:50:03.514447" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:03.363815" elapsed="0.150673"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.515427" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.514702" elapsed="0.000905"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.514683" elapsed="0.000965"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.515738" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:03.352849" elapsed="0.163082"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.348595" elapsed="0.167381"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.348577" elapsed="0.167423"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.516717" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:03.516589" elapsed="0.000223"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:03.516957" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:03.516838" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.516570" elapsed="0.000521"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.517241" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:50:03.517359" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:03.516283" elapsed="0.001101"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.518008" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.517602" elapsed="0.000433"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.518793" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.518200" elapsed="0.000621"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.525937" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.525115" elapsed="0.000986"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.527068" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.526369" elapsed="0.000857"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:03.535708" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:03.535766" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:03 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:03 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":43,"LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.054","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"296.9 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":10171},"timestamp":1775782203,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:03.535975" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:03.529729" elapsed="0.006281"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.527344" elapsed="0.008723"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.536440" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.536127" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.527311" elapsed="0.009305"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.541298" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":43,"LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.054","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"296.9 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":10171},"timestamp":1775782203,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.538724" elapsed="0.002635"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.538442" elapsed="0.002953"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.538396" elapsed="0.003072"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.544236" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.541863" elapsed="0.002420"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.541629" elapsed="0.002690"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.541583" elapsed="0.002780"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.545093" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.544662" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.545663" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.545293" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.546243" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.545935" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.545768" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.545248" elapsed="0.001098"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.547035" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.546616" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.547473" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.547234" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.548055" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.547754" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.547588" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.547189" elapsed="0.000967"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:03.548397" elapsed="0.000445"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:03.549443" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.549097" elapsed="0.000397"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.549759" elapsed="0.002431"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:03.537401" elapsed="0.014897"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.552684" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:03.552427" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.552394" elapsed="0.000439"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:03.556393" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:03.553062" elapsed="0.003425"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:03.556765" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:03.557047" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:03.519841" elapsed="0.037234"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.557166" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:03.557318" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:03.519036" elapsed="0.038308"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.558710" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.557996" elapsed="0.000744"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:03.558789" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:03.558964" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:03.557625" elapsed="0.001366"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:03.559371" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 43, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.559147" elapsed="0.000251"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:03.559810" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.559573" elapsed="0.000263"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:03.559882" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:03.560032" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:03.346783" elapsed="0.213273"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:03.560111" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:03.560255" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:03.346045" elapsed="0.214234"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.560589" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.560357" elapsed="0.000460"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.560986" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.560840" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.561205" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.561062" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.560340" elapsed="0.000936"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:03.345778" elapsed="0.215522"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:03.131993" elapsed="0.429338"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:03.561372" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:03.561675" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:50:03.561722" level="INFO">${follower_list} = [3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:03.127956" elapsed="0.433789"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.562190" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:03.562266" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:03.561924" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.562589" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.562358" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.562340" elapsed="0.000327"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.564871" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:03.562804" elapsed="0.002114"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:03.565312" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.565122" elapsed="0.000216"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:03.565386" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:03.125251" elapsed="0.440326"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:50:03.124978" elapsed="0.440647"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.570135" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:03.569764" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.570635" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:03.570322" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:03.570706" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:03.570859" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:03.569330" elapsed="0.001553"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:03.571044" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.571701" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:03.571356" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.572124" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:03.571887" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.572529" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:03.572297" 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-04-10T00:50:03.575176" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.574719" elapsed="0.000485"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:03.575250" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:03.575396" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:03.574329" elapsed="0.001091"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.633430" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.633053" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.634261" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.634022" elapsed="0.000311">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:03.634426" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:03.633679" elapsed="0.000771"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.635020" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:03.634633" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.635347" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:03.635494" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:03.635211" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.635991" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.635737" 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-04-10T00:50:03.636995" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.636744" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.637489" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.637199" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.637857" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.638067" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.638245" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:03.637720" elapsed="0.000583"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.637581" elapsed="0.000753"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:03.638378" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:03.638537" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:03.636400" elapsed="0.002177"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.636106" elapsed="0.002504"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.638784" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.638635" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.636087" elapsed="0.002774"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.639450" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.639018" elapsed="0.000460"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.639531" elapsed="0.000046"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:03.632426" elapsed="0.007248"/>
</kw>
<msg time="2026-04-10T00:50:03.639727" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:03.619902" elapsed="0.019877"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.652277" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.664683" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.677004" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.677201" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.677378" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.677831" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.677684" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:03.677669" 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-04-10T00:50:03.678051" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.678219" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.678385" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:03.677639" elapsed="0.000798"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.677517" elapsed="0.000946"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.678624" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.678702" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:03.678976" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:03.615521" elapsed="0.063490"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.680669" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.680412" elapsed="0.000321">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:03.680824" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:03.680073" 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-04-10T00:50:03.681162" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.680919" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.681738" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.681408" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.681242" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.680901" elapsed="0.000919"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.684133" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:03.681979" elapsed="0.002180"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:03.684209" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:03.684515" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:03.679637" elapsed="0.004967"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.686274" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.686024" elapsed="0.000313">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:03.686430" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:03.685680" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:03.686677" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:03.686524" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.686507" elapsed="0.000252"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.686904" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.687077" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.687142" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:03.689406" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:03.685197" elapsed="0.004246"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.691407" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.691154" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.691866" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.691623" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:03.704663" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:03.705081" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:03.705277" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:03.694149" elapsed="0.011155"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.691976" elapsed="0.013372"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.705577" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.705375" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.691958" elapsed="0.013712"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.709400" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.706689" elapsed="0.003073"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.706447" elapsed="0.003352"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.706428" elapsed="0.003396"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.712442" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.710107" elapsed="0.002381"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.709882" elapsed="0.002644"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.709864" elapsed="0.002701"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.713099" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.712729" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.713431" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.713196" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.714027" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.713723" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.713555" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.713177" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.714647" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.714270" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.715164" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.714780" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.715731" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.715408" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.715249" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.714759" elapsed="0.001054"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:03.715961" elapsed="0.000338"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:03.716752" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.716464" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.716932" elapsed="0.002653"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:03.706023" elapsed="0.013769"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.719967" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:03.719861" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.719843" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:03.728177" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:03.720179" elapsed="0.008028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:03.728259" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:03.728620" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:03.690213" elapsed="0.038444"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.728748" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:50:03.729091" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:03.590826" elapsed="0.138315"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.730089" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.729330" elapsed="0.000940"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.729311" elapsed="0.001000"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.730398" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:03.579774" elapsed="0.150840"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.575488" elapsed="0.155172"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.575471" elapsed="0.155213"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.731395" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:03.731259" elapsed="0.000230"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:03.731659" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:03.731518" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.731241" elapsed="0.000552"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.731942" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:03.732062" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:03.730970" elapsed="0.001118"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.732674" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.732257" elapsed="0.000444"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.733412" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.732857" elapsed="0.000583"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.740422" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.739743" elapsed="0.000863"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.741595" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.740865" elapsed="0.000890"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:03.748963" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:03.749022" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:03 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:03 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":7,"SnapshotIndex":106,"InMemoryJournalLogSize":23,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-default-operational","LastIndex":129,"RaftState":"Leader","LastApplied":127,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":129,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.394","active":true,"matchIndex":127,"voting":true,"id":"member-3-shard-default-operational","nextIndex":128},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-default-operational","nextIndex":107}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"312.8 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":127,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":5,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":93530},"timestamp":1775782203,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:03.749233" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:03.744196" elapsed="0.005072"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.741881" elapsed="0.007444"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.749840" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.749385" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.741848" elapsed="0.008193"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.754679" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":7,"SnapshotIndex":106,"InMemoryJournalLogSize":23,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-default-operational","LastIndex":129,"RaftState":"Leader","LastApplied":127,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":129,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.394","active":true,"matchIndex":127,"voting":true,"id":"member-3-shard-default-operational","nextIndex":128},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-default-operational","nextIndex":107}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"312.8 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":127,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":5,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":93530},"timestamp":1775782203,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.752087" elapsed="0.002656"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.751862" elapsed="0.002915"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.751816" elapsed="0.003006"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.757583" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.755186" elapsed="0.002450"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.754958" elapsed="0.002713"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.754912" elapsed="0.002803"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.758398" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.757971" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.758867" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.758623" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.759435" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.759130" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.758967" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.758575" elapsed="0.000967"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.760230" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.759812" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.760681" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.760429" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.761241" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.760943" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.760780" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.760383" elapsed="0.000958"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:03.761710" elapsed="0.000422"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:03.762753" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.762410" elapsed="0.000393"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.763050" elapsed="0.002411"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:03.750847" elapsed="0.014776"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.765977" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:03.765759" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.765726" elapsed="0.000398"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:03.769913" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:03.766352" elapsed="0.003655"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:03.770126" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:03.770403" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:03.734469" elapsed="0.035962"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.770490" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:03.770657" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:03.733712" elapsed="0.036971"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.771999" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578220...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.771278" elapsed="0.000749"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:03.772076" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:03.772263" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578220...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:03.770908" elapsed="0.001381"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:03.772694" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 127, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.772446" elapsed="0.000276"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:03.773112" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.772878" elapsed="0.000260"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:03.773184" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:03.773336" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:03.573731" elapsed="0.199629"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:03.773416" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:03.773665" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:03.572989" elapsed="0.200703"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.773989" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.773773" elapsed="0.000273"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.774275" elapsed="0.000186"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.774069" elapsed="0.000429"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.774685" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.774521" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.773756" elapsed="0.001004"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:03.572822" elapsed="0.201962"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.777280" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.776823" elapsed="0.000484"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:03.777352" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:03.777497" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:03.776439" elapsed="0.001082"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.835052" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.834679" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.835882" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.835637" elapsed="0.000315">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:03.836044" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:03.835284" elapsed="0.000785"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.836636" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:03.836233" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.836965" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:03.837103" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:03.836825" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.837526" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.837285" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.838573" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.838300" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.839044" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.838780" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.839390" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.839608" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.839786" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:03.839256" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.839120" elapsed="0.000754"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:03.839916" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:03.840073" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:03.837980" elapsed="0.002119"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.837691" elapsed="0.002440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.840305" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.840156" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.837671" elapsed="0.002711"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.840975" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.840526" elapsed="0.000478"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.841052" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:03.834057" elapsed="0.007120"/>
</kw>
<msg time="2026-04-10T00:50:03.841231" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:03.821402" elapsed="0.019880"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.853753" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.866095" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.878452" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.878666" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.878845" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.879216" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.879071" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:03.879057" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.879445" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.879628" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.879797" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:03.879026" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.878925" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.880024" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.880100" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:03.880375" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:03.816914" elapsed="0.063496"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.882118" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.881868" elapsed="0.000316">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:03.882276" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:03.881473" elapsed="0.000828"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.882632" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.882371" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.883176" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.882886" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.882715" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.882352" elapsed="0.000906"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.885593" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:03.883408" elapsed="0.002247"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:03.885706" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:03.886010" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:03.881036" elapsed="0.005008"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:03.887703" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.887446" elapsed="0.000321">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:03.887859" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:03.887108" elapsed="0.000783"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:03.888094" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:03.887962" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.887943" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.888323" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.888494" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.888577" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:03.890817" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:03.886678" elapsed="0.004174"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.892635" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.892360" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.893073" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.892833" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:03.911137" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:03.911576" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:03.911781" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:03.895299" elapsed="0.016509"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.893182" elapsed="0.018675"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.912036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.911884" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.893163" elapsed="0.018958"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.915837" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.913124" elapsed="0.003033"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.912905" elapsed="0.003286"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.912886" elapsed="0.003331"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.918852" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.916495" elapsed="0.002403"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.916272" elapsed="0.002660"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.916256" elapsed="0.002700"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.919494" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.919123" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.919844" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.919609" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.920379" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.920082" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.919924" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.919590" elapsed="0.000871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.920991" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.920636" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.921316" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.921087" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.921898" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.921567" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.921395" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.921069" elapsed="0.000911"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:03.922127" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:03.922924" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.922647" elapsed="0.000303"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.923104" elapsed="0.003913"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:03.912473" elapsed="0.014612"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.927268" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:03.927160" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.927139" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:03.935634" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:03.927487" elapsed="0.008180"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:03.935722" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:50:03.936082" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:03.891431" elapsed="0.044688"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.936211" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:50:03.936583" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:03.792872" elapsed="0.143755"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.937721" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.936827" elapsed="0.001079"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.936807" elapsed="0.001141"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.938037" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:03.781888" elapsed="0.156341"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.777684" elapsed="0.160589"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.777665" elapsed="0.160631"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.939047" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:03.938917" elapsed="0.000227"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:03.939291" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:50:03.939170" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.938899" elapsed="0.000526"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.939607" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:50:03.939727" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:03.938603" elapsed="0.001150"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.940411" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.939946" elapsed="0.000492"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.941181" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.940615" elapsed="0.000597"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.948419" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.947689" elapsed="0.000916"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.949658" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.948876" elapsed="0.000948"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:03.958409" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:03.958510" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:03 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:03 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":106,"InMemoryJournalLogSize":25,"ReplicatedToAllIndex":106,"Leader":"member-1-shard-default-operational","LastIndex":131,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":131,"LastLogIndex":131,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"255.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":131,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":93612},"timestamp":1775782203,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:03.958816" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:03.952364" elapsed="0.006491"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.949959" elapsed="0.008974"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.959407" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.959010" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.949920" elapsed="0.009674"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.964786" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":106,"InMemoryJournalLogSize":25,"ReplicatedToAllIndex":106,"Leader":"member-1-shard-default-operational","LastIndex":131,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":131,"LastLogIndex":131,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"255.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":131,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":93612},"timestamp":1775782203,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.962043" elapsed="0.002809"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.961723" elapsed="0.003166"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.961666" elapsed="0.003270"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.967845" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:03.965312" elapsed="0.002580"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.965079" elapsed="0.002848"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.965032" elapsed="0.002941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.968734" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.968259" elapsed="0.000528"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.969189" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.968942" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.969819" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.969462" elapsed="0.000384"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.969291" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.968895" elapsed="0.001028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.970620" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.970183" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.971065" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.970827" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.971658" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.971327" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.971164" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.970780" elapsed="0.000981"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:03.972008" elapsed="0.000427"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:03.973061" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.972713" elapsed="0.000399"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.973362" elapsed="0.002492"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:03.960485" elapsed="0.015479"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:03.976319" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:03.976094" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.976061" elapsed="0.000411"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:03.980214" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:03.976765" elapsed="0.003544"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:03.980399" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:50:03.980747" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:03.942261" elapsed="0.038514"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:03.980884" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:03.981039" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:03.941426" elapsed="0.039639"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.982446" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578220...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:03.981740" elapsed="0.000735"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:03.982524" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:50:03.982720" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578220...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:03.981304" elapsed="0.001443"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:03.983133" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 131, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.982905" elapsed="0.000256"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:03.983571" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.983318" elapsed="0.000280"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:03.983645" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:03.983797" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:03.775841" elapsed="0.207981"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:03.983880" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:03.984028" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:03.775112" elapsed="0.208942"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.984357" elapsed="0.000233"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:03.984137" elapsed="0.000491"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.984799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.984653" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.985018" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.984875" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.984119" elapsed="0.000971"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:03.774943" elapsed="0.210171"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:03.572620" elapsed="0.412527"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:03.985190" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:03.985391" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:50:03.985438" level="INFO">${follower_list} = [3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:03.568624" elapsed="0.416837"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.985939" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:03.986015" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:03.985668" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:03.986323" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:03.986109" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:03.986091" elapsed="0.000309"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.988717" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:03.986537" elapsed="0.002228"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:03.989156" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:03.988968" elapsed="0.000214"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:03.989229" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:03.565939" elapsed="0.423445"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:50:03.565716" elapsed="0.423714"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:50:02.681147" elapsed="1.308314"/>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:50:02.680722" elapsed="1.308794"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.994771" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:03.994349" elapsed="0.000450"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.995259" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:03.994961" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:03.995329" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:03.995485" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:03.993970" elapsed="0.001539"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:03.995683" elapsed="0.000158"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.996331" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:03.996002" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.996767" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:03.996517" elapsed="0.000276"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.997174" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:03.996942" elapsed="0.000257"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:03.999854" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:03.999364" elapsed="0.000517"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:03.999928" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:04.000077" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:03.998987" elapsed="0.001115"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.058887" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:04.058475" elapsed="0.000444"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:04.059709" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:04.059430" elapsed="0.000357">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:04.059883" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:04.059092" elapsed="0.000816"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.060457" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:04.060075" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:04.060809" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:04.061029" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:04.060666" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.061466" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:04.061217" 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-04-10T00:50:04.062507" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:04.062250" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.063004" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:04.062734" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.063362" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.063592" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.063771" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:04.063225" elapsed="0.000606"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:04.063083" elapsed="0.000779"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:04.063908" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:04.064076" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:04.061925" elapsed="0.002176"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:04.061605" elapsed="0.002529"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.064308" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:04.064158" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.061583" elapsed="0.002802"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.064986" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:04.064531" elapsed="0.000483"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:04.065062" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:04.057856" elapsed="0.007331"/>
</kw>
<msg time="2026-04-10T00:50:04.065242" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:04.045111" elapsed="0.020183"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.077883" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.090355" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.102848" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.103082" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.103261" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.103644" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:04.103483" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:04.103469" 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-04-10T00:50:04.103866" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.104036" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.104202" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:04.103439" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:04.103339" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.104426" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:04.104502" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:04.104788" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:04.040673" elapsed="0.064151"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:04.106508" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:04.106256" elapsed="0.000334">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:04.106682" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:04.105916" elapsed="0.000791"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.107021" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:04.106777" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.107588" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:04.107279" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:04.107101" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.106759" elapsed="0.000913"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.110004" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:04.107823" elapsed="0.002208"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:04.110081" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:04.110391" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:04.105431" elapsed="0.004995"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:04.112331" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:04.112092" elapsed="0.000301">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:04.112485" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:04.111753" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:04.112744" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:04.112609" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.112590" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.113010" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.113184" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:04.113248" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:04.115499" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:04.111244" elapsed="0.004292"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.117556" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:04.117287" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.118027" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:04.117777" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:04.127256" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:04.127707" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:04.127909" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:04.120202" elapsed="0.007734"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:04.118138" elapsed="0.009841"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.128163" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:04.128006" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.118120" elapsed="0.010128"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.132031" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:04.129283" elapsed="0.003131"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:04.129062" elapsed="0.003389"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.129042" elapsed="0.003434"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.135167" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:04.132783" elapsed="0.002431"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:04.132534" elapsed="0.002715"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.132517" elapsed="0.002756"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.135841" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:04.135439" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.136174" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:04.135938" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.136736" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:04.136417" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:04.136256" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.135920" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.137341" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:04.136981" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.137691" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:04.137439" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.138246" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:04.137951" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:04.137789" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.137421" elapsed="0.000909"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:04.138482" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:04.139305" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:04.139016" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:04.139488" elapsed="0.002565"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:04.128629" elapsed="0.013489"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:04.142294" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:04.142189" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.142170" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:04.150671" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:04.142510" elapsed="0.008192"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:04.150754" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:04.151081" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:04.116333" elapsed="0.034785"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:04.151209" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:50:04.151566" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:04.015671" elapsed="0.135939"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.152560" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:04.151805" elapsed="0.000919"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.151786" elapsed="0.000979"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:04.152854" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:04.004680" elapsed="0.148368"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:04.000174" elapsed="0.152919"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.000155" elapsed="0.152963"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:50:04.153857" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:04.153714" elapsed="0.000255"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:04.154033" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:04.153995" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.153695" elapsed="0.000451"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.154296" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:04.154416" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:04.153406" elapsed="0.001036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.155041" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:04.154632" elapsed="0.000435"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.155801" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:04.155225" elapsed="0.000604"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.162957" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:04.162248" elapsed="0.000872"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.164088" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:04.163380" elapsed="0.000872"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:04.171589" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:04.171649" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:04 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:04 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":null,"LastIndex":40024,"RaftState":"Candidate","LastApplied":40024,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:49:55.617","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"223.2 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":3420},"timestamp":1775782204,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:04.171863" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:04.166777" elapsed="0.005122"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:04.164370" elapsed="0.007586"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.172337" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:04.172018" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.164337" elapsed="0.008160"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.177261" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":null,"LastIndex":40024,"RaftState":"Candidate","LastApplied":40024,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:49:55.617","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"223.2 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":3420},"timestamp":1775782204,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:04.174716" elapsed="0.002642"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:04.174474" elapsed="0.002921"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.174428" elapsed="0.003011"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.180943" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:04.177849" elapsed="0.003158"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:04.177591" elapsed="0.003464"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.177531" elapsed="0.003586"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.182118" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:04.181471" elapsed="0.000717"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.182757" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:04.182396" elapsed="0.000444"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.183586" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:04.183129" elapsed="0.000496"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:04.182898" elapsed="0.000780"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.182332" elapsed="0.001404"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.184834" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:04.184099" elapsed="0.000808"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.185458" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:04.185122" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.186314" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:04.185889" elapsed="0.000462"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:04.185626" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.185057" elapsed="0.001401"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:04.186750" elapsed="0.000426"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:04.187784" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:04.187437" elapsed="0.000398"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:04.188085" elapsed="0.002590"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:04.173430" elapsed="0.017353"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:04.191137" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:04.190916" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:04.190883" elapsed="0.000405"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:04.194926" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:04.191517" elapsed="0.003504"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:04.195107" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:04.195388" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:04.156846" elapsed="0.038570"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:04.195474" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:04.195645" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:04.156047" elapsed="0.039624"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.196971" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782204, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:04.196258" elapsed="0.000742"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:04.197086" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:04.197264" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782204, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:04.195894" elapsed="0.001398"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:04.197694" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 40024, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInit...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:04.197450" elapsed="0.000272"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:04.198139" level="INFO">${raft_property} = Candidate</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:04.197899" elapsed="0.000267"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:04.198213" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:04.198366" level="INFO">${raft_state} = Candidate</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:03.998367" elapsed="0.200023"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:04.198447" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:04.198611" level="INFO">${raft_state} = Candidate</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:03.997635" elapsed="0.201002"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.198936" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:04.198718" elapsed="0.000275"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.199225" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:04.199017" elapsed="0.000264"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:50:04.199891" level="FAIL">Unrecognized Raft state: Candidate</msg>
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:50:04.199500" elapsed="0.000459">Unrecognized Raft state: Candidate</status>
</kw>
<status status="FAIL" start="2026-04-10T00:50:04.199305" elapsed="0.000722">Unrecognized Raft state: Candidate</status>
</branch>
<status status="FAIL" start="2026-04-10T00:50:04.198701" elapsed="0.001357">Unrecognized Raft state: Candidate</status>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-10T00:50:03.997448" elapsed="0.202662">Unrecognized Raft state: Candidate</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:50:03.997247" elapsed="0.202922">Unrecognized Raft state: Candidate</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:04.200222" 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-04-10T00:50:03.993219" elapsed="0.207110">Unrecognized Raft state: Candidate</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.200518" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.200769" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:04.200625" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:04.200608" 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-04-10T00:50:04.200980" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:04.201154" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:04.201219" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.990562" elapsed="0.210760">Unrecognized Raft state: Candidate</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-10T00:50:03.990320" elapsed="0.211072">Unrecognized Raft state: Candidate</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-10T00:50:03.990186" elapsed="0.211261">Unrecognized Raft state: Candidate</status>
</for>
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-10T00:50:03.989792" elapsed="0.211746">Unrecognized Raft state: Candidate</status>
</kw>
<arg>${Inventory_Followers}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-10T00:50:02.652675" elapsed="1.549014">Unrecognized Raft state: Candidate</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.229864" elapsed="0.000239"/>
</kw>
<msg time="2026-04-10T00:50:06.230165" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:06.229179" elapsed="0.001047"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:50:06.228704" elapsed="0.001602"/>
</kw>
<msg time="2026-04-10T00:50:06.230353" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:06.219928" elapsed="0.010470"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:50:06.219418" elapsed="0.011056"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.230978" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.230688" elapsed="0.000337"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.236290" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:06.235903" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.236800" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:06.236478" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:06.236873" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:06.237035" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:06.235447" elapsed="0.001613"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:06.237216" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.237891" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:06.237533" elapsed="0.000385"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.238316" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:06.238077" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.238745" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:06.238490" elapsed="0.000281"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.241816" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.241176" elapsed="0.000668"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:06.241891" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:06.242044" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:06.240767" elapsed="0.001302"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.299767" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.299370" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:06.300648" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:06.300299" elapsed="0.000425">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:06.300883" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:06.299961" elapsed="0.000948"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.301458" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:06.301075" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:06.301813" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:06.301967" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:06.301674" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.302395" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.302149" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.303425" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.303166" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.304081" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.303652" 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-04-10T00:50:06.304436" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.304662" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.304840" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:06.304297" elapsed="0.000602"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.304160" elapsed="0.000771"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:06.304976" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:06.305139" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:06.302823" elapsed="0.002342"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.302509" elapsed="0.002689"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.305373" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.305223" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.302490" elapsed="0.002962"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.306052" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.305612" elapsed="0.000468"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:06.306129" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:06.298719" elapsed="0.007536"/>
</kw>
<msg time="2026-04-10T00:50:06.306308" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:06.286117" elapsed="0.020242"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.318806" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.331281" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.343680" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.343884" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.344060" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.344434" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.344281" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:06.344266" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.344669" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.344956" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.345124" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:06.344236" elapsed="0.000941"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.344136" elapsed="0.001066"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.345349" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.345425" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:06.345725" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:06.281730" elapsed="0.064031"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:06.347574" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:06.347312" elapsed="0.000327">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:06.347731" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:06.346819" elapsed="0.000936"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.348071" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.347826" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.348631" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.348324" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.348152" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.347808" elapsed="0.000905"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.351178" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:06.348864" elapsed="0.002341"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:06.351256" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:06.351581" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:06.346366" elapsed="0.005252"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:06.353235" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:06.352992" elapsed="0.000305">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:06.353433" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:06.352655" elapsed="0.000803"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:06.353679" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:06.353529" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.353510" elapsed="0.000253"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.353907" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.354076" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.354141" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:06.356264" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:06.352202" elapsed="0.004098"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.358087" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.357835" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.358673" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.358290" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:06.370860" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:06.371321" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:06.371521" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:06.360894" elapsed="0.010674"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.358786" elapsed="0.012836"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.372060" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.371690" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.358768" elapsed="0.013493"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.381267" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.374579" elapsed="0.007026"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.374061" elapsed="0.007581"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.374019" elapsed="0.007648"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.384405" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.381954" elapsed="0.002498"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.381725" elapsed="0.002762"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.381707" elapsed="0.002805"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.385081" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.384698" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.385418" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.385179" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.385982" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.385679" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.385500" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.385161" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.386603" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.386227" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.386973" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.386701" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.387520" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.387223" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.387057" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.386683" elapsed="0.000937"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:06.387772" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:06.388579" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.388281" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.388763" elapsed="0.002397"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:06.373092" elapsed="0.018132"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.391398" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:06.391294" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.391276" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:06.399718" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:06.391631" elapsed="0.008117"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:06.399801" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:06.400120" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:06.356899" elapsed="0.043258"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:06.400247" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:50:06.400609" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:06.257217" elapsed="0.143435"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.401601" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.400859" elapsed="0.000914"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.400840" elapsed="0.000974"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:06.401904" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:06.246195" elapsed="0.155902"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.242143" elapsed="0.159999"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.242123" elapsed="0.160043"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.402891" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:06.402762" elapsed="0.000260"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:06.403171" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:06.403048" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.402744" elapsed="0.000564"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.403457" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:06.403599" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:06.402451" elapsed="0.001174"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.404210" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.403798" elapsed="0.000440"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.404983" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.404397" elapsed="0.000615"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.412361" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.411661" elapsed="0.000866"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.413508" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.412814" elapsed="0.000940"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:06.422347" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:06.422407" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:06 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastApplied":137,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.691","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"246.8 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":7926168},"timestamp":1775782206,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:06.422641" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:06.416256" elapsed="0.006422"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.413873" elapsed="0.008865"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.423155" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.422801" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.413840" elapsed="0.009480"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.429614" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastApplied":137,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.691","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"246.8 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":7926168},"timestamp":1775782206,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.426236" elapsed="0.003465"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.425871" elapsed="0.003880"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.425806" elapsed="0.004009"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.433203" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.430330" elapsed="0.002919"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.430009" elapsed="0.003275"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.429945" elapsed="0.003385"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.434121" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.433688" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.434581" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.434322" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.435189" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.434855" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.434688" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.434276" elapsed="0.001017"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.435989" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.435566" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.436431" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.436189" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.437021" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.436719" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.436532" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.436143" elapsed="0.000979"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:06.437366" elapsed="0.000454"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:06.438405" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.438079" elapsed="0.000376"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.438720" elapsed="0.002467"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:06.424359" elapsed="0.016934"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.441672" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:06.441424" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.441390" elapsed="0.000434"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:06.445629" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:06.442054" elapsed="0.003670"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:06.445811" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:06.446088" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:06.406032" elapsed="0.040114"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:06.446207" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:06.446363" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:06.405230" elapsed="0.041160"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.447773" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.447032" elapsed="0.000771"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:06.447851" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:06.448028" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:06.446629" elapsed="0.001426"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:06.448436" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 137, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.448212" elapsed="0.000252"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:06.448873" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.448637" elapsed="0.000262"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:06.448946" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:06.449098" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:06.240122" elapsed="0.209000"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:06.449178" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:50:06.449322" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:06.239212" elapsed="0.210134"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.449706" elapsed="0.000191"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.449424" elapsed="0.000511"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.450105" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.449959" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.450326" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.450183" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.449407" elapsed="0.000992"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:06.239042" elapsed="0.211381"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.453222" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.452754" elapsed="0.000495"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:06.453294" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:06.453444" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:06.452302" elapsed="0.001166"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.511634" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.511235" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:06.512489" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:06.512170" elapsed="0.000466">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:06.512734" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:06.511833" elapsed="0.000925"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.513312" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:06.512926" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:06.513660" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:06.513811" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:06.513503" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.514237" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.513995" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.515431" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.515174" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.515929" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.515655" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.516287" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.516498" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.516698" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:06.516150" elapsed="0.000606"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.516008" elapsed="0.000779"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:06.516833" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:06.516996" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:06.514669" elapsed="0.002351"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.514352" elapsed="0.002700"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.517227" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.517078" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.514331" elapsed="0.002972"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.517894" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.517447" elapsed="0.000474"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:06.517969" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:06.510595" elapsed="0.007497"/>
</kw>
<msg time="2026-04-10T00:50:06.518146" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:06.498018" elapsed="0.020178"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.530465" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.542889" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.555355" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.555570" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.555748" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.556119" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.555971" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:06.555956" 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-04-10T00:50:06.556337" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.556504" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.556688" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:06.555927" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.555825" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.556914" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.556992" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:06.557265" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:06.493629" elapsed="0.063672"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:06.559322" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:06.559070" elapsed="0.000318">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:06.559479" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:06.558683" 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-04-10T00:50:06.559840" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.559591" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.560388" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.560096" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.559920" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.559572" elapsed="0.000897"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.562954" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:06.560637" elapsed="0.002344"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:06.563052" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:06.563360" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:06.558224" elapsed="0.005171"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:06.565187" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:06.564938" elapsed="0.000312">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:06.565385" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:06.564596" elapsed="0.000814"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:06.565635" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:06.565482" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.565464" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.565867" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.566039" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.566103" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:06.568206" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:06.564145" elapsed="0.004097"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.570034" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.569778" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.570613" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.570236" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:06.590072" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:06.590688" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:06.590992" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:06.572824" elapsed="0.018207"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.570727" elapsed="0.020426"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.591436" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.591195" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.570709" elapsed="0.020869"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.600306" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.593910" elapsed="0.006848"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.593372" elapsed="0.007434"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.593329" elapsed="0.007510"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.604301" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.601228" elapsed="0.003131"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.600915" elapsed="0.003481"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.600892" elapsed="0.003534"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.605031" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.604633" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.605372" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.605131" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.605941" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.605634" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.605454" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.605113" elapsed="0.000965"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.606641" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.606255" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.606975" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.606740" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.607587" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.607267" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.607101" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.606721" elapsed="0.000952"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:06.607827" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:06.608655" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.608340" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.608838" elapsed="0.002398"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:06.592366" elapsed="0.018944"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.611489" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:06.611381" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.611361" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:06.623432" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:06.611727" elapsed="0.011779"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:06.623665" elapsed="0.000078"/>
</return>
<msg time="2026-04-10T00:50:06.624410" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:06.568838" elapsed="0.055652"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:06.624741" elapsed="0.000159"/>
</return>
<msg time="2026-04-10T00:50:06.625489" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:06.468813" elapsed="0.156799"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.627716" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.626046" elapsed="0.001848"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.626004" elapsed="0.001931"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:06.628026" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:06.457666" elapsed="0.170557"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.453537" elapsed="0.174732"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.453519" elapsed="0.174775"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.629049" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:06.628917" elapsed="0.000226"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:06.629290" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:06.629169" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.628899" elapsed="0.000528"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.629612" elapsed="0.000026"/>
</kw>
<msg time="2026-04-10T00:50:06.629741" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:06.628608" elapsed="0.001159"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.630362" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.629940" elapsed="0.000449"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.631162" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.630565" elapsed="0.000625"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.638466" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.637763" elapsed="0.000890"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.639681" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.638921" elapsed="0.000922"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:06.649480" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:06.649622" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:06 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":137,"LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.689","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.053","active":true,"matchIndex":137,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":138},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-operational","nextIndex":137}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"602.3 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":7926168},"timestamp":1775782206,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:06.649927" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:06.642367" elapsed="0.007611"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.639963" elapsed="0.010096"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.650719" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.650146" elapsed="0.000764"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.639930" elapsed="0.011063"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.657389" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":137,"LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.689","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.053","active":true,"matchIndex":137,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":138},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-operational","nextIndex":137}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"602.3 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":7926168},"timestamp":1775782206,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.654005" elapsed="0.003472"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.653684" elapsed="0.003842"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.653618" elapsed="0.004020"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.661510" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.658149" elapsed="0.003559"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.657830" elapsed="0.003929"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.657767" elapsed="0.004053"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.662824" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.662179" elapsed="0.000717"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.663681" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.663182" elapsed="0.000561"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.664414" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.664105" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.663787" elapsed="0.000689"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.663042" elapsed="0.001475"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.665355" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.664933" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.665830" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.665586" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.666394" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.666094" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.665930" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.665509" elapsed="0.000985"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:06.666761" elapsed="0.000452"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:06.667836" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.667472" elapsed="0.000415"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.668137" elapsed="0.002478"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:06.652202" elapsed="0.018555"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.671133" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:06.670890" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.670857" elapsed="0.000424"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:06.674968" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:06.671509" elapsed="0.003551"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:06.675224" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:06.675507" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:06.632184" elapsed="0.043351"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:06.675611" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:06.675800" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:06.631408" elapsed="0.044418"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.677143" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.676414" elapsed="0.000758"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:06.677220" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:06.677399" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:06.676049" elapsed="0.001376"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:06.677828" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 137, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.677599" elapsed="0.000256"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:06.678246" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.678012" elapsed="0.000260"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:06.678318" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:06.678471" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:06.451695" elapsed="0.226800"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:06.678583" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:06.678737" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:06.450767" elapsed="0.227994"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.679062" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.678842" elapsed="0.000308"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.679385" elapsed="0.000205"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.679173" elapsed="0.000456"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.679801" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.679652" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.678824" elapsed="0.001049"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:06.450597" elapsed="0.229300"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:06.238819" elapsed="0.441112"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:06.679975" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:06.680232" level="INFO">${leader_list} = [3]</msg>
<msg time="2026-04-10T00:50:06.680327" level="INFO">${follower_list} = [1]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:06.234682" elapsed="0.445671"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.681009" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:06.681087" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:06.680535" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.681436" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.681181" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.681163" elapsed="0.000352"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.683700" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:06.681678" elapsed="0.002070"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:06.684098" level="INFO">${leader} = 3</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.683911" elapsed="0.000213"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:06.684171" 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="PASS" start="2026-04-10T00:50:06.232058" elapsed="0.452270"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:50:06.231823" elapsed="0.452553"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.688851" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:06.688458" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.689334" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:06.689038" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:06.689404" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:06.689572" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:06.688089" elapsed="0.001508"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:06.689756" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.690395" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:06.690066" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.690829" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:06.690592" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.691272" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:06.691001" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.693926" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.693438" elapsed="0.000516"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:06.694000" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:06.694149" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:06.693067" elapsed="0.001107"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.752091" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.751713" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:06.752902" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:06.752646" elapsed="0.000337">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:06.753077" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:06.752287" elapsed="0.000815"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.753665" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:06.753267" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:06.753991" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:06.754230" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:06.753854" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.754687" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.754424" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.755721" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.755446" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.756196" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.755930" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.756559" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.756767" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.756941" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:06.756410" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.756273" elapsed="0.000755"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:06.757072" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:06.757232" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:06.755099" elapsed="0.002158"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.754803" elapsed="0.002486"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.757462" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.757314" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.754782" elapsed="0.002755"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.758129" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.757698" elapsed="0.000459"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:06.758206" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:06.751056" elapsed="0.007274"/>
</kw>
<msg time="2026-04-10T00:50:06.758384" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:06.738452" elapsed="0.019983"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.771284" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.783530" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.795838" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.796076" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.796253" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.796639" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.796477" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:06.796463" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.796861" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.797028" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.797192" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:06.796433" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.796332" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.797416" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.797491" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:06.797779" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:06.734087" elapsed="0.063727"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:06.799532" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:06.799278" elapsed="0.000340">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:06.799710" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:06.798886" elapsed="0.000849"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.800049" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.799804" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.800610" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.800305" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.800129" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.799786" elapsed="0.000911"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.802990" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:06.800847" elapsed="0.002170"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:06.803067" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:06.803419" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:06.798422" elapsed="0.005033"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:06.805128" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:06.804889" elapsed="0.000302">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:06.805284" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:06.804536" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:06.805517" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:50:06.805380" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.805362" elapsed="0.000254"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.805798" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.805972" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.806037" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:06.808323" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:06.804100" elapsed="0.004260"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.810159" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.809905" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.810611" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.810356" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:06.822525" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:06.823132" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:06.823444" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:06.812829" elapsed="0.010653"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.810720" elapsed="0.012822"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.823823" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.823605" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.810702" elapsed="0.013241"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.829347" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.825354" elapsed="0.004458"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.825045" elapsed="0.004817"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.825019" elapsed="0.004878"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.833653" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.830296" elapsed="0.003422"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.829976" elapsed="0.003790"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.829952" elapsed="0.003848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.834574" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.834029" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.835044" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.834716" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.835853" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.835412" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.835156" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.834690" elapsed="0.001277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.836709" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.836187" elapsed="0.000559"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.837164" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.836841" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.837933" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.837497" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.837277" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.836816" elapsed="0.001232"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:06.838255" elapsed="0.000496"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:06.839419" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.838986" elapsed="0.000469"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.839702" elapsed="0.002471"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:06.824434" elapsed="0.017802"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.842408" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:06.842304" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.842286" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:06.850697" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:06.842634" elapsed="0.008093"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:06.850778" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:06.851104" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:06.808971" elapsed="0.042170"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:06.851273" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:50:06.851639" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:06.709403" elapsed="0.142278"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.852623" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.851873" elapsed="0.000921"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.851854" elapsed="0.000981"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:06.852927" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:06.698495" elapsed="0.154630"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.694242" elapsed="0.158928"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.694225" elapsed="0.158970"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.853921" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:06.853793" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:06.854168" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:06.854042" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.853776" elapsed="0.000527"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.854453" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:06.854589" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:06.853482" elapsed="0.001134"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.855213" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.854787" elapsed="0.000454"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.855990" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.855402" elapsed="0.000618"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.863201" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.862473" elapsed="0.000897"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.864345" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.863652" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:06.889113" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:06.889243" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:06 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Leader","LastApplied":43,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":43},{"timeSinceLastActivity":"00:00:00.440","active":true,"matchIndex":43,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":44}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"625.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":10171},"timestamp":1775782206,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:06.889770" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:06.867015" elapsed="0.022839"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.864688" elapsed="0.025294"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.890867" elapsed="0.000105"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.890118" elapsed="0.001048"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.864654" elapsed="0.026674"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.901699" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Leader","LastApplied":43,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":43},{"timeSinceLastActivity":"00:00:00.440","active":true,"matchIndex":43,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":44}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"625.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":10171},"timestamp":1775782206,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.896128" elapsed="0.005635"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.895620" elapsed="0.006179"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.895484" elapsed="0.006361"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.904711" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.902211" elapsed="0.002548"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.901982" elapsed="0.002812"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.901937" elapsed="0.002902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.905529" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.905099" elapsed="0.000498"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.905997" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.905751" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.906594" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.906267" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.906101" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.905703" elapsed="0.000994"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.907413" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.906952" elapsed="0.000512"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.907879" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.907633" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.908454" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.908147" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.907979" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.907585" elapsed="0.000986"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:06.908819" elapsed="0.000424"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:06.909846" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.909501" elapsed="0.000395"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.910143" elapsed="0.002477"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:06.893193" elapsed="0.019533"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.913074" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:06.912857" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.912824" elapsed="0.000400"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:06.916973" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:06.913454" elapsed="0.003611"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:06.917188" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:06.917468" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:06.857039" elapsed="0.060457"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:06.917569" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:06.917721" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:06.856234" elapsed="0.061513"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.919096" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.918334" elapsed="0.000791"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:06.919173" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:06.919374" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:06.917971" elapsed="0.001430"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:06.919820" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 43, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.919589" elapsed="0.000259"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:06.920237" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.920004" elapsed="0.000259"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:06.920310" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:06.920460" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:06.692444" elapsed="0.228040"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:06.920539" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:50:06.920708" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:06.691738" elapsed="0.228994"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.921028" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.920812" elapsed="0.000273"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.921316" elapsed="0.000186"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.921108" elapsed="0.000445"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.921727" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.921580" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.920795" elapsed="0.001006"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:06.691567" elapsed="0.230257"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.924406" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.923946" elapsed="0.000487"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:06.924479" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:06.924645" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:06.923573" elapsed="0.001097"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.982869" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:06.982475" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:06.983735" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:06.983462" elapsed="0.000346">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:06.983901" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:06.983101" elapsed="0.000825"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.984483" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:06.984097" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:06.984830" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:06.984978" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:06.984692" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.985402" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.985161" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.986401" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:06.986149" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.986891" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:06.986623" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.987273" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.987495" 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-04-10T00:50:06.987691" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:06.987109" elapsed="0.000641"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:06.986970" elapsed="0.000810"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:06.987826" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:06.987987" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:06.985827" elapsed="0.002185"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.985521" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:06.988218" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:06.988069" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.985501" elapsed="0.002795"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:06.989092" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:06.988440" elapsed="0.000680"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:06.989168" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:06.981857" elapsed="0.007437"/>
</kw>
<msg time="2026-04-10T00:50:06.989348" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:06.969211" elapsed="0.020190"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.002124" elapsed="0.000069"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.014873" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.027455" elapsed="0.000072"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.027798" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.027989" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.028445" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.028290" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:07.028271" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.028695" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.028865" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.029034" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:07.028229" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.028084" elapsed="0.001032"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.029266" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.029347" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:50:07.029735" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:06.964794" elapsed="0.064980"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:07.031695" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:07.031340" elapsed="0.000433">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:07.031867" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:07.030924" elapsed="0.000968"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.032229" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.031964" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.032815" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.032491" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.032313" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.031946" elapsed="0.000955"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.035256" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:07.033055" elapsed="0.002260"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:07.035368" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:07.035771" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:07.030429" elapsed="0.005379"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:07.037530" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:07.037278" elapsed="0.000334">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:07.037706" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:07.036937" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:07.037938" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:07.037802" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.037784" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.038170" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.038342" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.038408" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:07.040722" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:07.036478" elapsed="0.004282"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.042586" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.042300" elapsed="0.000458"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.043164" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.042918" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:07.059331" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:07.059950" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:07.060236" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:07.045386" elapsed="0.014888"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.043308" elapsed="0.017026"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.060607" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.060371" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.043257" elapsed="0.017477"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.066049" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.062167" elapsed="0.004343"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.061856" elapsed="0.004722"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.061830" elapsed="0.004785"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.070376" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.067015" elapsed="0.003426"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.066697" elapsed="0.003792"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.066672" elapsed="0.003851"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.071352" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.070782" elapsed="0.000609"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.071873" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.071490" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.072425" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.072121" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.071957" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.071465" elapsed="0.001043"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.073053" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.072691" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.073379" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.073148" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.073933" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.073638" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.073461" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.073131" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:07.074166" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:07.074988" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.074699" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.075169" elapsed="0.002548"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:07.061239" elapsed="0.016544"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.077962" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:07.077855" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.077835" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:07.086352" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:07.078181" elapsed="0.008201"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:07.086434" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:07.086789" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:07.041354" elapsed="0.045472"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:07.086919" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:50:07.087257" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:06.940173" elapsed="0.147156"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.088282" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.087526" elapsed="0.000924"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.087507" elapsed="0.000983"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:07.088598" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:06.929035" elapsed="0.159954"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:06.924738" elapsed="0.164297"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:06.924721" elapsed="0.164338"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.089792" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:07.089663" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:07.090033" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:07.089913" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.089645" elapsed="0.000524"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.090320" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:07.090441" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:07.089351" elapsed="0.001116"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.091067" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.090654" elapsed="0.000441"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.091872" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.091253" elapsed="0.000650"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.099055" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.098307" elapsed="0.000914"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.100214" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.099512" elapsed="0.000862"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:07.109133" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:07.109201" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:07 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:07 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":43,"LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.054","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"153.9 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":10171},"timestamp":1775782207,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:07.109411" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:07.102899" elapsed="0.006549"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.100493" elapsed="0.009011"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.109899" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.109583" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.100460" elapsed="0.009598"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.116203" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":43,"LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.054","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"153.9 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":10171},"timestamp":1775782207,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.112538" elapsed="0.003750"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.112172" elapsed="0.004165"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.112109" elapsed="0.004291"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.120353" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.116933" elapsed="0.003486"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.116611" elapsed="0.003857"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.116527" elapsed="0.004003"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.121516" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.120912" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.122158" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.121820" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.123054" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.122529" elapsed="0.000562"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.122297" elapsed="0.000845"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.121756" elapsed="0.001441"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.124075" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.123615" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.124513" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.124274" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.125100" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.124802" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.124628" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.124229" elapsed="0.000974"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:07.125444" elapsed="0.000440"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:07.126471" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.126141" elapsed="0.000380"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.126795" elapsed="0.002445"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:07.110963" elapsed="0.018384"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.129716" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:07.129476" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.129444" elapsed="0.000423"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:07.133453" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:07.130097" elapsed="0.003466"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:07.133654" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:07.133932" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:07.092902" elapsed="0.041058"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:07.134052" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:07.134207" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:07.092120" elapsed="0.042114"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.135652" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.134900" elapsed="0.000782"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:07.135731" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:07.135909" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:07.134460" elapsed="0.001476"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:07.136317" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 43, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.136092" elapsed="0.000254"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:07.136756" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.136504" elapsed="0.000278"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:07.136830" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:07.136983" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:06.922925" elapsed="0.214082"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:07.137065" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:07.137215" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:06.922153" elapsed="0.215088"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.137539" elapsed="0.000212"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.137321" elapsed="0.000468"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.137959" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.137813" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.138180" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.138037" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.137303" elapsed="0.000950"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:06.921983" elapsed="0.216294"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:06.691349" elapsed="0.446959"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:07.138352" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:07.138611" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:50:07.138661" level="INFO">${follower_list} = [3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:06.687362" elapsed="0.451323"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.139128" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:07.139204" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:07.138862" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.139529" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.139297" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.139280" elapsed="0.000342"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.141804" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:07.139760" elapsed="0.002091"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:07.142240" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.142052" elapsed="0.000213"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:07.142313" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:06.684712" elapsed="0.457757"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:50:06.684467" elapsed="0.458050"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.147062" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:07.146685" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.147602" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:07.147250" elapsed="0.000380"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:07.147678" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:07.147835" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:07.146276" elapsed="0.001584"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:07.148113" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.148788" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:07.148432" elapsed="0.000383"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.149212" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:07.148973" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.149641" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:07.149387" elapsed="0.000280"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.152582" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.152100" elapsed="0.000511"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:07.152656" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:07.152805" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:07.151647" elapsed="0.001182"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.210712" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.210313" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:07.211520" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:07.211242" elapsed="0.000368">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:07.211703" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:07.210905" elapsed="0.000823"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.212273" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:07.211893" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:07.212613" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:07.212763" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:07.212462" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.213236" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.212984" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.214255" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.213997" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.214756" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.214462" 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-04-10T00:50:07.215105" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.215312" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.215508" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:07.214968" elapsed="0.000615"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.214833" elapsed="0.000782"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:07.215659" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:07.215819" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:07.213670" elapsed="0.002175"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.213352" elapsed="0.002526"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.216052" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.215903" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.213333" elapsed="0.002797"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.216722" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.216275" elapsed="0.000475"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:07.216798" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:07.209703" elapsed="0.007228"/>
</kw>
<msg time="2026-04-10T00:50:07.216985" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:07.197057" elapsed="0.019981"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.229603" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.241830" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.254102" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.254305" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.254483" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.254904" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.254758" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:07.254743" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.255121" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.255288" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.255473" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:07.254713" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.254609" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.255718" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.255794" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:07.256067" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:07.192677" elapsed="0.063425"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:07.257790" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:07.257517" elapsed="0.000341">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:07.257951" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:07.257166" elapsed="0.000811"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.258299" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.258049" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.258867" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.258570" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.258380" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.258031" elapsed="0.000919"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.261439" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:07.259100" elapsed="0.002366"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:07.261517" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:50:07.261863" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:07.256727" elapsed="0.005171"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:07.263554" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:07.263278" elapsed="0.000342">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:07.263719" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:07.262940" elapsed="0.000803"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:07.263950" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:07.263815" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.263797" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.264179" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.264352" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.264418" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:07.266696" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:07.262482" elapsed="0.004251"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.268568" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.268296" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.269011" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.268772" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:07.280607" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:07.281234" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:07.281575" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:07.271213" elapsed="0.010405"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.269120" elapsed="0.012566"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.281976" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.281730" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.269102" elapsed="0.013002"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.287883" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.283718" elapsed="0.004697"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.283317" elapsed="0.005153"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.283288" elapsed="0.005219"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.292514" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.288957" elapsed="0.003650"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.288617" elapsed="0.004040"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.288590" elapsed="0.004103"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.293519" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.292953" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.294034" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.293684" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.294872" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.294398" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.294155" elapsed="0.000808"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.293657" elapsed="0.001338"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.295790" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.295233" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.296121" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.295887" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.296676" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.296364" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.296203" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.295869" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:07.296913" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:07.297730" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.297423" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.297915" elapsed="0.002523"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:07.282670" elapsed="0.017837"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.300702" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:07.300592" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.300573" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:07.309112" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:07.300920" elapsed="0.008223"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:07.309198" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:50:07.309569" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:07.267329" elapsed="0.042280"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:07.309703" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:50:07.310048" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:07.167980" elapsed="0.142110"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.311072" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.310290" elapsed="0.000967"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.310270" elapsed="0.001028"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:07.311387" 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="PASS" start="2026-04-10T00:50:07.157119" elapsed="0.154501"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.152896" elapsed="0.158771"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.152879" elapsed="0.158813"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.312419" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:07.312290" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:07.312677" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:07.312539" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.312272" elapsed="0.000541"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.312971" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:07.313091" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:07.311984" elapsed="0.001133"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.313750" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.313298" elapsed="0.000479"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.314504" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.313936" elapsed="0.000598"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.321639" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.320933" elapsed="0.000869"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.322780" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.322061" elapsed="0.000878"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:07.333809" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:07.333897" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:07 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:07 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":11,"SnapshotIndex":106,"InMemoryJournalLogSize":37,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-default-operational","LastIndex":143,"RaftState":"Leader","LastApplied":141,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":143,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.337","active":true,"matchIndex":141,"voting":true,"id":"member-3-shard-default-operational","nextIndex":142},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-default-operational","nextIndex":107}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"997.9 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":141,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":8,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":94104},"timestamp":1775782207,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:07.334213" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:07.325435" elapsed="0.008830"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.323056" elapsed="0.011292"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.334969" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.334438" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.323023" elapsed="0.012245"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.343335" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":11,"SnapshotIndex":106,"InMemoryJournalLogSize":37,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-default-operational","LastIndex":143,"RaftState":"Leader","LastApplied":141,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":143,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.337","active":true,"matchIndex":141,"voting":true,"id":"member-3-shard-default-operational","nextIndex":142},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-default-operational","nextIndex":107}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"997.9 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":141,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":8,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":94104},"timestamp":1775782207,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.338497" elapsed="0.004976"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.338102" elapsed="0.005431"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.338022" elapsed="0.005747"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.348871" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.344408" elapsed="0.004521"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.343988" elapsed="0.004979"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.343917" elapsed="0.005104"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.349907" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.349340" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.350426" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.350138" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.351138" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.350760" elapsed="0.000411"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.350542" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.350088" elapsed="0.001175"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.352160" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.351656" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.352636" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.352364" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.353211" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.352906" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.352742" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.352318" elapsed="0.000993"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:07.353594" elapsed="0.000425"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:07.354667" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.354279" elapsed="0.000439"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.354976" elapsed="0.003218"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:07.336512" elapsed="0.021823"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.358983" elapsed="0.000062"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:07.358505" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.358464" elapsed="0.000712"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:07.364109" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:07.359519" elapsed="0.004708"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:07.364396" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:50:07.364783" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:07.315596" elapsed="0.049224"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:07.364895" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:07.365090" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:07.314780" elapsed="0.050344"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.366842" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578220...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.365930" elapsed="0.000947"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:07.366937" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:07.367163" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578220...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:07.365434" elapsed="0.001763"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:07.367776" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 141, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.367401" elapsed="0.000411"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:07.368312" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.368019" elapsed="0.000324"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:07.368402" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:07.368621" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:07.150990" elapsed="0.217663"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:07.368726" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:07.368914" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:07.150090" elapsed="0.218856"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.369331" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.369049" elapsed="0.000354"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.369773" elapsed="0.000239"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.369432" elapsed="0.000625"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.370283" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.370088" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.369027" elapsed="0.001349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:07.149920" elapsed="0.220485"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.375970" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.373076" elapsed="0.002929"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:07.376064" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:50:07.376254" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:07.372610" elapsed="0.003676"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.439977" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.439534" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:07.440940" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:07.440653" elapsed="0.000370">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:07.441118" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:07.440286" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.441720" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:07.441311" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:07.442056" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:07.442220" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:07.441911" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.442677" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.442406" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.443912" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.443480" elapsed="0.000477"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.444413" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.444133" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.444824" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.445040" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.445220" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:07.444682" elapsed="0.000597"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.444498" elapsed="0.000814"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:07.445365" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:50:07.445538" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:07.443151" elapsed="0.002430"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.442810" elapsed="0.002805"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.445792" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.445641" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.442782" elapsed="0.003090"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.446481" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.446019" elapsed="0.000490"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:07.446572" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:07.438859" elapsed="0.007846"/>
</kw>
<msg time="2026-04-10T00:50:07.446761" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:07.426180" elapsed="0.020634"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.459469" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.472036" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.484406" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.484630" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.484960" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.485373" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.485220" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:07.485202" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.485614" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.485785" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.485952" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:07.485165" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.485049" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.486182" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.486260" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:50:07.486602" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:07.421728" elapsed="0.064913"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:07.488512" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:07.488222" elapsed="0.000390">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:07.488707" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:07.487835" elapsed="0.000896"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.489060" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.488802" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.489632" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.489321" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.489140" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.488784" elapsed="0.000931"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.492099" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:07.489867" elapsed="0.002258"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:07.492175" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:07.492485" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:07.487250" elapsed="0.005271"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:07.494228" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:07.493975" elapsed="0.000316">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:07.494385" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:07.493633" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:07.494635" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:07.494480" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.494462" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.494870" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.495042" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.495107" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:07.497392" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:07.493181" elapsed="0.004247"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.499262" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.498997" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.499823" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.499573" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:07.517720" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:07.518674" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:07.519155" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:07.502007" elapsed="0.017209"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.499933" elapsed="0.019382"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.519782" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.519375" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.499915" elapsed="0.020065"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.528495" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.522271" elapsed="0.006654"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.521771" elapsed="0.007191"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.521728" elapsed="0.007258"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.531662" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.529271" elapsed="0.002442"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.529043" elapsed="0.002705"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.529026" elapsed="0.002746"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.532333" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.531946" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.532683" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.532430" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.533233" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.532929" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.532768" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.532412" elapsed="0.000905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.533857" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.533478" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.534188" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.533954" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.534743" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.534430" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.534269" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.533937" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:07.534978" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:07.535840" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.535484" elapsed="0.000382"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.536024" elapsed="0.002410"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:07.520795" elapsed="0.017704"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.538699" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:07.538586" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.538566" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:07.547279" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:07.538917" elapsed="0.008392"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:07.547362" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:07.547749" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:07.498032" elapsed="0.049754"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:07.547878" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:50:07.548215" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:07.396437" elapsed="0.151820"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.549197" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.548450" elapsed="0.000909"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.548431" elapsed="0.000969"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:07.549489" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:07.381751" elapsed="0.167951"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.376373" elapsed="0.173374"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.376350" elapsed="0.173422"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.550479" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:07.550351" elapsed="0.000240"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:07.550745" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:07.550618" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.550333" elapsed="0.000546"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.551030" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:50:07.551150" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:07.550061" elapsed="0.001115"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.551792" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.551350" elapsed="0.000468"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.552560" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.551977" elapsed="0.000614"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.559669" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.558952" elapsed="0.000880"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.560831" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.560093" elapsed="0.000900"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:07.568151" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:07.568210" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:07 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:07 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":106,"InMemoryJournalLogSize":41,"ReplicatedToAllIndex":106,"Leader":"member-1-shard-default-operational","LastIndex":147,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":147,"LastLogIndex":147,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"203.8 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":147,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":94268},"timestamp":1775782207,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:07.568425" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:07.563450" elapsed="0.005010"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.561109" elapsed="0.007410"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.568998" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.568681" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.561077" elapsed="0.008080"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.573887" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":106,"InMemoryJournalLogSize":41,"ReplicatedToAllIndex":106,"Leader":"member-1-shard-default-operational","LastIndex":147,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":147,"LastLogIndex":147,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"203.8 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":147,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":94268},"timestamp":1775782207,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.571249" elapsed="0.002700"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.570987" elapsed="0.002998"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.570941" elapsed="0.003090"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.576996" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.574398" elapsed="0.002664"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.574168" elapsed="0.002944"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.574123" elapsed="0.003051"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.578163" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.577535" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.578812" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.578444" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.579665" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.579181" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.578952" elapsed="0.000825"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.578380" elapsed="0.001459"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.580944" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.580203" elapsed="0.000811"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.581579" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.581222" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.582367" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.581947" elapsed="0.000457"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.581718" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.581158" elapsed="0.001351"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:07.582867" elapsed="0.000588"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:07.584328" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.583871" elapsed="0.000525"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.584750" elapsed="0.002515"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:07.569971" elapsed="0.017399"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.587757" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:07.587501" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.587468" elapsed="0.000440"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:07.591459" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:07.588142" elapsed="0.003456"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:07.591692" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:07.592105" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:07.553600" elapsed="0.038532"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:07.592233" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:07.592387" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:07.552815" elapsed="0.039598"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.593781" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578220...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.593065" elapsed="0.000746"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:07.593860" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:07.594038" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578220...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:07.592699" elapsed="0.001365"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:07.594448" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 147, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.594221" elapsed="0.000255"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:07.594893" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.594651" elapsed="0.000268"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:07.594966" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:07.595118" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:07.371826" elapsed="0.223317"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:07.595201" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:07.595349" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:07.370865" elapsed="0.224508"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.595702" elapsed="0.000194"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.595453" elapsed="0.000480"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.596103" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.595957" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.596335" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.596179" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.595436" elapsed="0.000973"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:07.370646" elapsed="0.225788"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:07.149717" elapsed="0.446748"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:07.596507" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:07.596774" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:50:07.596819" level="INFO">${follower_list} = [3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:07.145559" elapsed="0.451283"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.597289" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:07.597471" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:07.597018" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.597799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.597582" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.597563" elapsed="0.000312"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.600158" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:07.598011" elapsed="0.002194"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:07.600672" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.600416" elapsed="0.000283"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:07.600747" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:07.142899" elapsed="0.458003"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:50:07.142670" elapsed="0.458278"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:50:06.231683" elapsed="1.369296"/>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:50:06.231264" elapsed="1.369771"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.606252" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:07.605869" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.606760" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:07.606440" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:07.606831" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:07.606985" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:07.605405" elapsed="0.001605"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:07.607165" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.607863" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:07.607476" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.608288" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:07.608049" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.608718" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:07.608462" elapsed="0.000281"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.611339" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.610883" elapsed="0.000483"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:07.611412" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:07.611597" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:07.610494" elapsed="0.001130"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.669122" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.668744" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:07.669925" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:07.669669" elapsed="0.000330">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:07.670093" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:07.669317" elapsed="0.000801"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.670678" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:07.670282" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:07.671001" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:07.671271" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:07.670866" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.671748" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.671460" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.672756" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.672480" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.673232" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.672964" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.673593" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.673801" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.673976" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:07.673443" elapsed="0.000591"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.673308" elapsed="0.000756"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:07.674106" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:07.674265" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:07.672155" elapsed="0.002136"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.671863" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.674493" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.674346" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.671844" elapsed="0.002741"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.675156" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.674730" elapsed="0.000454"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:07.675233" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:07.668116" elapsed="0.007241"/>
</kw>
<msg time="2026-04-10T00:50:07.675411" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:07.655594" elapsed="0.019868"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.687993" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.700312" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.712794" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.713029" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.713207" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.713588" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.713430" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:07.713415" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.713809" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.713976" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.714142" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:07.713386" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.713285" elapsed="0.000936"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.714366" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.714441" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:07.714737" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:07.651239" elapsed="0.063533"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:07.716453" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:07.716205" elapsed="0.000312">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:07.716629" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:07.715857" 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-04-10T00:50:07.716971" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.716725" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.717558" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.717245" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.717053" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.716707" elapsed="0.000937"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.719977" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:07.717796" elapsed="0.002208"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:07.720055" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:07.720356" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:07.715372" elapsed="0.005019"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:07.722023" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:07.721773" elapsed="0.000312">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:07.722178" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:07.721416" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:07.722405" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:07.722271" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.722254" elapsed="0.000232"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.722701" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.722878" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.722944" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:07.725246" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:07.720987" elapsed="0.004299"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.727109" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.726850" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.727582" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.727311" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:07.740886" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:07.741834" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:07.742276" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:07.729878" elapsed="0.012458"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.727720" elapsed="0.014712"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.742872" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.742492" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.727702" elapsed="0.015362"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.751521" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.745365" elapsed="0.006949"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.744873" elapsed="0.007521"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.744830" elapsed="0.007619"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.755239" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.752885" elapsed="0.002400"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.752607" elapsed="0.002713"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.752537" elapsed="0.002807"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.755922" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.755509" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.756257" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.756020" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.756816" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.756499" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.756338" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.756002" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.757417" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.757061" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.757764" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.757513" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.758302" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.758007" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.757846" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.757495" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:07.758535" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:07.759342" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.759062" elapsed="0.000306"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.759523" elapsed="0.002531"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:07.743899" elapsed="0.018221"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.762299" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:07.762193" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.762173" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:07.770717" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:07.762524" elapsed="0.008224"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:07.770800" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:07.771112" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:07.725898" elapsed="0.045250"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:07.771237" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:50:07.771619" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:07.626945" elapsed="0.144735"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.772612" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.771871" elapsed="0.000907"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.771852" elapsed="0.000967"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:07.772908" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:07.615936" elapsed="0.157165"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.611693" elapsed="0.161453"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.611675" elapsed="0.161494"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:50:07.773883" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:07.773759" elapsed="0.000235"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.774058" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:07.774020" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.773741" elapsed="0.000428"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.774320" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:07.774439" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:07.773455" elapsed="0.001010"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.775054" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.774649" elapsed="0.000431"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.775829" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.775237" elapsed="0.000620"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.782958" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.782248" elapsed="0.000874"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.784111" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.783385" 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-04-10T00:50:07.792837" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:07.792895" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:07 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:07 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":null,"LastIndex":40024,"RaftState":"Candidate","LastApplied":40024,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:49:55.617","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"320.2 μs","Voting":true,"CurrentTerm":4,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":3420},"timestamp":1775782207,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:07.793104" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:07.786805" elapsed="0.006335"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.784392" elapsed="0.008804"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.793589" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.793257" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.784359" elapsed="0.009391"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.799077" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":null,"LastIndex":40024,"RaftState":"Candidate","LastApplied":40024,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:49:55.617","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"320.2 μs","Voting":true,"CurrentTerm":4,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":3420},"timestamp":1775782207,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.795817" elapsed="0.003393"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.795562" elapsed="0.003699"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.795501" elapsed="0.003822"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.803343" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:07.799883" elapsed="0.003525"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.799515" elapsed="0.003942"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.799451" elapsed="0.004069"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.804562" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.803943" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.805046" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.804804" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.805645" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.805309" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.805145" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.804758" elapsed="0.000990"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.806569" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.806134" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.807013" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.806775" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.807593" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:07.807279" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:07.807111" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.806729" elapsed="0.000987"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:07.807961" elapsed="0.000540"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:07.809106" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.808779" elapsed="0.000378"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.809408" elapsed="0.002471"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:07.794537" elapsed="0.017449"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.812333" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:07.812116" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:07.812083" elapsed="0.000400"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:07.816052" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:07.812734" elapsed="0.003491"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:07.816315" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:07.816609" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:07.776868" elapsed="0.039768"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:07.816694" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:07.816843" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:07.776072" elapsed="0.040797"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.818175" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782207, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:07.817452" elapsed="0.000751"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:07.818289" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:07.818467" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782207, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:07.817090" elapsed="0.001404"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:07.818931" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 40024, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInit...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.818707" elapsed="0.000251"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:07.819347" level="INFO">${raft_property} = Candidate</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:07.819114" elapsed="0.000259"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:07.819420" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:07.819587" level="INFO">${raft_state} = Candidate</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:07.609893" elapsed="0.209720"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:07.819674" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T00:50:07.819859" level="INFO">${raft_state} = Candidate</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:07.609159" elapsed="0.210725"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.820185" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.819965" elapsed="0.000277"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.820473" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.820265" elapsed="0.000263"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:50:07.821085" level="FAIL">Unrecognized Raft state: Candidate</msg>
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:50:07.820767" elapsed="0.000388">Unrecognized Raft state: Candidate</status>
</kw>
<status status="FAIL" start="2026-04-10T00:50:07.820567" elapsed="0.000687">Unrecognized Raft state: Candidate</status>
</branch>
<status status="FAIL" start="2026-04-10T00:50:07.819948" elapsed="0.001350">Unrecognized Raft state: Candidate</status>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-10T00:50:07.608990" elapsed="0.212374">Unrecognized Raft state: Candidate</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:50:07.608791" elapsed="0.212638">Unrecognized Raft state: Candidate</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.821485" 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-04-10T00:50:07.604697" elapsed="0.216917">Unrecognized Raft state: Candidate</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.821824" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:07.822057" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:07.821916" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:07.821899" 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-04-10T00:50:07.822263" 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-04-10T00:50:07.822431" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:07.822493" elapsed="0.000016"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-10T00:50:07.602040" elapsed="0.220626">Unrecognized Raft state: Candidate</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-10T00:50:07.601814" elapsed="0.220925">Unrecognized Raft state: Candidate</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-10T00:50:07.601680" elapsed="0.221113">Unrecognized Raft state: Candidate</status>
</for>
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-10T00:50:07.601272" elapsed="0.221611">Unrecognized Raft state: Candidate</status>
</kw>
<arg>${Inventory_Followers}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-10T00:50:06.202723" elapsed="1.620296">Unrecognized Raft state: Candidate</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:09.848340" elapsed="0.000262"/>
</kw>
<msg time="2026-04-10T00:50:09.848672" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:09.847671" elapsed="0.001065"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:50:09.847183" elapsed="0.001942"/>
</kw>
<msg time="2026-04-10T00:50:09.849181" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:09.838512" elapsed="0.010720"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:50:09.838029" elapsed="0.011279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.849827" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:09.849532" elapsed="0.000340"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.855105" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:09.854709" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.855618" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:09.855296" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:09.855693" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:09.855853" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:09.854315" elapsed="0.001563"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:09.856034" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.856706" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:09.856351" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.857305" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:09.856928" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.857733" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:09.857478" elapsed="0.000281"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.862250" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:09.861769" elapsed="0.000509"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:09.862326" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:09.862479" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:09.861329" elapsed="0.001175"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.920760" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:09.920336" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:09.921638" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:09.921347" elapsed="0.000370">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:09.921924" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:09.921003" elapsed="0.000947"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.922510" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:09.922120" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:09.922870" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:09.923036" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:09.922724" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.923478" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:09.923226" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.924525" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:09.924262" elapsed="0.000325"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.925047" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:09.924754" elapsed="0.000320"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.925414" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.925833" 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-04-10T00:50:09.926019" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:09.925275" elapsed="0.000803"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:09.925128" elapsed="0.000983"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:09.926160" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:09.926330" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:09.923930" elapsed="0.002426"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:09.923619" elapsed="0.002769"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.926577" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:09.926412" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:09.923596" elapsed="0.003063"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.927260" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:09.926810" elapsed="0.000478"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:09.927338" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:09.919714" elapsed="0.007751"/>
</kw>
<msg time="2026-04-10T00:50:09.927520" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:09.906864" elapsed="0.020732"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.940042" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.952655" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.965157" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.965365" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.965559" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.966096" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:09.965800" elapsed="0.000352"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:09.965784" elapsed="0.000392"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.966318" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.966487" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.966668" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:09.965753" elapsed="0.000970"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:09.965643" elapsed="0.001107"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.966901" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:09.966978" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:09.967271" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:09.902354" elapsed="0.064953"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:09.969057" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:09.968774" elapsed="0.000355">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:09.969224" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:09.968393" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.969594" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:09.969322" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.970152" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:09.969856" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:09.969678" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:09.969303" elapsed="0.000936"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.972866" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:09.970393" elapsed="0.002501"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:09.972947" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:09.973255" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:09.967941" elapsed="0.005350"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:09.974940" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:09.974695" elapsed="0.000309">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:09.975142" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:09.974341" elapsed="0.000826"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:09.975377" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:09.975240" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:09.975222" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.975625" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.975804" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:09.975872" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:09.978187" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:09.973901" elapsed="0.004323"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.980044" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:09.979780" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.980490" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:09.980247" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:09.989205" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:09.989655" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:09.989887" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:09.982705" elapsed="0.007210"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:09.980637" elapsed="0.009322"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:09.990150" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:09.989987" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:09.980618" elapsed="0.009618"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.994374" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:09.991285" elapsed="0.003568"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:09.991059" elapsed="0.003846"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:09.991040" elapsed="0.003900"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.998920" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:09.995347" elapsed="0.003639"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:09.995022" elapsed="0.004014"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:09.994997" elapsed="0.004074"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:09.999886" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:09.999319" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.000355" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.000023" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.001193" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.000719" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.000469" elapsed="0.000812"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:09.999998" elapsed="0.001313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.001981" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.001535" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.002310" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.002078" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.002862" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.002565" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.002390" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.002060" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:10.003100" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:10.003921" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.003629" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.004105" elapsed="0.002392"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:09.990624" elapsed="0.015956"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.006767" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:10.006654" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.006635" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:10.015365" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:10.006986" elapsed="0.008410"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:10.015449" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:10.015806" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:09.978835" elapsed="0.037009"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.015937" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:50:10.016281" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:09.877516" elapsed="0.138808"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.017303" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.016517" elapsed="0.000957"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.016498" elapsed="0.001017"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.017620" elapsed="0.000031"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:09.866697" elapsed="0.151122"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:09.862601" elapsed="0.155264"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:09.862579" elapsed="0.155311"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.018629" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:10.018484" elapsed="0.000244"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:10.018874" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:10.018753" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.018466" elapsed="0.000545"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.019162" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:10.019283" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:10.018184" elapsed="0.001127"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.019920" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.019483" elapsed="0.000465"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.020695" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.020109" elapsed="0.000615"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.028025" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.027306" elapsed="0.000886"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.029240" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.028457" elapsed="0.000945"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:10.038091" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:10.038158" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:10 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:10 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastApplied":137,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.691","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"332.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":7926168},"timestamp":1775782210,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:10.038377" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:10.031872" elapsed="0.006542"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.029522" elapsed="0.008951"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.038882" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.038536" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.029490" elapsed="0.009553"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.045016" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastApplied":137,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.691","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"332.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":7926168},"timestamp":1775782210,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.041378" elapsed="0.003730"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.041073" elapsed="0.004086"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.041026" elapsed="0.004198"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.049298" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.045770" elapsed="0.003595"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.045418" elapsed="0.003997"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.045354" elapsed="0.004124"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.050530" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.049894" elapsed="0.000730"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.051186" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.050839" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.052010" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.051576" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.051326" elapsed="0.000773"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.050774" elapsed="0.001380"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.053208" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.052514" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.053835" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.053490" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.054403" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.054100" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.053935" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.053426" elapsed="0.001080"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:10.054772" elapsed="0.000428"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:10.055828" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.055461" elapsed="0.000418"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.056133" elapsed="0.002516"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:10.039886" elapsed="0.018922"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.059171" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:10.058945" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.058912" elapsed="0.000412"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:10.062969" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:10.059571" elapsed="0.003492"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:10.063153" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:50:10.063440" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:10.021745" elapsed="0.041767"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.063590" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:10.063748" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:10.020962" elapsed="0.042813"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.065136" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.064387" elapsed="0.000779"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:10.065215" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:10.065390" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:10.064009" elapsed="0.001408"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:10.065862" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 137, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.065632" elapsed="0.000258"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:10.066283" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.066048" elapsed="0.000262"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:10.066356" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:10.066510" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:09.860498" elapsed="0.206037"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:10.066610" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:10.066759" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:09.858175" elapsed="0.208608"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.067084" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.066865" elapsed="0.000446"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.067482" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.067335" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.067720" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.067576" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.066847" elapsed="0.000946"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:09.858005" elapsed="0.209813"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.070416" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.069954" elapsed="0.000489"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:10.070489" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:10.070654" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:10.069519" elapsed="0.001160"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.129449" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.129007" elapsed="0.000476"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.130314" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:10.130033" elapsed="0.000446">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:10.130593" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:10.129681" elapsed="0.000939"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.131220" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:10.130796" elapsed="0.000454"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.131578" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:10.131738" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:10.131417" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.132177" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.131925" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.133280" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.133022" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.133782" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.133491" 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-04-10T00:50:10.134149" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.134355" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.134531" elapsed="0.000037"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:10.134011" elapsed="0.000596"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.133865" elapsed="0.000773"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:10.134688" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:10.134855" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:10.132671" elapsed="0.002209"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.132306" elapsed="0.002606"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.135087" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.134937" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.132281" elapsed="0.002881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.135768" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.135307" elapsed="0.000489"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.135845" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:10.128121" elapsed="0.007846"/>
</kw>
<msg time="2026-04-10T00:50:10.136022" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:10.115381" elapsed="0.020696"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.148641" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.161107" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.173564" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.173787" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.173971" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.174390" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.174237" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:10.174219" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.174632" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.174803" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.174970" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:10.174180" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.174062" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.175200" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.175279" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:50:10.175636" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:10.110786" elapsed="0.064889"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.177485" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:10.177186" elapsed="0.000393">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:10.177674" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:10.176778" elapsed="0.000921"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.178036" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.177771" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.178611" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.178299" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.178116" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.177752" elapsed="0.000942"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.181065" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:10.178849" elapsed="0.002242"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:10.181142" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:10.181449" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:10.176294" elapsed="0.005190"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.183130" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:10.182883" elapsed="0.000311">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:10.183343" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:10.182526" elapsed="0.000843"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:10.183594" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:50:10.183441" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.183423" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.183830" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.184003" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.184070" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:10.186345" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:10.182091" elapsed="0.004291"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.188198" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.187934" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.188704" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.188403" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:10.210915" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:10.211349" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:10.211589" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:10.190906" elapsed="0.020712"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.188815" elapsed="0.022849"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.211861" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.211693" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.188797" elapsed="0.023151"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.215756" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.213021" elapsed="0.003084"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.212770" elapsed="0.003371"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.212751" elapsed="0.003416"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.218851" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.216454" elapsed="0.002443"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.216225" elapsed="0.002706"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.216208" elapsed="0.002747"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.219524" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.219133" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.219885" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.219640" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.220433" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.220132" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.219968" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.219622" elapsed="0.000892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.221093" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.220690" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.221423" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.221190" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.221981" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.221680" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.221503" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.221172" elapsed="0.000891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:10.222215" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:10.223035" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.222740" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.223216" elapsed="0.002503"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:10.212323" elapsed="0.013462"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.225965" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:10.225858" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.225840" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:10.234474" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:10.226182" elapsed="0.008322"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:10.234576" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:10.234915" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:10.186994" elapsed="0.047958"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.235043" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:50:10.235388" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:10.085956" elapsed="0.149475"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.236401" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.235651" elapsed="0.000930"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.235631" elapsed="0.000992"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.236715" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:10.075044" elapsed="0.161868"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.070747" elapsed="0.166211"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.070730" elapsed="0.166291"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.237806" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:10.237675" elapsed="0.000228"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:10.238051" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:10.237928" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.237657" elapsed="0.000530"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.238337" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:50:10.238456" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:10.237357" elapsed="0.001125"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.239089" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.238669" elapsed="0.000447"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.239846" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.239272" elapsed="0.000603"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.246876" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.246176" elapsed="0.000862"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.248003" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.247295" elapsed="0.000866"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:10.257141" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:10.257201" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:10 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:10 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":137,"LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.689","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.021","active":true,"matchIndex":137,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":138},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-operational","nextIndex":137}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"677.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":7926168},"timestamp":1775782210,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:10.257417" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:10.250659" elapsed="0.006793"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.248278" elapsed="0.009231"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.257913" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.257588" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.248245" elapsed="0.009868"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.263388" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":137,"LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.689","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.021","active":true,"matchIndex":137,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":138},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-operational","nextIndex":137}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"677.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":7926168},"timestamp":1775782210,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.260265" elapsed="0.003212"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.260033" elapsed="0.003494"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.259984" elapsed="0.003627"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.267478" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.264134" elapsed="0.003426"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.263811" elapsed="0.003800"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.263742" elapsed="0.003932"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.268795" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.268038" elapsed="0.000831"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.269447" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.269101" elapsed="0.000430"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.270287" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.269856" elapsed="0.000470"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.269612" elapsed="0.000763"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.269035" elapsed="0.001397"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.271407" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.270816" elapsed="0.000663"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.272052" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.271712" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.272875" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.272420" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.272191" elapsed="0.000769"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.271646" elapsed="0.001414"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:10.273408" elapsed="0.000551"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:10.274574" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.274218" elapsed="0.000408"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.274874" elapsed="0.002447"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:10.258987" elapsed="0.018441"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.277799" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:10.277574" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.277525" elapsed="0.000423"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:10.281706" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:10.278179" elapsed="0.003627"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:10.281929" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:10.282211" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:10.240901" elapsed="0.041338"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.282297" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:10.282446" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:10.240091" elapsed="0.042381"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.283810" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.283083" elapsed="0.000755"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:10.283886" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:10.284064" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:10.282718" elapsed="0.001372"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:10.284475" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 137, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.284247" elapsed="0.000256"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:10.284950" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.284713" elapsed="0.000263"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:10.285189" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:50:10.285388" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:10.068919" elapsed="0.216495"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:10.285480" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:10.285647" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:10.068158" elapsed="0.217515"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.285991" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.285760" elapsed="0.000290"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.286281" elapsed="0.000200"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.286073" elapsed="0.000446"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.286709" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.286557" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.285741" elapsed="0.001043"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:10.067986" elapsed="0.218821"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:09.857807" elapsed="0.429032"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:10.286883" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:10.287086" level="INFO">${leader_list} = [3]</msg>
<msg time="2026-04-10T00:50:10.287132" level="INFO">${follower_list} = [1]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:09.853599" elapsed="0.433557"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.287621" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:10.287699" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:10.287333" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.288049" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.287791" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.287773" elapsed="0.000355"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.290400" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:10.288266" elapsed="0.002183"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:10.290816" level="INFO">${leader} = 3</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.290629" elapsed="0.000212"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:10.290888" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:09.850939" elapsed="0.440103"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:50:09.850674" elapsed="0.440415"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.295607" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:10.295204" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.296096" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:10.295795" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:10.296168" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:10.296326" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:10.294832" elapsed="0.001519"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:10.296510" elapsed="0.000178"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.297220" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:10.296851" elapsed="0.000396"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.297687" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:10.297406" elapsed="0.000310"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.298134" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:10.297896" elapsed="0.000263"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.301017" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.300512" elapsed="0.000534"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:10.301092" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:10.301241" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:10.300128" elapsed="0.001137"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.359011" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.358632" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.359816" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:10.359558" elapsed="0.000335">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:10.359986" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:10.359206" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.360572" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:10.360175" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.360909" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:10.361160" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:10.360765" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.361611" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.361346" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.362621" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.362349" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.363241" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.362835" 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-04-10T00:50:10.363603" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.363811" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.363987" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:10.363452" elapsed="0.000593"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.363316" elapsed="0.000759"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:10.364119" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:10.364279" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:10.362024" elapsed="0.002280"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.361728" elapsed="0.002608"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.364509" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.364360" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.361708" elapsed="0.002894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.365204" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.364747" elapsed="0.000485"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.365280" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:10.357890" elapsed="0.007513"/>
</kw>
<msg time="2026-04-10T00:50:10.365458" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:10.345325" elapsed="0.020183"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.379292" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.391569" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.403923" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.404187" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.404368" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.404781" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.404632" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:10.404617" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.405007" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.405221" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.405389" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:10.404582" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.404452" elapsed="0.001018"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.405631" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.405710" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:50:10.406009" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:10.340875" elapsed="0.065170"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.407807" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:10.407511" elapsed="0.000541">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:10.408145" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:10.407136" elapsed="0.001034"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.408500" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.408240" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.409106" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.408780" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.408600" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.408222" elapsed="0.000969"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.411529" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:10.409344" elapsed="0.002267"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:10.411665" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:10.411977" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:10.406685" elapsed="0.005327"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.413671" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:10.413407" elapsed="0.000327">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:10.413827" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:10.413055" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:10.414056" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:10.413922" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.413904" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.414330" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.414504" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.414590" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:10.465862" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:10.412617" elapsed="0.053302"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.468023" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.467703" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.468487" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.468235" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:10.478252" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:10.478878" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:10.479175" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:10.470784" elapsed="0.008423"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.468630" elapsed="0.010630"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.479501" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.479299" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.468606" elapsed="0.011018"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.485520" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.480982" elapsed="0.005077"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.480671" elapsed="0.005442"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.480646" elapsed="0.005503"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.489966" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.486583" elapsed="0.003449"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.486233" elapsed="0.003849"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.486207" elapsed="0.003909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.490971" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.490367" elapsed="0.000644"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.491459" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.491115" elapsed="0.000451"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.492301" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.491858" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.491605" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.491088" elapsed="0.001335"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.493315" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.492679" elapsed="0.000675"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.493822" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.493458" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.494365" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.494065" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.493904" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.493431" elapsed="0.001017"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:10.494618" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:10.495428" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.495134" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.495624" elapsed="0.002508"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:10.480103" elapsed="0.018097"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.498380" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:10.498270" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.498251" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:10.510228" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:10.498625" elapsed="0.011636"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:10.510317" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:50:10.510725" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:10.466661" elapsed="0.044103"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.510860" elapsed="0.000075"/>
</return>
<msg time="2026-04-10T00:50:10.511224" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:10.316326" elapsed="0.194943"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.512270" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.511469" elapsed="0.000984"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.511449" elapsed="0.001045"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.512607" elapsed="0.000031"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:10.305570" elapsed="0.207243"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.301336" elapsed="0.211523"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.301318" elapsed="0.211565"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.513713" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:10.513572" elapsed="0.000264"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:10.514032" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:50:10.513871" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.513529" elapsed="0.000685"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.514380" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:50:10.514512" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:10.513237" elapsed="0.001326"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.515346" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.514790" elapsed="0.000585"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.516382" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.515602" elapsed="0.000811"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.523834" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.523034" elapsed="0.000971"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.525016" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.524289" elapsed="0.000993"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:10.533522" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:10.533605" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:10 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:10 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Leader","LastApplied":43,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":43},{"timeSinceLastActivity":"00:00:00.446","active":true,"matchIndex":43,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":44}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"510.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":10171},"timestamp":1775782210,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:10.533828" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:10.527883" elapsed="0.005982"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.525416" elapsed="0.008508"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.534314" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.533991" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.525380" elapsed="0.009154"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.539478" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Leader","LastApplied":43,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":43},{"timeSinceLastActivity":"00:00:00.446","active":true,"matchIndex":43,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":44}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"510.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":10171},"timestamp":1775782210,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.536745" elapsed="0.002833"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.536493" elapsed="0.003124"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.536447" elapsed="0.003215"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.542452" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.540036" elapsed="0.002462"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.539799" elapsed="0.002735"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.539754" elapsed="0.002840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.543331" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.542874" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.543881" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.543535" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.544464" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.544150" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.543983" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.543487" elapsed="0.001094"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.545295" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.544837" elapsed="0.000509"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.545755" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.545495" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.546378" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.546022" elapsed="0.000384"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.545855" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.545449" elapsed="0.001033"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:10.546754" elapsed="0.000467"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:10.547896" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.547480" elapsed="0.000466"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.548195" elapsed="0.002488"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:10.535392" elapsed="0.015404"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.551154" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:10.550928" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.550895" elapsed="0.000411"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:10.555084" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:10.551570" elapsed="0.003607"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:10.555312" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:50:10.555657" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:10.517500" elapsed="0.038185"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.555745" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:10.555898" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:10.516651" elapsed="0.039274"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.557289" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.556534" elapsed="0.000784"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:10.557368" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:10.557564" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:10.556159" elapsed="0.001434"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:10.557982" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 43, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.557752" elapsed="0.000258"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:10.558403" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.558169" elapsed="0.000260"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:10.558477" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:10.558648" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:10.299475" elapsed="0.259198"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:10.558730" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:10.558879" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:10.298749" elapsed="0.260155"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.559207" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.558986" elapsed="0.000278"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.559495" elapsed="0.000266"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.559288" elapsed="0.000511"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.559974" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.559824" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.558969" elapsed="0.001078"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:10.298565" elapsed="0.261505"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.562668" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.562177" elapsed="0.000519"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:10.562742" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:10.562890" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:10.561809" elapsed="0.001106"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.621395" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.620973" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.622304" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:10.622038" elapsed="0.000342">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:10.622476" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:10.621690" elapsed="0.000811"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.623083" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:10.622685" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.623420" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:10.623592" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:10.623277" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.624030" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.623780" 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-04-10T00:50:10.625065" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.624804" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.625599" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.625311" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.625967" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.626176" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.626356" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:10.625827" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.625679" elapsed="0.000767"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:10.626493" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:10.626679" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:10.624458" elapsed="0.002247"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.624152" elapsed="0.002586"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.626913" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.626763" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.624130" elapsed="0.002862"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.627597" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.627138" elapsed="0.000487"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.627675" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:10.620339" elapsed="0.007465"/>
</kw>
<msg time="2026-04-10T00:50:10.627858" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:10.607509" elapsed="0.020402"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.640530" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.653014" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.665442" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.665671" 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-04-10T00:50:10.665858" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.666260" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.666109" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:10.666093" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.666484" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.666670" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.666843" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:10.666058" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.665944" elapsed="0.000979"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.667072" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.667151" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:50:10.667565" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:10.603082" elapsed="0.064524"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.669412" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:10.669094" elapsed="0.000395">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:10.669601" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:10.668716" elapsed="0.000911"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.669955" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.669698" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.670514" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.670217" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.670036" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.669680" elapsed="0.000934"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.672955" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:10.670767" elapsed="0.002215"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:10.673033" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:10.673388" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:10.668226" elapsed="0.005198"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.675359" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:10.675111" elapsed="0.000312">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:10.675518" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:10.674761" elapsed="0.000840"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:10.675816" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:10.675679" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.675660" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.676051" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.676263" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.676333" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:10.678624" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:10.674105" elapsed="0.004556"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.680505" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.680230" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.680975" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.680730" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:10.698759" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:10.699208" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:10.699465" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:10.683207" elapsed="0.016287"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.681089" elapsed="0.018476"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.699792" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.699601" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.681070" elapsed="0.018811"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.703832" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.700992" elapsed="0.003163"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.700758" elapsed="0.003433"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.700737" elapsed="0.003479"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.706902" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.704504" elapsed="0.002444"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.704274" elapsed="0.002709"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.704256" elapsed="0.002751"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.707601" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.707187" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.707948" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.707701" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.708501" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.708195" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.708029" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.707682" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.709124" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.708761" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.709476" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.709241" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.710039" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.709738" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.709574" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.709205" elapsed="0.000918"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:10.710278" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:10.711100" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.710809" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.711281" elapsed="0.002550"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:10.700282" elapsed="0.013616"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.714077" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:10.713969" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.713950" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:10.723421" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:10.714295" elapsed="0.009157"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:10.723507" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:50:10.723880" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:10.679257" elapsed="0.044661"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.724012" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:50:10.724360" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:10.578417" elapsed="0.145986"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.725387" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.724624" elapsed="0.000961"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.724605" elapsed="0.001021"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.725717" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:10.567451" elapsed="0.158464"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.563174" elapsed="0.162788"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.562965" elapsed="0.163023"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.726722" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:10.726592" elapsed="0.000230"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:10.726969" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:10.726848" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.726574" elapsed="0.000531"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.727258" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:50:10.727378" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:10.726283" elapsed="0.001120"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.728016" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.727601" elapsed="0.000442"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.728785" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.728203" elapsed="0.000611"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.735948" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.735215" elapsed="0.000899"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.737093" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.736380" elapsed="0.000910"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:10.745004" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:10.745077" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:10 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:10 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":43,"LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.054","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"186.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":10171},"timestamp":1775782210,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:10.745341" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:10.739809" elapsed="0.005570"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.737415" elapsed="0.008026"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.746005" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.745507" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.737381" elapsed="0.008788"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.751171" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":43,"LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.054","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"186.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":10171},"timestamp":1775782210,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.748397" elapsed="0.002837"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.748089" elapsed="0.003180"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.748041" elapsed="0.003274"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.754126" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.751703" elapsed="0.002470"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.751451" elapsed="0.002758"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.751406" elapsed="0.002847"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.755004" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.754528" elapsed="0.000527"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.755453" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.755207" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.756059" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.755743" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.755569" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.755161" elapsed="0.001001"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.756860" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.756419" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.757340" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.757059" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.758016" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.757713" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.757441" elapsed="0.000637"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.757014" elapsed="0.001104"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:10.758364" elapsed="0.000445"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:10.759416" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.759068" elapsed="0.000397"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.759735" elapsed="0.002496"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:10.747035" elapsed="0.015305"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.762714" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:10.762470" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.762437" elapsed="0.000433"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:10.766521" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:10.763101" elapsed="0.003531"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:10.766721" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:50:10.767005" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:10.729898" elapsed="0.037135"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.767135" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:10.767292" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:10.729031" elapsed="0.038288"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.768665" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.767946" elapsed="0.000749"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:10.768744" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:10.768922" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:10.767567" elapsed="0.001382"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:10.769359" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 43, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.769109" elapsed="0.000278"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:10.769851" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.769611" elapsed="0.000266"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:10.769925" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:10.770078" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:10.561184" elapsed="0.208919"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:10.770162" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:10.770313" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:10.560413" elapsed="0.209925"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.770748" elapsed="0.000247"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.770444" elapsed="0.000595"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.771221" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.771068" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.771451" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.771303" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.770415" elapsed="0.001161"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:10.560238" elapsed="0.211366"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:10.298213" elapsed="0.473425"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:10.771683" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:10.771891" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:50:10.771938" level="INFO">${follower_list} = [3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:10.294103" elapsed="0.477860"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.772415" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:10.772492" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:10.772141" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.772822" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.772604" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.772586" elapsed="0.000314"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.775187" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:10.773039" elapsed="0.002196"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:10.775669" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.775456" elapsed="0.000241"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:10.775747" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:10.291404" elapsed="0.484501"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:50:10.291180" elapsed="0.484772"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.780812" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:10.780404" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.781415" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:10.781009" elapsed="0.000440"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:10.781507" elapsed="0.000059"/>
</return>
<msg time="2026-04-10T00:50:10.781721" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:10.779773" elapsed="0.001974"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:10.781906" elapsed="0.000157"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.782585" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:10.782225" elapsed="0.000389"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.783020" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:10.782776" elapsed="0.000271"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.783442" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:10.783200" 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-04-10T00:50:10.786341" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.785847" elapsed="0.000524"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:10.786420" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:10.786592" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:10.785357" elapsed="0.001263"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.845045" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.844651" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.845894" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:10.845626" elapsed="0.000343">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:10.846064" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:10.845249" elapsed="0.000840"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.846666" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:10.846258" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.846998" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:10.847155" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:10.846858" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.847673" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.847405" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.848711" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.848439" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.849188" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.848920" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.849601" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.849813" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.849992" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:10.849445" elapsed="0.000606"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.849266" elapsed="0.000817"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:10.850133" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:10.850301" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:10.848111" elapsed="0.002215"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.847798" elapsed="0.002561"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.850535" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.850384" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.847774" elapsed="0.002856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.851226" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.850779" elapsed="0.000474"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.851302" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:10.844021" elapsed="0.007406"/>
</kw>
<msg time="2026-04-10T00:50:10.851481" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:10.831381" elapsed="0.020155"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.864127" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.876536" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.889148" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.889399" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.889599" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.890095" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.889942" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:10.889925" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.890319" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.890488" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.890677" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:10.889889" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.889770" elapsed="0.000988"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.890913" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.890992" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:50:10.891313" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:10.827010" elapsed="0.064342"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.893202" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:10.892863" elapsed="0.000414">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:10.893406" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:10.892463" elapsed="0.000969"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.893783" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.893505" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.894349" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.894045" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.893865" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.893486" elapsed="0.000946"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.896784" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:10.894599" elapsed="0.002212"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:10.896862" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:10.897168" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:10.892000" elapsed="0.005203"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:10.898885" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:10.898643" elapsed="0.000305">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:10.899040" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:10.898264" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:10.899271" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:10.899136" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.899118" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.899502" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.899696" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.899763" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:10.902054" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:10.897831" elapsed="0.004261"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.903911" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.903650" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.904355" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.904112" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:10.915363" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:10.915826" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:10.916031" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:10.906527" elapsed="0.009531"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.904464" elapsed="0.011639"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.916293" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.916132" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.904446" elapsed="0.011933"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.920348" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.917456" elapsed="0.003229"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.917195" elapsed="0.003527"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.917176" elapsed="0.003571"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.923408" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.921031" elapsed="0.002423"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.920803" elapsed="0.002685"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.920786" elapsed="0.002727"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.924241" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.923705" elapsed="0.000563"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.924593" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.924339" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.925145" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.924838" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.924676" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.924321" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.925798" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.925412" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.926128" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.925895" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.926684" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.926370" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.926209" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.925877" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:10.926918" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:10.927736" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.927425" elapsed="0.000337"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.927918" elapsed="0.004257"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:10.916764" elapsed="0.015478"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.932422" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:10.932313" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.932294" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:10.940929" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:10.932657" elapsed="0.008304"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:10.941016" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:10.941392" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:10.902714" elapsed="0.038718"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.941526" elapsed="0.000097"/>
</return>
<msg time="2026-04-10T00:50:10.941895" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:10.802118" elapsed="0.139820"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.942912" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.942133" elapsed="0.000957"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.942114" elapsed="0.001016"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.943219" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:10.791284" elapsed="0.152130"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.786703" elapsed="0.156757"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.786680" elapsed="0.156803"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.944225" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:10.944095" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:10.944465" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:10.944344" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.944077" elapsed="0.000539"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.944774" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:50:10.944897" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:10.943790" elapsed="0.001134"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.945569" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.945103" elapsed="0.000495"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.946324" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.945758" elapsed="0.000595"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.953475" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.952766" elapsed="0.000892"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.954647" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.953925" elapsed="0.000881"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:10.963723" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:10.963789" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:10 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:10 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":15,"SnapshotIndex":106,"InMemoryJournalLogSize":51,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-default-operational","LastIndex":157,"RaftState":"Leader","LastApplied":155,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":157,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.328","active":true,"matchIndex":155,"voting":true,"id":"member-3-shard-default-operational","nextIndex":156},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-default-operational","nextIndex":107}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"386.4 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":155,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":11,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":94678},"timestamp":1775782210,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:10.964006" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:10.957268" elapsed="0.006774"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.954923" elapsed="0.009179"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.964485" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.964164" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.954891" elapsed="0.009816"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.969539" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":15,"SnapshotIndex":106,"InMemoryJournalLogSize":51,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-default-operational","LastIndex":157,"RaftState":"Leader","LastApplied":155,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":157,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.328","active":true,"matchIndex":155,"voting":true,"id":"member-3-shard-default-operational","nextIndex":156},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-default-operational","nextIndex":107}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"386.4 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":155,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":11,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":94678},"timestamp":1775782210,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.966885" elapsed="0.002734"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.966650" elapsed="0.003005"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.966602" elapsed="0.003097"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.972556" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:10.970070" elapsed="0.002535"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.969841" elapsed="0.002799"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.969791" elapsed="0.002892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.973446" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.972955" elapsed="0.000543"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.973912" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.973666" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.974496" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.974183" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.974014" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.973619" elapsed="0.001002"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.975306" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.974880" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.975780" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.975511" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.976349" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.976045" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.975881" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.975464" elapsed="0.000987"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:10.976718" elapsed="0.000429"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:10.977789" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.977429" elapsed="0.000411"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.978088" elapsed="0.002508"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:10.965587" elapsed="0.015118"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:10.981060" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:10.980836" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.980803" elapsed="0.000405"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:10.984994" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:10.981459" elapsed="0.003627"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:10.985212" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:50:10.985532" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:10.947364" elapsed="0.038216"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:10.985640" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:10.985790" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:10.946600" elapsed="0.039219"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.987156" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578221...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:10.986420" elapsed="0.000765"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:10.987234" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:10.987415" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578221...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:10.986047" elapsed="0.001394"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:10.987887" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 155, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.987652" elapsed="0.000262"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:10.988309" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.988073" elapsed="0.000262"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:10.988383" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:10.988537" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:10.784666" elapsed="0.203912"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:10.988636" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:10.988787" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:10.783926" elapsed="0.204890"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.989119" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.988898" elapsed="0.000278"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:10.989422" elapsed="0.000213"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.989200" elapsed="0.000473"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:10.989848" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:10.989698" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.988880" elapsed="0.001044"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:10.783748" elapsed="0.206200"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:10.992778" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:10.992208" elapsed="0.000598"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:10.992852" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:10.993005" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:10.991833" elapsed="0.001197"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.053449" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:11.053010" elapsed="0.000473"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:11.054395" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:11.054121" elapsed="0.000353">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:11.054586" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:11.053768" elapsed="0.000844"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.055177" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:11.054782" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:11.055514" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:11.055687" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:11.055371" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.056127" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.055876" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.057208" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.056950" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.057745" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:11.057452" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.058113" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.058323" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.058503" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:11.057973" elapsed="0.000605"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.057827" elapsed="0.000783"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:11.058658" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:50:11.058828" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:11.056616" elapsed="0.002238"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.056254" elapsed="0.002634"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.059066" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.058914" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.056231" elapsed="0.002915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.059780" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.059297" elapsed="0.000511"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:11.059857" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:11.052308" elapsed="0.007675"/>
</kw>
<msg time="2026-04-10T00:50:11.060038" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:11.039568" elapsed="0.020524"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.072815" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.085394" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.098156" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.098420" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.098629" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.099061" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.098906" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:11.098889" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.099291" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.099479" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.099669" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:11.098851" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.098723" elapsed="0.001029"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.099903" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.099984" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:50:11.100314" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:11.034963" elapsed="0.065388"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:11.102295" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:11.101926" elapsed="0.000448">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:11.102471" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:11.101507" elapsed="0.000990"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.102857" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.102587" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.103465" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:11.103135" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.102941" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.102568" elapsed="0.001002"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.106043" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:11.103728" elapsed="0.002342"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:11.106133" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:50:11.106457" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:11.101017" elapsed="0.005477"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:11.108346" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:11.108066" elapsed="0.000348">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:11.108511" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:11.107711" elapsed="0.000825"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:11.108769" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:50:11.108629" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.108609" elapsed="0.000254"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.109013" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.109201" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.109271" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:50:11.111790" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:11.107195" elapsed="0.004647"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.114043" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.113682" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.114675" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.114322" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:11.132776" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:11.133902" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:11.134484" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:11.117351" elapsed="0.017224"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.114824" elapsed="0.019867"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.135160" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.134759" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.114799" elapsed="0.020569"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.143219" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.137994" elapsed="0.005659"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.137341" elapsed="0.006355"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.137295" elapsed="0.006429"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.146563" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.144037" elapsed="0.002579"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.143789" elapsed="0.002863"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.143769" elapsed="0.002908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.147334" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.146876" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.147702" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.147437" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.148305" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:11.147971" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.147802" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.147418" elapsed="0.000974"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.149084" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.148572" elapsed="0.000544"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.149659" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.149199" elapsed="0.000559"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.150348" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:11.149990" elapsed="0.000385"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.149791" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.149179" elapsed="0.001253"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:11.150607" elapsed="0.000503"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:11.151611" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.151287" elapsed="0.000351"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:11.151798" elapsed="0.002612"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:11.136295" elapsed="0.018193"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.154685" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:11.154573" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.154553" elapsed="0.000203"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:11.163868" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:11.154904" elapsed="0.009005"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:11.163981" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:50:11.164374" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:11.112485" elapsed="0.051927"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:11.164522" elapsed="0.000110"/>
</return>
<msg time="2026-04-10T00:50:11.164915" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:11.010192" elapsed="0.154766"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.166041" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.165177" elapsed="0.001103"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.165154" elapsed="0.001170"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:11.166416" elapsed="0.000031"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:10.997768" elapsed="0.168871"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:10.993100" elapsed="0.173588"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:10.993082" elapsed="0.173633"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.167509" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:11.167372" elapsed="0.000255"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:11.167812" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:50:11.167657" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.167353" elapsed="0.000634"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.168202" elapsed="0.000026"/>
</kw>
<msg time="2026-04-10T00:50:11.168335" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:11.167024" elapsed="0.001337"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.169153" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.168568" elapsed="0.000615"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.170172" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:11.169398" elapsed="0.000805"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.177638" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.176762" elapsed="0.001078"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.178989" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.178170" elapsed="0.000993"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:11.188022" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:11.188115" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:11 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:11 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":106,"InMemoryJournalLogSize":55,"ReplicatedToAllIndex":106,"Leader":"member-1-shard-default-operational","LastIndex":161,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":161,"LastLogIndex":161,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"263.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":161,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":94842},"timestamp":1775782211,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:11.188432" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:11.181801" elapsed="0.006683"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.179288" elapsed="0.009300"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.189124" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.188679" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.179253" elapsed="0.010098"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.196586" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":106,"InMemoryJournalLogSize":55,"ReplicatedToAllIndex":106,"Leader":"member-1-shard-default-operational","LastIndex":161,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":161,"LastLogIndex":161,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"263.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":161,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":94842},"timestamp":1775782211,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.192474" elapsed="0.004203"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.192081" elapsed="0.004648"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.192016" elapsed="0.004782"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.200813" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.197339" elapsed="0.003544"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.196997" elapsed="0.003936"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.196931" elapsed="0.004068"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.202407" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.201383" elapsed="0.001124"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.203203" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.202786" elapsed="0.000510"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.204213" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:11.203657" elapsed="0.000608"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.203362" elapsed="0.000971"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.202716" elapsed="0.001689"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.205762" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.204907" elapsed="0.000942"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.206368" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.206049" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.207163" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:11.206764" elapsed="0.000436"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.206493" elapsed="0.000755"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.205989" elapsed="0.001313"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:11.207765" elapsed="0.000583"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:11.209160" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.208716" elapsed="0.000511"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:11.209660" elapsed="0.003051"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:11.190637" elapsed="0.022206"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.213229" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:11.212980" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.212944" elapsed="0.000442"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:11.217367" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:11.213706" elapsed="0.003758"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:11.217623" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:50:11.217938" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:11.171262" elapsed="0.046711"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:11.218091" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:50:11.218269" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:11.170429" elapsed="0.047867"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.219779" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578221...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.218987" elapsed="0.000828"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:11.219869" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:11.220052" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578221...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:11.218559" elapsed="0.001522"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:11.220496" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 161, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:11.220254" elapsed="0.000277"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:11.221041" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:11.220749" elapsed="0.000323"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:11.221131" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:50:11.221304" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:10.991140" elapsed="0.230191"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:11.221392" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:11.221673" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:10.990289" elapsed="0.231423"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:11.222092" elapsed="0.000224"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.221819" elapsed="0.000537"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.222533" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.222382" elapsed="0.000227"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.222795" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.222640" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.221795" elapsed="0.001076"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:10.990117" elapsed="0.232781"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:10.783521" elapsed="0.439418"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:11.222991" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:11.223230" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:50:11.223282" level="INFO">${follower_list} = [3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:10.779038" elapsed="0.444269"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.223789" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:11.223867" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:11.223489" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.224194" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.223962" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.223944" elapsed="0.000330"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.227154" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:11.224416" elapsed="0.002801"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:11.227676" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:11.227462" elapsed="0.000241"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:11.227752" 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="PASS" start="2026-04-10T00:50:10.776279" elapsed="0.451633"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:50:10.776045" elapsed="0.451925"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:50:09.850514" elapsed="1.377495"/>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:50:09.850111" elapsed="1.377969"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.233753" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:11.233290" elapsed="0.000491"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.234266" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:11.233944" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:11.234339" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:11.234510" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:11.232875" elapsed="0.001660"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:11.234715" elapsed="0.000163"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.235389" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:11.235041" elapsed="0.000374"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.235843" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:11.235600" elapsed="0.000269"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.236279" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:11.236021" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.239154" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:11.238664" elapsed="0.000519"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:11.239230" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:11.239412" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:11.238244" elapsed="0.001195"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.306839" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:11.306356" elapsed="0.000626"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:11.307901" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:11.307600" elapsed="0.000379">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:11.308077" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:11.307193" elapsed="0.000914"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.308696" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:11.308285" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:11.309037" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:11.309333" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:11.308893" elapsed="0.000469"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.309858" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.309529" 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-04-10T00:50:11.311048" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.310739" elapsed="0.000361"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.311567" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:11.311275" elapsed="0.000320"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.311939" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.312171" elapsed="0.000030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.312387" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:11.311797" elapsed="0.000666"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.311651" elapsed="0.000854"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:11.312573" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:50:11.312757" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:11.310376" elapsed="0.002414"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.309992" elapsed="0.002833"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.313005" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.312850" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.309968" elapsed="0.003116"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.313748" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.313231" elapsed="0.000554"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:11.313847" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:11.305588" elapsed="0.008396"/>
</kw>
<msg time="2026-04-10T00:50:11.314041" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:11.289996" elapsed="0.024100"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.327136" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.340119" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.352568" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.352863" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.353048" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.353452" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.353302" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:11.353285" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.353721" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.353892" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.354059" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:11.353249" elapsed="0.000864"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.353133" elapsed="0.001008"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.354290" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.354368" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:50:11.354718" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:11.284354" elapsed="0.070401"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:11.356563" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:11.356257" elapsed="0.000384">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:11.356736" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:11.355859" elapsed="0.000902"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.357093" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.356832" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.357712" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:11.357352" elapsed="0.000388"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.357175" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.356814" elapsed="0.000984"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.360173" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:11.357957" elapsed="0.002244"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:11.360253" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:11.360583" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:11.355379" elapsed="0.005240"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:11.362289" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:11.362044" elapsed="0.000309">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:11.362447" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:11.361698" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:11.362695" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:11.362558" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.362525" elapsed="0.000254"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.363101" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.363277" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.363344" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:11.365704" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:11.361213" elapsed="0.004530"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.367706" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.367416" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.368148" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.367907" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:11.379042" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:11.379669" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:11.379954" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:11.370353" elapsed="0.009639"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.368256" elapsed="0.011797"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.380306" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.380091" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.368238" elapsed="0.012187"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.385743" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.381906" elapsed="0.004290"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.381532" elapsed="0.004714"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.381505" elapsed="0.004775"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.390004" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.386696" elapsed="0.003356"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.386358" elapsed="0.003729"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.386334" elapsed="0.003777"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.390694" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.390284" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.391026" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.390791" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.391582" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:11.391267" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.391106" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.390773" elapsed="0.000891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.392190" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.391824" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.392517" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.392286" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.393073" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:11.392777" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.392614" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.392268" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:11.393307" elapsed="0.000374"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:11.394143" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.393848" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:11.394322" elapsed="0.002500"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:11.380942" elapsed="0.015944"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.397062" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:11.396956" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.396937" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:11.405528" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:11.397275" elapsed="0.008296"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:11.405651" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:11.405980" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:11.366337" elapsed="0.039680"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:11.406109" elapsed="0.000070"/>
</return>
<msg time="2026-04-10T00:50:11.406447" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:11.256330" elapsed="0.150158"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.407462" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.406707" elapsed="0.000948"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.406687" elapsed="0.001010"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:11.407786" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:11.244071" elapsed="0.163913"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.239512" elapsed="0.168518"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.239494" elapsed="0.168561"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:50:11.408785" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:11.408657" elapsed="0.000242"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.408963" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:11.408925" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.408639" elapsed="0.000437"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.409225" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:50:11.409346" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:11.408342" elapsed="0.001029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.409983" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.409538" elapsed="0.000472"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.410748" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:11.410167" elapsed="0.000610"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.418165" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.417355" elapsed="0.000995"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.419324" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.418640" elapsed="0.000848"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:11.428420" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:11.428482" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:11 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:11 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":null,"LastIndex":40024,"RaftState":"Candidate","LastApplied":40024,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:49:55.617","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"237.8 μs","Voting":true,"CurrentTerm":4,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":3420},"timestamp":1775782211,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:11.428724" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:11.422146" elapsed="0.006614"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.419703" elapsed="0.009114"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.429199" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.428881" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.419667" elapsed="0.009692"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.436828" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":null,"LastIndex":40024,"RaftState":"Candidate","LastApplied":40024,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:49:55.617","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"237.8 μs","Voting":true,"CurrentTerm":4,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":3420},"timestamp":1775782211,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.431498" elapsed="0.005493"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.431260" elapsed="0.005784"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.431213" elapsed="0.005895"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.441378" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:11.437676" elapsed="0.003769"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.437302" elapsed="0.004195"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.437238" elapsed="0.004345"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.442734" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.442035" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.443215" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.442967" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.443814" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:11.443484" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.443316" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.442921" elapsed="0.000995"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.444614" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.444170" elapsed="0.000497"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.445065" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.444822" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.445697" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:11.445328" elapsed="0.000396"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:11.445165" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.444773" elapsed="0.001027"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:11.446047" elapsed="0.000430"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:11.447112" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.446756" elapsed="0.000406"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:11.447409" elapsed="0.002492"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:11.430219" elapsed="0.019796"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.450370" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:11.450145" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:11.450112" elapsed="0.000413"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:11.454229" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:11.450816" elapsed="0.003509"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:11.454413" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:50:11.454759" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:11.411811" elapsed="0.042976"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:11.454845" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:11.454997" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:11.410995" elapsed="0.044028"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.456363" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782211, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:11.455659" elapsed="0.000733"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:11.456499" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:11.456701" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782211, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:11.455261" elapsed="0.001467"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:11.457113" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 40024, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInit...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:11.456885" elapsed="0.000255"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:11.457534" level="INFO">${raft_property} = Candidate</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:11.457298" elapsed="0.000279"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:11.457640" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:11.457797" level="INFO">${raft_state} = Candidate</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:11.237558" elapsed="0.220263"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:11.457877" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:11.458023" level="INFO">${raft_state} = Candidate</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:11.236751" elapsed="0.221297"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.458346" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.458127" elapsed="0.000277"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.458677" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.458427" elapsed="0.000306"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:50:11.459281" level="FAIL">Unrecognized Raft state: Candidate</msg>
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:50:11.458956" elapsed="0.000397">Unrecognized Raft state: Candidate</status>
</kw>
<status status="FAIL" start="2026-04-10T00:50:11.458758" elapsed="0.000662">Unrecognized Raft state: Candidate</status>
</branch>
<status status="FAIL" start="2026-04-10T00:50:11.458110" elapsed="0.001341">Unrecognized Raft state: Candidate</status>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-10T00:50:11.236577" elapsed="0.222926">Unrecognized Raft state: Candidate</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:50:11.236354" elapsed="0.223228">Unrecognized Raft state: Candidate</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.459640" 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-04-10T00:50:11.232130" elapsed="0.227617">Unrecognized Raft state: Candidate</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.459933" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.460166" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:11.460023" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:11.460006" 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-04-10T00:50:11.460376" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:11.460564" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:11.460630" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-10T00:50:11.229337" elapsed="0.231395">Unrecognized Raft state: Candidate</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-10T00:50:11.229056" elapsed="0.231745">Unrecognized Raft state: Candidate</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-10T00:50:11.228889" elapsed="0.231966">Unrecognized Raft state: Candidate</status>
</for>
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-10T00:50:11.228391" elapsed="0.232553">Unrecognized Raft state: Candidate</status>
</kw>
<arg>${Inventory_Followers}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-10T00:50:09.823754" elapsed="1.637337">Unrecognized Raft state: Candidate</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:13.487899" elapsed="0.000243"/>
</kw>
<msg time="2026-04-10T00:50:13.488207" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:13.487210" elapsed="0.001059"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:50:13.486737" elapsed="0.001626"/>
</kw>
<msg time="2026-04-10T00:50:13.488415" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:13.476640" elapsed="0.011822"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:50:13.475994" elapsed="0.012545"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.489042" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.488755" elapsed="0.000334"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.494389" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:13.493999" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.494937" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:13.494597" elapsed="0.000366"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:13.495011" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:13.495173" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:13.493605" elapsed="0.001593"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:13.495356" elapsed="0.000157"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.496030" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:13.495693" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.496457" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:13.496216" elapsed="0.000267"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.496889" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:13.496649" elapsed="0.000266"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.499868" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.499358" elapsed="0.000539"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:13.499943" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:13.500135" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:13.498952" elapsed="0.001211"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.559953" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.559562" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:13.560771" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:13.560493" elapsed="0.000357">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:13.561016" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:13.560152" elapsed="0.000890"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.561618" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:13.561211" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:13.561953" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:13.562111" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:13.561810" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.562562" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.562296" 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-04-10T00:50:13.563645" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.563361" elapsed="0.000330"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.564139" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:13.563859" 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-04-10T00:50:13.564683" elapsed="0.000025"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.564934" elapsed="0.000029"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.565124" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:13.564358" elapsed="0.000825"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:13.564217" elapsed="0.000998"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:13.565260" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:13.565427" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:13.563029" elapsed="0.002424"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.562683" elapsed="0.002802"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.565681" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.565511" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.562661" elapsed="0.003100"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.566354" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.565907" elapsed="0.000475"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:13.566433" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:13.558925" elapsed="0.007650"/>
</kw>
<msg time="2026-04-10T00:50:13.566629" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:13.545895" elapsed="0.020786"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.579361" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.591920" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.604374" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.604587" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.604766" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.605139" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.604992" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:13.604977" 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-04-10T00:50:13.605360" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.605529" 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-04-10T00:50:13.605725" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:13.604946" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:13.604843" elapsed="0.000965"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.605958" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:13.606037" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:13.606308" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:13.541135" elapsed="0.065211"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:13.608120" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:13.607859" elapsed="0.000327">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:13.608282" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:13.607473" elapsed="0.000833"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.608648" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.608379" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.609304" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.608934" elapsed="0.000406"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.608744" elapsed="0.000640"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.608360" elapsed="0.001048"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.611978" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:13.609622" elapsed="0.002383"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:13.612057" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:13.612363" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:13.607026" elapsed="0.005372"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:13.614058" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:13.613816" elapsed="0.000305">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:13.614254" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:13.613456" elapsed="0.000823"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:13.614496" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:13.614353" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.614334" elapsed="0.000265"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.614748" elapsed="0.000047"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.614949" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:13.615016" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:13.617370" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:13.613019" elapsed="0.004389"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.619434" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.619169" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.619933" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.619683" 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-04-10T00:50:13.631889" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:13.632366" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:13.632661" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:13.622183" elapsed="0.010509"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.620047" elapsed="0.012704"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.633303" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.632789" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.620028" elapsed="0.013604"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.643309" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.636299" elapsed="0.007761"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.635775" elapsed="0.008322"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.635729" elapsed="0.008393"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.646827" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.644413" elapsed="0.002463"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.644181" elapsed="0.002732"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.644163" elapsed="0.002780"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.647580" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.647164" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.647937" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.647681" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.648511" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.648206" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.648038" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.647662" elapsed="0.000950"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.649134" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.648771" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.649464" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.649231" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.650021" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.649723" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.649558" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.649213" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:13.650260" elapsed="0.000376"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:13.651130" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.650839" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:13.651313" elapsed="0.002533"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:13.634671" elapsed="0.019241"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:13.654096" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:13.653988" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.653969" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:13.662808" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:13.654314" elapsed="0.008532"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:13.662903" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:50:13.663249" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:13.618106" elapsed="0.045181"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:13.663379" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:50:13.663747" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:13.515487" elapsed="0.148302"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.664738" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.663982" elapsed="0.000925"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.663962" elapsed="0.000989"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:13.665042" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:13.504419" elapsed="0.160819"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.500240" elapsed="0.165046"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.500220" elapsed="0.165092"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:13.666091" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:13.665960" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:13.666331" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:13.666210" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.665942" elapsed="0.000524"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.666634" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:50:13.666757" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:13.665657" elapsed="0.001148"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.667395" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.666980" elapsed="0.000442"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.668165" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.667598" elapsed="0.000598"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.675750" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.675044" elapsed="0.000870"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.676975" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.676178" elapsed="0.000957"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:13.688190" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:13.688278" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:13 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:13 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastApplied":137,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.691","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"336.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":7926168},"timestamp":1775782213,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:13.688690" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:13.679680" elapsed="0.009067"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.677257" elapsed="0.011586"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.689391" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.688937" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.677223" elapsed="0.012420"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.696621" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastApplied":137,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.691","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"336.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":7926168},"timestamp":1775782213,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.692771" elapsed="0.003938"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.692360" elapsed="0.004399"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.692293" elapsed="0.004531"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.700697" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.697344" elapsed="0.003401"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.697018" elapsed="0.003763"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.696954" elapsed="0.003873"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.701573" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.701100" elapsed="0.000535"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.702100" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.701802" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.702717" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.702386" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.702215" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.701745" elapsed="0.001105"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.703571" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.703115" elapsed="0.000510"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.704024" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.703777" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.704665" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.704294" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.704127" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.703731" elapsed="0.001044"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:13.705028" elapsed="0.000434"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:13.706091" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.705743" elapsed="0.000397"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:13.706392" elapsed="0.002579"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:13.690881" elapsed="0.018198"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:13.709432" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:13.709211" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.709178" elapsed="0.000422"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:13.713383" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:13.709832" elapsed="0.003671"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:13.713619" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:50:13.713923" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:13.669217" elapsed="0.044774"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:13.714054" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:13.714212" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:13.668414" elapsed="0.045824"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.715718" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.714939" elapsed="0.000809"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:13.715801" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:13.716006" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:13.714478" elapsed="0.001556"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:13.716443" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 137, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:13.716210" elapsed="0.000262"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:13.716922" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:13.716669" elapsed="0.000280"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:13.716999" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:13.717159" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:13.498073" elapsed="0.219112"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:13.717245" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:13.717397" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:13.497336" elapsed="0.220087"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:13.717750" elapsed="0.000205"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.717508" elapsed="0.000486"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.718171" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.718019" elapsed="0.000208"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.718396" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.718250" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.717490" elapsed="0.000981"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:13.497166" elapsed="0.221331"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.721254" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.720756" elapsed="0.000526"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:13.721330" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:13.721481" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:13.720268" elapsed="0.001239"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.780789" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.780384" elapsed="0.000435"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:13.781600" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:13.781325" elapsed="0.000464">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:13.781889" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:13.780988" elapsed="0.000927"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.782476" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:13.782085" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:13.782835" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:13.783012" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:13.782691" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.783449" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.783198" 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-04-10T00:50:13.784471" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.784216" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.784961" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:13.784693" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.785319" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.785529" elapsed="0.000039"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.785723" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:13.785182" elapsed="0.000600"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:13.785040" elapsed="0.000773"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:13.785860" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:13.786024" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:13.783887" elapsed="0.002162"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.783582" elapsed="0.002500"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.786256" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.786106" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.783561" elapsed="0.002773"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.786974" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.786477" elapsed="0.000525"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:13.787052" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:13.779769" elapsed="0.007409"/>
</kw>
<msg time="2026-04-10T00:50:13.787233" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:13.766919" elapsed="0.020366"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.799848" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.812359" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.824894" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.825104" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.825287" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.825697" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.825528" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:13.825511" 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-04-10T00:50:13.825939" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.826116" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.826285" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:13.825478" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:13.825371" elapsed="0.000994"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.826513" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:13.826607" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:50:13.826952" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:13.762392" elapsed="0.064599"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:13.828762" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:13.828470" elapsed="0.000367">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:13.828938" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:13.828100" elapsed="0.000865"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.829292" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.829037" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.829916" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.829574" elapsed="0.000378"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.829373" elapsed="0.000616"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.829019" elapsed="0.000996"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.832629" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:13.830199" elapsed="0.002460"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:13.832713" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:13.833037" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:13.827632" elapsed="0.005441"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:13.834970" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:13.834564" elapsed="0.000480">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:13.835219" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:13.834189" elapsed="0.001056"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:13.835465" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:13.835323" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.835303" elapsed="0.000269"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.835726" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.835904" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:13.835971" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:13.838254" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:13.833717" elapsed="0.004574"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.842747" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.842043" elapsed="0.000828"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.843922" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.843330" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:13.867683" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:13.868648" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:13.869174" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:13.849257" elapsed="0.019977"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.844199" elapsed="0.025141"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.869839" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.869413" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.844147" elapsed="0.025890"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.876631" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.872368" elapsed="0.004742"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.872006" elapsed="0.005158"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.871975" elapsed="0.005225"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.881195" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.877644" elapsed="0.003619"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.877285" elapsed="0.004029"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.877259" elapsed="0.004091"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.882240" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.881647" elapsed="0.000632"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.882760" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.882383" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.883639" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.883170" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.882881" elapsed="0.000850"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.882356" elapsed="0.001405"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.884328" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.883968" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.884675" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.884425" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.885216" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.884920" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.884756" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.884407" elapsed="0.000891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:13.885455" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:13.886295" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.885988" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:13.886476" elapsed="0.002649"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:13.871012" elapsed="0.018181"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:13.889376" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:13.889265" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.889247" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:13.897908" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:13.889616" elapsed="0.008326"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:13.898002" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:50:13.898372" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:13.839252" elapsed="0.059157"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:13.898503" elapsed="0.000107"/>
</return>
<msg time="2026-04-10T00:50:13.898887" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:13.737231" elapsed="0.161733"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.899993" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.899167" elapsed="0.001018"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.899147" elapsed="0.001079"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:13.900317" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:13.725981" elapsed="0.174533"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.721593" elapsed="0.178987"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.721575" elapsed="0.179032"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:13.901369" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:13.901239" elapsed="0.000223"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:13.901627" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:13.901487" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.901221" elapsed="0.000544"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.901936" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:50:13.902059" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:13.900911" elapsed="0.001174"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.902741" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.902268" elapsed="0.000500"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.903523" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.902954" elapsed="0.000616"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.910677" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.909966" elapsed="0.000876"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.911845" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.911148" elapsed="0.000855"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:13.921278" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:13.921368" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:13 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:13 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":137,"LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.689","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.045","active":true,"matchIndex":137,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":138},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-operational","nextIndex":137}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"486.8 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":7926168},"timestamp":1775782213,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:13.921705" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:13.914463" elapsed="0.007294"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.912123" elapsed="0.009717"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.922381" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.921930" elapsed="0.000685"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.912088" elapsed="0.010611"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.929595" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":137,"LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.689","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.045","active":true,"matchIndex":137,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":138},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-operational","nextIndex":137}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"486.8 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":7926168},"timestamp":1775782213,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.925773" elapsed="0.003919"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.925421" elapsed="0.004323"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.925356" elapsed="0.004450"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.933349" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:13.930323" elapsed="0.003073"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.929998" elapsed="0.003433"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.929935" elapsed="0.003541"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.934272" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.933796" elapsed="0.000528"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.934740" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.934476" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.935342" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.935030" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.934840" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.934430" elapsed="0.001015"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.936157" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.935736" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.936618" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.936361" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.937187" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.936885" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.936719" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.936315" elapsed="0.000973"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:13.937588" elapsed="0.000439"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:13.938666" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.938288" elapsed="0.000428"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:13.939010" elapsed="0.002710"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:13.923929" elapsed="0.017915"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:13.942228" elapsed="0.000054"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:13.941990" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.941953" elapsed="0.000431"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:13.946273" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:13.942713" elapsed="0.003654"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:13.946530" elapsed="0.000093"/>
</return>
<msg time="2026-04-10T00:50:13.946883" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:13.904642" elapsed="0.042270"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:13.947007" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:13.947165" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:13.903790" elapsed="0.043402"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.948756" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:13.947947" elapsed="0.000838"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:13.948834" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:13.949015" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:13.947470" elapsed="0.001571"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:13.949435" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 137, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:13.949200" elapsed="0.000263"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:13.949874" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:13.949635" elapsed="0.000264"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:13.949946" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:13.950102" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:13.719636" elapsed="0.230491"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:13.950186" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:13.950339" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:13.718889" elapsed="0.231475"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.950757" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.950461" elapsed="0.000352"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:13.951067" elapsed="0.000202"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.950839" elapsed="0.000468"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.951481" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.951331" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.950440" elapsed="0.001133"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:13.718687" elapsed="0.232913"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:13.496963" elapsed="0.454675"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:13.951685" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:13.951893" level="INFO">${leader_list} = [3]</msg>
<msg time="2026-04-10T00:50:13.951939" level="INFO">${follower_list} = [1]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:13.492862" elapsed="0.459100"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.952429" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:13.952507" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:13.952142" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:13.952958" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:13.952617" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.952598" elapsed="0.000440"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.957272" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:13.953176" elapsed="0.004155"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:13.957748" level="INFO">${leader} = 3</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:13.957521" elapsed="0.000252"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:13.957824" elapsed="0.000040"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:13.490157" elapsed="0.467845"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:50:13.489920" elapsed="0.468130"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.962806" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:13.962330" elapsed="0.000503"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.963334" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:13.963030" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:13.963405" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:13.963580" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:13.961950" elapsed="0.001656"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:13.963762" elapsed="0.000161"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.964417" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:13.964083" elapsed="0.000361"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.964874" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:13.964627" elapsed="0.000273"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.965287" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:13.965049" elapsed="0.000263"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:13.968269" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:13.967767" elapsed="0.000534"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:13.968354" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:50:13.968536" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:13.967299" elapsed="0.001281"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.030366" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.029906" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.031349" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.031007" elapsed="0.000426">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:14.031530" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:14.030619" elapsed="0.000953"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.032132" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:14.031744" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.032465" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:14.032733" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:14.032322" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.033170" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.032920" 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-04-10T00:50:14.034297" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.034040" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.034795" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.034506" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.035206" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.035415" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.035610" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:14.035064" elapsed="0.000607"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.034878" elapsed="0.000825"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:14.035754" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:50:14.035927" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:14.033700" elapsed="0.002252"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.033304" elapsed="0.002680"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.036163" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.036010" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.033275" elapsed="0.002965"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.036922" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.036442" elapsed="0.000509"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.036999" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:14.029030" elapsed="0.008095"/>
</kw>
<msg time="2026-04-10T00:50:14.037181" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:14.015779" elapsed="0.021455"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.050106" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.062598" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.075031" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.075368" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.075569" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.076003" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.075848" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:14.075828" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.076233" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.076403" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.076587" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:14.075788" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.075665" elapsed="0.001007"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.076823" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.076903" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:50:14.077245" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:14.010932" elapsed="0.066351"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.079147" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.078825" elapsed="0.000400">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:14.079320" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:14.078407" elapsed="0.000938"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.079693" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.079416" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.080260" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.079964" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.079776" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.079398" elapsed="0.000944"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.082722" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:14.080492" elapsed="0.002257"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:14.082801" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:14.083148" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:14.077934" elapsed="0.005250"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.084885" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.084605" elapsed="0.000353">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:14.085055" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:14.084240" elapsed="0.000840"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:14.085308" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:50:14.085161" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.085138" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.085661" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.085841" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.085908" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:50:14.088466" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:14.083794" elapsed="0.004715"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.090856" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.090464" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.091365" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.091116" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:14.101538" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:14.102239" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:14.102651" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:14.093694" elapsed="0.009002"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.091495" elapsed="0.011280"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.103150" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.102829" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.091466" elapsed="0.011820"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.109375" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.104985" elapsed="0.004935"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.104632" elapsed="0.005345"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.104599" elapsed="0.005416"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.113579" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.110446" elapsed="0.003181"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.110104" elapsed="0.003557"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.110078" elapsed="0.003608"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.114296" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.113887" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.114656" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.114395" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.115235" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.114908" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.114740" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.114376" elapsed="0.000943"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.115861" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.115480" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.116195" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.115960" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.116749" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.116437" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.116276" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.115941" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:14.116988" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:14.117820" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.117503" elapsed="0.000343"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.118002" elapsed="0.002525"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:14.103909" elapsed="0.016706"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.120802" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:14.120689" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.120670" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:14.129672" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:14.121031" elapsed="0.008673"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:14.129758" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:50:14.130110" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:14.089236" elapsed="0.040911"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.130240" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:50:14.130607" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:13.985235" elapsed="0.145415"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.131845" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.130845" elapsed="0.001189"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.130826" elapsed="0.001249"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.132162" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:13.973234" elapsed="0.159123"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:13.968669" elapsed="0.163735"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:13.968645" elapsed="0.163784"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.133180" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:14.133050" elapsed="0.000227"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:14.133423" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:14.133302" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.133032" elapsed="0.000544"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.133734" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:14.133856" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:14.132742" elapsed="0.001140"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.134498" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.134058" elapsed="0.000467"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.135287" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.134700" elapsed="0.000615"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.142440" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.141754" elapsed="0.000932"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.143688" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.142947" elapsed="0.000902"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:14.152628" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:14.152716" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:14 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:14 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Leader","LastApplied":43,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":43},{"timeSinceLastActivity":"00:00:00.425","active":true,"matchIndex":43,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":44}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"612.2 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":10171},"timestamp":1775782214,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:14.153015" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:14.146310" elapsed="0.006757"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.143969" elapsed="0.009180"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.153698" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.153235" elapsed="0.000670"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.143936" elapsed="0.010055"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.160886" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Leader","LastApplied":43,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":43},{"timeSinceLastActivity":"00:00:00.425","active":true,"matchIndex":43,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":44}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"612.2 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":10171},"timestamp":1775782214,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.157056" elapsed="0.003926"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.156727" elapsed="0.004305"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.156662" elapsed="0.004433"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.164812" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.161632" elapsed="0.003228"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.161289" elapsed="0.003606"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.161226" elapsed="0.003716"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.165681" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.165215" elapsed="0.000518"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.166128" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.165884" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.166724" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.166398" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.166229" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.165838" elapsed="0.000990"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.167535" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.167111" elapsed="0.000493"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.168002" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.167757" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.168584" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.168266" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.168101" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.167711" elapsed="0.000977"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:14.168935" elapsed="0.000428"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:14.169996" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.169652" elapsed="0.000396"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.170299" elapsed="0.002478"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:14.155283" elapsed="0.017603"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.173242" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:14.173019" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.172985" elapsed="0.000409"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:14.177161" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:14.173641" elapsed="0.003615"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:14.177391" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:50:14.177692" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:14.136346" elapsed="0.041375"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.177781" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:14.177939" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:14.135531" elapsed="0.042436"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.179351" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.178605" elapsed="0.000775"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:14.179430" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:14.179632" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:14.178199" elapsed="0.001461"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:14.180051" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 43, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.179819" elapsed="0.000261"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:14.180476" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.180239" elapsed="0.000263"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:14.180564" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:14.180721" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:13.966561" elapsed="0.214185"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:14.180805" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:14.180956" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:13.965801" elapsed="0.215180"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.181282" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.181062" elapsed="0.000279"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.181590" elapsed="0.000191"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.181364" elapsed="0.000455"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.181992" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.181844" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.181045" elapsed="0.001022"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:13.965618" elapsed="0.216473"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.184689" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.184213" elapsed="0.000503"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:14.184761" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:14.184909" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:14.183847" elapsed="0.001087"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.242311" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.241920" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.243325" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.242941" elapsed="0.000466">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:14.243506" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:14.242590" elapsed="0.000941"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.244312" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:14.243762" elapsed="0.000581"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.244678" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:14.244839" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:14.244513" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.245460" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.245026" 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-04-10T00:50:14.246642" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.246317" elapsed="0.000373"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.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-04-10T00:50:14.246858" elapsed="0.000335"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.247565" 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-04-10T00:50:14.247818" 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-04-10T00:50:14.248008" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:14.247395" elapsed="0.000672"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.247251" elapsed="0.000848"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:14.248146" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:14.248315" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:14.245986" elapsed="0.002354"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.245637" elapsed="0.002736"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.248569" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.248398" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.245606" elapsed="0.003045"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.249266" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.248797" elapsed="0.000497"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.249344" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:14.241287" elapsed="0.008184"/>
</kw>
<msg time="2026-04-10T00:50:14.249526" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:14.228809" elapsed="0.020790"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.264056" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.278090" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.290703" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.290916" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.291100" elapsed="0.000062"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.291557" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.291391" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:14.291375" elapsed="0.000267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.291786" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.291956" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.292125" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:14.291342" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.291230" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.292353" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.292430" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:14.292768" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:14.224470" elapsed="0.068337"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.294603" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.294310" elapsed="0.000371">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:14.294774" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:14.293937" elapsed="0.000861"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.295145" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.294869" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.295736" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.295417" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.295235" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.294851" elapsed="0.000969"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.298216" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:14.295976" elapsed="0.002267"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:14.298295" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:14.298637" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:14.293454" elapsed="0.005220"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.300511" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.300263" elapsed="0.000331">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:14.300690" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:14.299872" elapsed="0.000843"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:14.300927" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:50:14.300788" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.300770" elapsed="0.000252"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.301184" 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-04-10T00:50:14.301387" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.301456" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:14.303735" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:14.299359" elapsed="0.004414"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.305651" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.305369" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.306183" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.305856" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:14.324853" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:14.325965" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:14.326590" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:14.308527" elapsed="0.018156"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.306301" elapsed="0.020529"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.327367" elapsed="0.000090"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.326903" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.306282" elapsed="0.021386"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.336846" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.330689" elapsed="0.006550"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.330049" elapsed="0.007234"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.329998" elapsed="0.007314"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.340084" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.337649" elapsed="0.002484"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.337378" elapsed="0.002792"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.337357" elapsed="0.002838"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.340830" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.340395" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.341177" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.340933" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.341751" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.341425" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.341260" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.340914" elapsed="0.000948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.342509" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.342092" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.342884" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.342627" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.343515" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.343208" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.342974" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.342608" elapsed="0.001009"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:14.343774" elapsed="0.000394"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:14.344695" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.344343" elapsed="0.000388"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.344954" elapsed="0.002918"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:14.328787" elapsed="0.019158"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.348154" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:14.348024" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.348004" elapsed="0.000240"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:14.359215" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:14.348432" elapsed="0.010835"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:14.359353" elapsed="0.000060"/>
</return>
<msg time="2026-04-10T00:50:14.359799" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:14.304386" elapsed="0.055452"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.359946" elapsed="0.000093"/>
</return>
<msg time="2026-04-10T00:50:14.360367" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:14.200153" elapsed="0.160265"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.361559" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.360666" elapsed="0.001146"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.360642" elapsed="0.001215"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.361952" elapsed="0.000031"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:14.189312" elapsed="0.172856"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.185002" elapsed="0.177216"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.184985" elapsed="0.177258"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.363070" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:14.362933" elapsed="0.000293"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:14.363425" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:50:14.363266" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.362915" elapsed="0.000671"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.363810" elapsed="0.000035"/>
</kw>
<msg time="2026-04-10T00:50:14.363985" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:14.362598" elapsed="0.001423"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.364859" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.364266" elapsed="0.000630"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.365840" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.365108" elapsed="0.000770"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.373565" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.372791" elapsed="0.000973"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.374844" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.374045" elapsed="0.001004"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:14.384497" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:14.384780" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:14 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:14 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":43,"LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.054","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"222.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":10171},"timestamp":1775782214,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:14.385058" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:14.378011" elapsed="0.007088"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.375241" elapsed="0.009939"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.385657" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.385256" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.375198" elapsed="0.010634"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.392446" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":43,"LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.054","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"222.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":10171},"timestamp":1775782214,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.388616" elapsed="0.003920"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.388073" elapsed="0.004536"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.388003" elapsed="0.004677"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.396654" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.393344" elapsed="0.003361"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.392931" elapsed="0.003819"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.392852" elapsed="0.003954"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.397600" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.397107" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.398065" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.397810" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.398729" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.398349" elapsed="0.000408"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.398178" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.397763" elapsed="0.001073"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.399581" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.399098" elapsed="0.000537"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.400033" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.399789" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.400636" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.400316" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.400145" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.399742" elapsed="0.000997"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:14.400993" elapsed="0.000451"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:14.402080" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.401724" elapsed="0.000415"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.402398" elapsed="0.002512"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:14.386743" elapsed="0.018281"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.405397" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:14.405168" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.405126" elapsed="0.000445"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:14.409438" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:14.405838" elapsed="0.003699"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:14.409658" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:50:14.409956" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:14.367057" elapsed="0.042927"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.410095" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:14.410258" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:14.366179" elapsed="0.044107"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.411732" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.410917" elapsed="0.000845"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:14.411813" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:14.411992" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:14.410521" elapsed="0.001498"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:14.412424" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 43, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.412190" elapsed="0.000262"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:14.412871" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.412629" elapsed="0.000273"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:14.412967" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:14.413142" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:14.183229" elapsed="0.229940"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:14.413230" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:14.413384" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:14.182430" elapsed="0.230979"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.413734" elapsed="0.000204"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.413493" elapsed="0.000485"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.414167" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.414003" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.414395" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.414250" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.413475" elapsed="0.000993"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:14.182258" elapsed="0.232236"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:13.965372" elapsed="0.449157"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:14.414592" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:14.414801" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:50:14.414847" level="INFO">${follower_list} = [3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:13.961218" elapsed="0.453653"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.415428" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:14.415506" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:14.415051" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.415887" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.415667" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.415648" elapsed="0.000316"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.418209" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:14.416106" elapsed="0.002152"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:14.418738" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.418506" elapsed="0.000262"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:14.418820" elapsed="0.000037"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:13.958444" elapsed="0.460547"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:50:13.958159" elapsed="0.460882"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.423710" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:14.423306" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.424206" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:14.423898" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:14.424278" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:14.424433" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:14.422900" elapsed="0.001557"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:14.424629" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.425291" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:14.424946" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.425733" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:14.425476" elapsed="0.000283"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.426152" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:14.425910" 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-04-10T00:50:14.429027" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.428472" elapsed="0.000585"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:14.429118" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:50:14.429287" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:14.428073" elapsed="0.001240"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.490969" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.490570" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.491828" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.491562" elapsed="0.000344">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:14.492000" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:14.491177" elapsed="0.000848"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.492594" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:14.492191" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.492924" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:14.493083" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:14.492784" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.493591" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.493323" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.494616" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.494345" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.495095" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.494824" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.495470" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.495696" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.495884" elapsed="0.000037"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:14.495331" elapsed="0.000640"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.495174" elapsed="0.000834"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:14.496059" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:14.496230" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:14.494022" elapsed="0.002233"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.493716" elapsed="0.002572"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.496465" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.496314" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.493693" elapsed="0.002863"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.497151" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.496707" elapsed="0.000472"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.497227" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:14.489933" elapsed="0.007418"/>
</kw>
<msg time="2026-04-10T00:50:14.497405" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:14.477155" elapsed="0.020302"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.510129" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.522585" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.535129" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.535358" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.535536" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.535965" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.535818" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:14.535803" 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-04-10T00:50:14.536188" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.536358" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.536525" elapsed="0.000037"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:14.535774" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.535672" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.536773" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.536850" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:14.537160" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:14.472744" elapsed="0.064453"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.539059" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.538815" elapsed="0.000310">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:14.539219" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:14.538452" elapsed="0.000815"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.539607" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.539341" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.540168" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.539872" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.539691" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.539322" elapsed="0.000928"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.542607" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:14.540401" elapsed="0.002234"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:14.542686" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:14.542990" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:14.537834" elapsed="0.005190"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.544684" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.544426" elapsed="0.000320">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:14.544839" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:14.544090" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:14.545095" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:14.544955" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.544932" elapsed="0.000248"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.545328" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.545499" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.545581" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:14.547891" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:14.543653" elapsed="0.004276"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.549731" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.549458" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.550180" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.549934" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:14.562255" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:14.562868" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:14.563166" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:14.552421" elapsed="0.010783"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.550290" elapsed="0.012997"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.563565" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.563327" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.550272" elapsed="0.013418"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.569623" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.565128" elapsed="0.004966"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.564811" elapsed="0.005334"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.564784" elapsed="0.005396"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.573950" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.570611" elapsed="0.003408"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.570262" elapsed="0.003806"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.570237" elapsed="0.003866"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.574887" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.574338" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.575398" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.575025" elapsed="0.000457"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.576258" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.575827" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.575516" elapsed="0.000830"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.574999" elapsed="0.001377"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.577138" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.576632" elapsed="0.000543"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.577626" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.577275" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.578389" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.577972" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.577743" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.577249" elapsed="0.001256"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:14.578737" elapsed="0.000500"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:14.579931" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.579511" elapsed="0.000456"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.580124" elapsed="0.002393"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:14.564195" elapsed="0.018400"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.582774" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:14.582667" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.582647" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:14.591395" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:14.582991" elapsed="0.008435"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:14.591479" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:14.591828" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:14.548515" elapsed="0.043350"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.591960" elapsed="0.000075"/>
</return>
<msg time="2026-04-10T00:50:14.592304" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:14.446927" elapsed="0.145419"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.593314" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.592561" elapsed="0.000918"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.592522" elapsed="0.000998"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.593629" elapsed="0.000031"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:14.435166" elapsed="0.158660"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.429383" elapsed="0.164488"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.429365" elapsed="0.164531"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.594626" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:14.594481" elapsed="0.000241"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:14.594870" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:14.594748" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.594463" elapsed="0.000543"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.595156" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:14.595288" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:14.594186" elapsed="0.001129"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.595915" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.595487" elapsed="0.000455"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.596684" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.596101" elapsed="0.000611"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.603981" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.603115" elapsed="0.001082"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.605419" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.604535" elapsed="0.001087"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:14.614713" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:14.614773" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:14 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:14 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":19,"SnapshotIndex":106,"InMemoryJournalLogSize":65,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-default-operational","LastIndex":171,"RaftState":"Leader","LastApplied":169,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":171,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.339","active":true,"matchIndex":169,"voting":true,"id":"member-3-shard-default-operational","nextIndex":170},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-default-operational","nextIndex":107}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"504.4 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":169,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":14,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":95252},"timestamp":1775782214,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:14.614988" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:14.608171" elapsed="0.006853"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.605748" elapsed="0.009333"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.615486" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.615141" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.605713" elapsed="0.009989"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.620428" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":19,"SnapshotIndex":106,"InMemoryJournalLogSize":65,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-default-operational","LastIndex":171,"RaftState":"Leader","LastApplied":169,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":171,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.339","active":true,"matchIndex":169,"voting":true,"id":"member-3-shard-default-operational","nextIndex":170},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-default-operational","nextIndex":107}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"504.4 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":169,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":14,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":95252},"timestamp":1775782214,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.617800" elapsed="0.002700"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.617532" elapsed="0.003004"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.617486" elapsed="0.003112"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.624687" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.620984" elapsed="0.003769"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.620734" elapsed="0.004069"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.620689" elapsed="0.004178"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.625867" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.625233" elapsed="0.000809"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.626630" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.626260" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.627479" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.627014" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.626774" elapsed="0.000832"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.626193" elapsed="0.001471"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.628636" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.628023" elapsed="0.000685"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.629259" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.628917" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.630077" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.629651" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.629397" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.628852" elapsed="0.001367"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:14.630588" elapsed="0.000594"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:14.632050" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.631610" elapsed="0.000491"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.632350" elapsed="0.002486"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:14.616517" elapsed="0.018427"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.635316" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:14.635080" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.635047" elapsed="0.000422"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:14.639407" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:14.635719" elapsed="0.003784"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:14.639649" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:50:14.639941" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:14.597761" elapsed="0.042208"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.640028" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:14.640181" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:14.596930" elapsed="0.043277"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.641611" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578221...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.640874" elapsed="0.000768"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:14.641690" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:14.641871" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578221...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:14.640440" elapsed="0.001458"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:14.642287" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 169, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.642056" elapsed="0.000259"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:14.642721" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.642471" elapsed="0.000276"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:14.642794" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:14.642945" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:14.427394" elapsed="0.215576"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:14.643027" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:50:14.643172" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:14.426623" elapsed="0.216573"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.643555" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.643277" elapsed="0.000337"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.643847" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.643638" elapsed="0.000436"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.644360" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.644098" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.643260" elapsed="0.001175"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:14.426435" elapsed="0.218023"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.647045" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.646580" elapsed="0.000491"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:14.647117" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:14.647264" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:14.646200" elapsed="0.001089"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.705616" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.705224" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.706459" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.706203" elapsed="0.000335">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:14.706650" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:14.705859" elapsed="0.000816"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.707225" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:14.706841" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.707606" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:14.707761" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:14.707447" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.708190" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.707944" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.709199" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.708941" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.709688" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.709406" 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-04-10T00:50:14.710037" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.710243" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.710418" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:14.709902" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.709766" elapsed="0.000739"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:14.710564" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:14.710726" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:14.708616" elapsed="0.002136"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.708303" elapsed="0.002481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.710957" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.710808" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.708284" elapsed="0.002749"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.711642" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.711176" elapsed="0.000494"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.711718" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:14.704614" elapsed="0.007227"/>
</kw>
<msg time="2026-04-10T00:50:14.711895" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:14.692111" elapsed="0.019834"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.724497" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.741922" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.754310" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.754516" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.754711" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.755087" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.754939" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:14.754923" 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-04-10T00:50:14.755312" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.755515" elapsed="0.000042"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.755714" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:14.754893" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.754790" elapsed="0.001004"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.755942" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.756018" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:14.756288" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:14.687698" elapsed="0.068626"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.757997" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.757751" elapsed="0.000312">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:14.758155" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:14.757387" elapsed="0.000793"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.758493" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.758248" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.759053" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.758761" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.758591" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.758230" elapsed="0.000905"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.761477" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:14.759284" elapsed="0.002220"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:14.761585" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:14.761892" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:14.756950" elapsed="0.004976"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.763743" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.763460" elapsed="0.000348">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:14.763903" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:14.762999" elapsed="0.000929"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:14.764135" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:14.764000" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.763981" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.764366" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.764538" elapsed="0.000038"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.764623" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:14.766871" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:14.762557" elapsed="0.004351"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.768755" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.768477" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.769197" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.768956" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:14.787206" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:14.788244" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:14.788729" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:14.771423" elapsed="0.017367"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.769306" elapsed="0.019578"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.789281" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.788943" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.769288" elapsed="0.020183"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.796876" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.791778" elapsed="0.005452"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.791231" elapsed="0.006035"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.791191" elapsed="0.006099"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.799959" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.797591" elapsed="0.002414"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.797347" elapsed="0.002693"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.797330" elapsed="0.002735"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.800624" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.800228" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.800958" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.800722" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.801498" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.801200" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.801039" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.800703" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.802123" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.801761" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.802453" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.802219" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.803008" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.802712" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.802533" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.802201" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:14.803238" elapsed="0.000394"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:14.804082" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.803800" elapsed="0.000308"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.804261" elapsed="0.002477"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:14.790275" elapsed="0.016526"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.806975" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:14.806871" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.806852" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:14.815356" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:14.807188" elapsed="0.008199"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:14.815461" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:14.815799" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:14.767531" elapsed="0.048306"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.815928" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:50:14.816263" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:14.662611" elapsed="0.153693"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.817236" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.816492" elapsed="0.000901"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.816473" elapsed="0.000960"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.817521" 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="PASS" start="2026-04-10T00:50:14.651738" elapsed="0.166026"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.647405" elapsed="0.170413"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.647387" elapsed="0.170474"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.818600" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:14.818453" elapsed="0.000263"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:14.818901" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:50:14.818748" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.818434" elapsed="0.000619"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.819204" elapsed="0.000024"/>
</kw>
<msg time="2026-04-10T00:50:14.819328" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:14.818161" elapsed="0.001192"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.820073" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.819613" elapsed="0.000488"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.820851" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.820261" elapsed="0.000623"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.828296" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.827560" elapsed="0.000900"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.829465" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.828762" elapsed="0.000884"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:14.838074" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:14.838135" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:14 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:14 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":106,"InMemoryJournalLogSize":69,"ReplicatedToAllIndex":106,"Leader":"member-1-shard-default-operational","LastIndex":175,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":175,"LastLogIndex":175,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"219.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":175,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":95416},"timestamp":1775782214,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:14.838345" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:14.832236" elapsed="0.006146"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.829765" elapsed="0.008685"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.838852" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.838516" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.829732" elapsed="0.009285"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.846234" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":106,"InMemoryJournalLogSize":69,"ReplicatedToAllIndex":106,"Leader":"member-1-shard-default-operational","LastIndex":175,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":175,"LastLogIndex":175,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"219.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":175,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":95416},"timestamp":1775782214,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.841778" elapsed="0.004543"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.841376" elapsed="0.004996"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.841312" elapsed="0.005125"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.850504" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.847011" elapsed="0.003581"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.846676" elapsed="0.003967"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.846597" elapsed="0.004125"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.851833" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.851098" elapsed="0.000807"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.852320" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.852073" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.852936" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.852625" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.852420" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.852027" elapsed="0.001011"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.853725" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.853288" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.854166" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.853924" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.854748" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.854430" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.854265" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.853877" elapsed="0.000973"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:14.855091" elapsed="0.000443"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:14.856143" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.855806" elapsed="0.000387"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.856440" elapsed="0.002440"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:14.839895" elapsed="0.019097"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.859337" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:14.859120" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.859088" elapsed="0.000435"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:14.863263" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:14.859770" elapsed="0.003586"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:14.863472" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:14.863764" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:14.822005" elapsed="0.041787"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.863886" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:14.864037" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:14.821111" elapsed="0.042951"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.865402" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578221...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.864713" elapsed="0.000718"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:14.865480" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:14.865672" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578221...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:14.864285" elapsed="0.001414"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:14.866078" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 175, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.865857" elapsed="0.000248"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:14.866497" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.866262" elapsed="0.000262"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:14.866592" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:14.866749" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:14.645597" elapsed="0.221177"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:14.866831" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:14.866982" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:14.644866" elapsed="0.222141"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.867305" elapsed="0.000223"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.867087" elapsed="0.000495"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.867754" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.867607" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.867973" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.867831" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.867069" elapsed="0.000976"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:14.644694" elapsed="0.223376"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:14.426231" elapsed="0.442018"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:14.868291" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:14.868492" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:50:14.868538" level="INFO">${follower_list} = [3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:14.422170" elapsed="0.446450"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.869066" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:14.869142" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:14.868799" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.869447" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.869233" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.869215" elapsed="0.000307"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.871736" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:14.869676" elapsed="0.002108"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:14.872174" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.871986" elapsed="0.000214"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:14.872247" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:14.419407" elapsed="0.452996"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:50:14.419145" elapsed="0.453305"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:50:13.489771" elapsed="1.382710"/>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:50:13.489335" elapsed="1.383202"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.877754" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:14.877363" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.878238" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:14.877940" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:14.878307" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:14.878460" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:14.876988" elapsed="0.001496"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:14.878653" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.879289" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:14.878963" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.879754" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:14.879498" elapsed="0.000282"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.880159" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:14.879928" elapsed="0.000256"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.882902" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.882413" elapsed="0.000516"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:14.882974" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:14.883122" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:14.882046" elapsed="0.001101"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.940862" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.940450" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.941686" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.941406" elapsed="0.000358">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:14.941860" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:14.941064" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.942431" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:14.942051" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.942777" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:14.942991" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:14.942635" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.943428" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.943179" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.944476" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:14.944224" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.944966" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:14.944699" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.945320" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.945527" 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-04-10T00:50:14.945722" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:14.945182" elapsed="0.000597"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.945043" elapsed="0.000767"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:14.945856" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:14.946025" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:14.943897" elapsed="0.002153"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.943585" elapsed="0.002497"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.946252" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.946106" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.943561" elapsed="0.002767"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.946957" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:14.946471" elapsed="0.000519"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:14.947039" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:14.939808" elapsed="0.007358"/>
</kw>
<msg time="2026-04-10T00:50:14.947220" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:14.927184" elapsed="0.020088"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.961539" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.974030" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.988651" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.989026" 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-04-10T00:50:14.989261" 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-04-10T00:50:14.989799" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.989603" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:14.989579" elapsed="0.000321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.990086" 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-04-10T00:50:14.990502" 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-04-10T00:50:14.990737" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:14.989516" elapsed="0.001289"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.989369" elapsed="0.001471"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.991035" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:14.991134" elapsed="0.000024"/>
</return>
<msg time="2026-04-10T00:50:14.991645" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:14.922840" elapsed="0.068857"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:14.993984" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.993626" elapsed="0.000448">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:14.994190" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:14.993107" elapsed="0.001116"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:14.994671" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:14.994317" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.995385" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:14.995017" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.994777" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.994293" elapsed="0.001233"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:14.998695" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:14.995745" elapsed="0.002985"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:14.998797" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:50:14.999192" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:14.992498" elapsed="0.006738"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:15.001514" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:15.001159" elapsed="0.000461">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:15.001736" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:15.000707" elapsed="0.001061"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:15.002040" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:50:15.001864" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:15.001839" elapsed="0.000306"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:15.002425" 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-04-10T00:50:15.002669" elapsed="0.000028"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:15.002754" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:50:15.005865" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:15.000049" elapsed="0.005861"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.008367" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:15.008007" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.008962" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:15.008652" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:15.020256" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:15.021030" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:15.021393" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:15.011877" elapsed="0.009553"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:15.009116" elapsed="0.012385"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:15.021840" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:15.021564" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:15.009088" elapsed="0.012866"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.027297" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:15.023400" elapsed="0.004418"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:15.023090" elapsed="0.004776"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:15.023064" elapsed="0.004835"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.031213" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:15.028287" elapsed="0.002974"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:15.027981" elapsed="0.003316"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:15.027954" elapsed="0.003368"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.031978" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:15.031568" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:15.032322" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:15.032078" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.032900" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:15.032588" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:15.032404" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:15.032060" elapsed="0.000930"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.033516" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:15.033154" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:15.033870" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:15.033632" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.034418" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:15.034121" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:15.033953" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:15.033614" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:15.034675" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:15.035479" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:15.035190" elapsed="0.000347"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:15.035715" elapsed="0.002402"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:15.022483" elapsed="0.015704"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:15.038369" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:15.038259" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:15.038240" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:15.047212" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:15.038605" elapsed="0.008638"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:15.047297" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:50:15.047694" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:15.006683" elapsed="0.041049"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:15.047826" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:50:15.048167" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:14.898306" elapsed="0.149903"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:15.049186" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:15.048405" elapsed="0.000953"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:15.048386" elapsed="0.001012"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:15.049487" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:14.887522" elapsed="0.162178"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:14.883214" elapsed="0.166533"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:14.883196" elapsed="0.166575"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:50:15.050491" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:15.050365" elapsed="0.000254"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:15.050685" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:15.050646" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:15.050348" elapsed="0.000450"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:15.050949" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:15.051071" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:15.050066" elapsed="0.001030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.051709" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:15.051265" elapsed="0.000471"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.052453" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:15.051893" elapsed="0.000588"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.059600" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:15.058878" elapsed="0.000886"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.060751" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:15.060021" 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-04-10T00:50:15.068877" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:15.068940" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:15 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:15 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":null,"LastIndex":40024,"RaftState":"Candidate","LastApplied":40024,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:49:55.617","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"185.1 μs","Voting":true,"CurrentTerm":4,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":3420},"timestamp":1775782215,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:15.069152" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:15.063363" elapsed="0.005825"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:15.061027" elapsed="0.008219"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:15.069645" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:15.069307" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:15.060995" elapsed="0.008811"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.074515" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":null,"LastIndex":40024,"RaftState":"Candidate","LastApplied":40024,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40024,"LastLeadershipChangeTime":"2026-04-10 00:49:55.617","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"185.1 μs","Voting":true,"CurrentTerm":4,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":40024,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":3420},"timestamp":1775782215,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:15.071887" elapsed="0.002745"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:15.071658" elapsed="0.003011"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:15.071611" elapsed="0.003103"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.077502" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:15.075084" elapsed="0.002576"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:15.074849" elapsed="0.002849"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:15.074804" elapsed="0.002938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.078473" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:15.078001" elapsed="0.000524"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:15.078943" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:15.078695" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.079814" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:15.079334" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:15.079095" elapsed="0.000808"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:15.078649" elapsed="0.001310"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.080973" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:15.080331" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:15.081631" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:15.081267" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.082494" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:15.082010" elapsed="0.000522"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:15.081774" elapsed="0.000835"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:15.081201" elapsed="0.001467"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:15.083015" elapsed="0.000720"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:15.084423" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:15.084071" elapsed="0.000403"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:15.084745" elapsed="0.002567"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:15.070625" elapsed="0.016800"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:15.087825" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:15.087598" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:15.087525" elapsed="0.000454"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:15.091817" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:15.088211" elapsed="0.003703"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:15.092005" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:15.092289" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:15.053486" elapsed="0.038834"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:15.092391" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:15.092561" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:15.052721" elapsed="0.039869"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.093972" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782215, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:15.093189" elapsed="0.000812"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:15.094089" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:15.094270" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782215, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:15.092817" elapsed="0.001481"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:15.094724" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 40024, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInit...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:15.094473" elapsed="0.000279"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:15.095152" level="INFO">${raft_property} = Candidate</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:15.094912" elapsed="0.000266"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:15.095226" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:15.095383" level="INFO">${raft_state} = Candidate</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:14.881421" elapsed="0.213992"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:15.095472" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:15.095675" level="INFO">${raft_state} = Candidate</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:14.880709" elapsed="0.214992"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:15.096005" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:15.095784" elapsed="0.000278"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:15.096296" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:15.096085" elapsed="0.000267"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:50:15.096926" level="FAIL">Unrecognized Raft state: Candidate</msg>
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:50:15.096600" elapsed="0.000399">Unrecognized Raft state: Candidate</status>
</kw>
<status status="FAIL" start="2026-04-10T00:50:15.096375" elapsed="0.000693">Unrecognized Raft state: Candidate</status>
</branch>
<status status="FAIL" start="2026-04-10T00:50:15.095765" elapsed="0.001334">Unrecognized Raft state: Candidate</status>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-10T00:50:14.880434" elapsed="0.216716">Unrecognized Raft state: Candidate</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:50:14.880230" elapsed="0.216980">Unrecognized Raft state: Candidate</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:15.097264" 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-04-10T00:50:14.876242" elapsed="0.221130">Unrecognized Raft state: Candidate</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:15.097636" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:15.097875" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:15.097730" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:15.097714" 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-04-10T00:50:15.098087" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:15.098259" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:15.098323" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.873607" elapsed="0.224824">Unrecognized Raft state: Candidate</status>
</kw>
<var name="${shard_name}">inventory</var>
<status status="FAIL" start="2026-04-10T00:50:14.873369" elapsed="0.225141">Unrecognized Raft state: Candidate</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-04-10T00:50:14.873234" elapsed="0.225408">Unrecognized Raft state: Candidate</status>
</for>
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-04-10T00:50:14.872838" elapsed="0.225900">Unrecognized Raft state: Candidate</status>
</kw>
<arg>${Inventory_Followers}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="FAIL" start="2026-04-10T00:50:13.461786" elapsed="1.637092">Unrecognized Raft state: Candidate</status>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.124780" elapsed="0.000315"/>
</kw>
<msg time="2026-04-10T00:50:17.125176" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:17.123867" elapsed="0.001387"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:50:17.123250" elapsed="0.002104"/>
</kw>
<msg time="2026-04-10T00:50:17.125413" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:17.114255" elapsed="0.011212"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:50:17.113826" elapsed="0.011760"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.126132" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.125843" elapsed="0.000339"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.132104" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:17.131672" elapsed="0.000459"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.132647" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:17.132297" elapsed="0.000381"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:17.132730" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:17.132896" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:17.131209" elapsed="0.001712"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:17.133079" elapsed="0.000183"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.133821" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:17.133450" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.134287" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:17.134037" elapsed="0.000277"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.134765" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:17.134468" elapsed="0.000329"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.138207" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.137640" elapsed="0.000600"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:17.138295" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:17.138471" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:17.137175" elapsed="0.001326"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.197581" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.197162" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.198410" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:17.198129" elapsed="0.000358">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:17.198773" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:17.197790" elapsed="0.001010"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.199370" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:17.198973" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.199736" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:17.199893" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:17.199588" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.200331" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.200079" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.201469" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.201209" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.201970" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.201698" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.202520" 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-04-10T00:50:17.202754" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.202935" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:17.202202" elapsed="0.000791"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.202052" elapsed="0.000973"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:17.203074" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:17.203244" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:17.200866" elapsed="0.002403"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.200458" elapsed="0.002844"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.203478" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.203327" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.200434" elapsed="0.003139"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.204163" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.203721" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.204240" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:17.196500" elapsed="0.007866"/>
</kw>
<msg time="2026-04-10T00:50:17.204419" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:17.183784" elapsed="0.020686"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.216735" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.229193" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.241605" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.241802" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.241978" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.242352" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.242204" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:17.242188" 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-04-10T00:50:17.242591" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.242763" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.242932" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:17.242158" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.242055" elapsed="0.000957"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.243165" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.243242" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:17.243516" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:17.179126" elapsed="0.064448"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.245263" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:17.245017" elapsed="0.000310">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:17.245418" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:17.244639" elapsed="0.000803"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.245776" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.245513" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.246324" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.246034" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.245857" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.245495" elapsed="0.000912"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.248759" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:17.246572" elapsed="0.002214"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:17.248837" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:17.249137" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:17.244187" elapsed="0.004985"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.250805" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:17.250562" elapsed="0.000306">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:17.250999" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:17.250208" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:17.251232" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:17.251096" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.251078" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.251462" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.251650" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.251718" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:17.254124" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:17.249772" elapsed="0.004390"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.256031" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.255765" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.256475" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.256235" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:17.265710" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:17.266140" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:17.266349" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:17.258738" elapsed="0.007638"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.256629" elapsed="0.009791"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.266627" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.266447" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.256609" elapsed="0.010107"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.270473" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.267744" elapsed="0.003064"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.267505" elapsed="0.003339"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.267486" elapsed="0.003383"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.273529" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.271154" elapsed="0.002437"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.270926" elapsed="0.002700"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.270909" elapsed="0.002742"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.274214" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.273828" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.274567" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.274312" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.275125" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.274816" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.274651" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.274294" elapsed="0.000914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.275747" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.275369" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.276080" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.275845" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.276634" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.276322" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.276161" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.275827" elapsed="0.000925"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:17.276905" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:17.277718" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.277413" elapsed="0.000331"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.277898" elapsed="0.002505"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:17.267084" elapsed="0.013383"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.280659" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:17.280537" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.280519" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:17.289159" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:17.280898" elapsed="0.008291"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:17.289241" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:17.289587" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:17.254798" elapsed="0.034828"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.289717" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:50:17.290059" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:17.154792" elapsed="0.135309"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.291047" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.290293" elapsed="0.000915"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.290274" elapsed="0.000974"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.291336" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:17.142978" elapsed="0.148551"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.138610" elapsed="0.152981"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.138586" elapsed="0.153031"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.292327" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:17.292198" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:17.292583" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:17.292447" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.292180" elapsed="0.000570"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.292903" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:17.293023" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:17.291907" elapsed="0.001142"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.293651" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.293219" elapsed="0.000459"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.294403" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.293835" elapsed="0.000597"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.301486" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.300787" elapsed="0.000883"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.302661" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.301932" elapsed="0.000890"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:17.310940" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:17.311011" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:17 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastApplied":137,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.691","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"223.6 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":7926168},"timestamp":1775782217,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:17.311237" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:17.305392" elapsed="0.005882"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.302940" elapsed="0.008395"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.311751" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.311399" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.302908" elapsed="0.009005"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.316807" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":136,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Follower","LastApplied":137,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.691","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"223.6 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":7926168},"timestamp":1775782217,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.314091" elapsed="0.002781"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.313806" elapsed="0.003103"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.313759" elapsed="0.003197"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.319829" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.317336" elapsed="0.002540"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.317100" elapsed="0.002811"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.317049" elapsed="0.002906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.320705" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.320231" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.321179" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.320932" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.321780" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.321448" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.321279" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.320885" elapsed="0.000997"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.322589" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.322141" elapsed="0.000503"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.323045" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.322801" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.323629" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.323310" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.323144" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.322754" elapsed="0.000977"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:17.323983" elapsed="0.000423"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:17.325093" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.324700" elapsed="0.000443"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.325393" elapsed="0.002538"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:17.312761" elapsed="0.015283"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.328404" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:17.328178" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.328144" elapsed="0.000431"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:17.332244" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:17.328836" elapsed="0.003502"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:17.332428" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:50:17.332743" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:17.295440" elapsed="0.037380"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.332883" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:17.333041" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:17.294683" elapsed="0.038385"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.334424" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.333718" elapsed="0.000735"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:17.334502" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:17.334695" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:17.333304" elapsed="0.001417"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:17.335102" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 137, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.334879" elapsed="0.000251"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:17.335520" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.335285" elapsed="0.000276"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:17.335610" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:17.335767" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:17.136183" elapsed="0.199609"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:17.335850" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:17.335999" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:17.135298" elapsed="0.200725"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.336334" elapsed="0.000194"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.336109" elapsed="0.000472"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.336783" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.336606" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.337005" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.336862" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.336090" elapsed="0.000988"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:17.135089" elapsed="0.202014"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.339764" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.339261" elapsed="0.000531"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:17.339838" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:17.339989" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:17.338885" elapsed="0.001129"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.397744" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.397345" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.398557" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:17.398286" elapsed="0.000406">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:17.398789" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:17.397944" elapsed="0.000870"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.399372" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:17.398982" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.399726" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:17.399879" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:17.399582" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.400315" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.400066" 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-04-10T00:50:17.401371" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.401114" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.401865" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.401595" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.402222" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.402430" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.402623" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:17.402084" elapsed="0.000600"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.401944" elapsed="0.000770"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:17.402760" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:17.402924" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:17.400753" elapsed="0.002196"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.400435" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.403156" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.403007" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.400414" elapsed="0.002819"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.403829" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.403377" elapsed="0.000479"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.403906" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:17.396713" elapsed="0.007317"/>
</kw>
<msg time="2026-04-10T00:50:17.404088" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:17.384254" elapsed="0.019887"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.416814" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.429047" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.441428" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.441647" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.441827" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.442209" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.442058" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:17.442040" 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-04-10T00:50:17.442429" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.442614" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.442784" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:17.442009" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.441907" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.443010" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.443087" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:50:17.443380" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:17.379909" elapsed="0.063507"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.445161" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:17.444900" elapsed="0.000474">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:17.445466" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:17.444488" elapsed="0.001003"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.445831" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.445579" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.446377" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.446086" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.445911" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.445560" elapsed="0.000899"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.448951" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:17.446626" elapsed="0.002351"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:17.449030" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:17.449336" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:17.444042" elapsed="0.005329"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.451034" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:17.450792" elapsed="0.000306">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:17.451226" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:17.450415" elapsed="0.000837"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:17.451460" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:17.451324" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.451306" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.451715" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.451888" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.451954" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:17.455557" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:17.449977" elapsed="0.005619"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.457415" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.457151" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.457877" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.457634" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:17.474896" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:17.475323" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:17.475600" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:17.460051" elapsed="0.015578"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.457988" elapsed="0.017685"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.475859" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.475700" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.457969" elapsed="0.017976"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.481911" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.476991" elapsed="0.005661"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.476742" elapsed="0.005993"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.476723" elapsed="0.006066"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.486730" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.483416" elapsed="0.003361"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.482913" elapsed="0.003899"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.482876" elapsed="0.003960"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.487391" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.487006" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.487746" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.487489" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.488315" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.487995" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.487830" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.487471" elapsed="0.000929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.488959" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.488578" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.489290" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.489057" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.489847" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.489533" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.489372" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.489038" elapsed="0.000891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:17.490079" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:17.490898" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.490605" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.491080" elapsed="0.002398"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:17.476300" elapsed="0.017254"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.493732" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:17.493627" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.493608" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:17.502378" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:17.493945" elapsed="0.008464"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:17.502463" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:17.502805" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:17.456183" elapsed="0.046659"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.502933" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:50:17.503268" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:17.355525" elapsed="0.147785"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.504246" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.503499" elapsed="0.000909"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.503480" elapsed="0.000968"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.504537" elapsed="0.000047"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:17.344478" elapsed="0.160272"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.340082" elapsed="0.164712"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.340065" elapsed="0.164773"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.505566" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:17.505423" elapsed="0.000239"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:17.505808" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:17.505687" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.505405" elapsed="0.000537"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.506090" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:17.506209" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:17.505132" elapsed="0.001103"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.506824" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.506400" elapsed="0.000451"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.507590" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.507009" elapsed="0.000609"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.514993" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.514116" elapsed="0.001042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.516136" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.515421" elapsed="0.000877"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:17.524924" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:17.524984" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:17 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":137,"LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.689","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.009","active":true,"matchIndex":137,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":138},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-operational","nextIndex":137}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"483.6 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":7926168},"timestamp":1775782217,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:17.525273" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:17.518863" elapsed="0.006462"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.516418" elapsed="0.008992"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.525996" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.525500" elapsed="0.000695"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.516384" elapsed="0.009896"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.533271" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":136,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-inventory-operational","LastIndex":137,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":137,"LastLogIndex":137,"LastLeadershipChangeTime":"2026-04-10 00:49:55.689","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.009","active":true,"matchIndex":137,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":138},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-operational","nextIndex":137}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"483.6 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":137,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":7926168},"timestamp":1775782217,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.529476" elapsed="0.003859"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.529140" elapsed="0.004230"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.529070" elapsed="0.004345"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.536202" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.533803" elapsed="0.002445"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.533569" elapsed="0.002714"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.533508" elapsed="0.002820"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.537073" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.536607" elapsed="0.000519"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.537523" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.537280" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.538118" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.537806" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.537641" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.537233" elapsed="0.000991"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.538985" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.538479" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.539427" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.539186" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.540081" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.539775" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.539526" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.539140" elapsed="0.001044"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:17.540432" elapsed="0.000490"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:17.541522" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.541182" elapsed="0.000406"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.541837" elapsed="0.002462"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:17.527620" elapsed="0.016786"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.544815" elapsed="0.000073"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:17.544539" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.544506" elapsed="0.000483"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:17.548930" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:17.545221" elapsed="0.003804"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:17.549158" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:17.549442" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:17.508639" elapsed="0.040831"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.549527" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:50:17.549696" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:17.507834" elapsed="0.041889"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.551059" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.550329" elapsed="0.000762"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:17.551139" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:17.551320" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:17.549954" elapsed="0.001393"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:17.551756" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 137, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.551505" elapsed="0.000279"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:17.552183" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.551941" elapsed="0.000268"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:17.552256" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:17.552409" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:17.338264" elapsed="0.214170"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:17.552490" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:17.552667" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:17.337454" elapsed="0.215238"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.553014" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.552773" 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="PASS" start="2026-04-10T00:50:17.553303" elapsed="0.000189"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.553094" elapsed="0.000436"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.553720" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.553571" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.552754" elapsed="0.001040"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:17.337277" elapsed="0.216541"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:17.134854" elapsed="0.418996"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:17.553893" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:17.554099" level="INFO">${leader_list} = [3]</msg>
<msg time="2026-04-10T00:50:17.554146" level="INFO">${follower_list} = [1]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:17.130409" elapsed="0.423761"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.554629" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:17.554706" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:17.554346" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.555049" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.554797" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.554780" elapsed="0.000349"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.557440" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:17.555269" elapsed="0.002219"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:17.557859" level="INFO">${leader} = 3</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.557668" elapsed="0.000217"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:17.557932" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:17.127589" elapsed="0.430498"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:50:17.127096" elapsed="0.431037"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.562686" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:17.562294" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.563176" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:17.562873" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:17.563246" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:17.563400" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:17.561914" elapsed="0.001511"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:17.563596" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.564244" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:17.563910" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.564683" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:17.564428" elapsed="0.000281"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.565134" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:17.564892" elapsed="0.000268"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.567944" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.567452" elapsed="0.000520"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:17.568017" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:17.568170" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:17.566919" elapsed="0.001276"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.626291" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.625915" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.627086" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:17.626837" elapsed="0.000326">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:17.627256" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:17.626483" elapsed="0.000798"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.627848" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:17.627445" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.628175" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:17.628368" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:17.628038" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.628818" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.628567" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.629843" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.629586" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.630316" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.630050" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.630678" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.630884" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.631060" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:17.630526" elapsed="0.000592"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.630391" elapsed="0.000757"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:17.631190" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:17.631349" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:17.629246" elapsed="0.002129"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.628951" elapsed="0.002456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.631595" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.631432" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.628932" elapsed="0.002742"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.632255" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.631822" elapsed="0.000461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.632332" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:17.625285" elapsed="0.007172"/>
</kw>
<msg time="2026-04-10T00:50:17.632513" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:17.612517" elapsed="0.020063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.645235" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.657659" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.670143" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.670428" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.670624" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.671017" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.670868" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:17.670852" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.671239" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.671408" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.671594" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:17.670819" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.670709" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.671825" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.671903" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:50:17.672231" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:17.608083" elapsed="0.064186"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.674121" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:17.673817" elapsed="0.000377">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:17.674288" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:17.673411" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.674663" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.674387" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.675223" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.674926" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.674747" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.674368" elapsed="0.000939"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.677728" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:17.675459" elapsed="0.002297"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:17.677808" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:17.678120" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:17.672934" elapsed="0.005220"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.679898" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:17.679653" elapsed="0.000307">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:17.680053" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:17.679295" elapsed="0.000782"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:17.680283" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:17.680148" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.680130" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.680569" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.680745" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.680811" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:17.683077" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:17.678767" elapsed="0.004347"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.684981" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.684685" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.685427" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.685184" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:17.696659" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:17.697130" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:17.697349" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:17.687624" elapsed="0.009753"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.685536" elapsed="0.011889"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.697648" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.697455" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.685518" elapsed="0.012219"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.701607" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.698811" elapsed="0.003133"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.698582" elapsed="0.003399"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.698538" elapsed="0.003468"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.704815" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.702454" elapsed="0.002408"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.702066" elapsed="0.002830"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.702046" elapsed="0.002957"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.705630" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.705213" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.705966" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.705728" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.706512" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.706210" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.706047" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.705710" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.707135" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.706772" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.707464" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.707232" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.708016" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.707723" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.707559" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.707213" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:17.708255" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:17.709113" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.708782" elapsed="0.000357"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.709294" elapsed="0.002478"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:17.698115" elapsed="0.013723"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.712016" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:17.711908" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.711890" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:17.720445" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:17.712230" elapsed="0.008246"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:17.720531" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:50:17.720883" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:17.683741" elapsed="0.037180"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.721042" elapsed="0.000075"/>
</return>
<msg time="2026-04-10T00:50:17.721388" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:17.583571" elapsed="0.137859"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.722403" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.721651" elapsed="0.000948"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.721631" elapsed="0.001009"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.722733" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:17.572661" elapsed="0.150268"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.568262" elapsed="0.154713"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.568245" elapsed="0.154754"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.723753" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:17.723622" elapsed="0.000226"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:17.723996" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:17.723875" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.723604" elapsed="0.000529"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.724286" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:50:17.724406" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:17.723299" elapsed="0.001133"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.725126" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.724672" elapsed="0.000480"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.726031" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.725309" elapsed="0.000752"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.733095" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.732353" elapsed="0.000908"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.734225" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.733520" elapsed="0.000863"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:17.742727" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:17.742793" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:17 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Leader","LastApplied":43,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":43},{"timeSinceLastActivity":"00:00:00.375","active":true,"matchIndex":43,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":44}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"448.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":10171},"timestamp":1775782217,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:17.743014" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:17.736856" elapsed="0.006194"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.734503" elapsed="0.008605"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.743492" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.743172" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.734469" elapsed="0.009249"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.749750" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Leader","LastApplied":43,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":43},{"timeSinceLastActivity":"00:00:00.375","active":true,"matchIndex":43,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":44}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"448.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":10171},"timestamp":1775782217,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.745895" elapsed="0.003950"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.745665" elapsed="0.004233"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.745617" elapsed="0.004349"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.754271" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.750624" elapsed="0.003696"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.750170" elapsed="0.004186"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.750102" elapsed="0.004300"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.755149" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.754700" elapsed="0.000501"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.755613" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.755353" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.756188" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.755881" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.755715" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.755307" elapsed="0.000982"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.757020" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.756578" elapsed="0.000493"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.757460" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.757221" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.758045" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.757743" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.757575" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.757175" elapsed="0.000976"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:17.758400" elapsed="0.000443"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:17.759447" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.759105" elapsed="0.000392"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.759764" elapsed="0.002497"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:17.744556" elapsed="0.017814"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.762746" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:17.762504" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.762470" elapsed="0.000425"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:17.766651" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:17.763124" elapsed="0.003620"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:17.766887" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:50:17.767178" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:17.727116" elapsed="0.040089"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.767264" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:17.767411" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:17.726278" elapsed="0.041159"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.768793" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.768067" elapsed="0.000755"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:17.768871" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:17.769072" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:17.767690" elapsed="0.001409"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:17.769484" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 43, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.769257" elapsed="0.000255"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:17.769966" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.769731" elapsed="0.000261"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:17.770040" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:17.770193" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:17.566305" elapsed="0.203913"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:17.770276" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:17.770424" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:17.565595" elapsed="0.204855"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.770769" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.770533" elapsed="0.000295"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.771059" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.770851" elapsed="0.000438"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.771462" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.771314" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.770515" elapsed="0.001021"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:17.565410" elapsed="0.206167"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.774201" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.773730" elapsed="0.000499"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:17.774275" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:17.774423" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:17.773294" elapsed="0.001154"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.832130" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.831757" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.833025" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:17.832732" elapsed="0.000369">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:17.833196" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:17.832375" elapsed="0.000846"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.833786" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:17.833388" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.834114" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:17.834334" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:17.833975" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.834783" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.834519" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.835779" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.835507" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.836249" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.835985" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.836613" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.836821" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.837024" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:17.836461" elapsed="0.000624"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.836325" elapsed="0.000789"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:17.837157" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:17.837315" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:17.835186" elapsed="0.002154"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.834896" elapsed="0.002476"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.837556" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.837396" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.834877" elapsed="0.002759"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.838208" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.837780" elapsed="0.000456"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.838285" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:17.831122" elapsed="0.007287"/>
</kw>
<msg time="2026-04-10T00:50:17.838463" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:17.818567" elapsed="0.019947"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.851055" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.863472" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.875683" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.875878" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.876055" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.876420" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.876275" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:17.876261" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.876655" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.876827" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.876995" elapsed="0.000051"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:17.876231" elapsed="0.000850"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.876132" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.877255" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.877332" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:17.877619" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:17.814194" elapsed="0.063461"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.879280" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:17.879039" elapsed="0.000305">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:17.879434" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:17.878699" elapsed="0.000760"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.879789" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.879529" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.880326" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.880037" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.879870" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.879511" elapsed="0.000897"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.882741" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:17.880577" elapsed="0.002190"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:17.882817" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:17.883117" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:17.878250" elapsed="0.004901"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:17.884855" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:17.884571" elapsed="0.000348">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:17.885012" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:17.884214" elapsed="0.000858"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:17.885286" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:17.885151" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.885132" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.885519" elapsed="0.000038"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.885712" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.885779" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:17.888028" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:17.883782" elapsed="0.004282"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.889888" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.889633" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.890338" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.890094" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:17.906650" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:17.907295" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:17.907614" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:17.892519" elapsed="0.015137"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.890449" elapsed="0.017271"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.907989" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.907759" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.890431" elapsed="0.017686"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.913759" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.909678" elapsed="0.004586"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.909324" elapsed="0.004993"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.909296" elapsed="0.005057"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.918221" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.914795" elapsed="0.003473"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.914439" elapsed="0.003863"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.914413" elapsed="0.003914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.918889" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.918494" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.919226" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.918988" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.919795" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.919478" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.919310" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.918970" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.920396" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.920038" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.920743" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.920492" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.921304" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.920986" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.920825" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.920474" elapsed="0.000912"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:17.921536" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:17.922348" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.922061" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.922531" elapsed="0.003615"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:17.908660" elapsed="0.017550"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.926386" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:17.926281" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.926262" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:17.934848" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:17.926617" elapsed="0.008262"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:17.934933" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:17.935258" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:17.888673" elapsed="0.046623"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.935386" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:50:17.935755" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:17.789892" elapsed="0.145905"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.936879" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.935990" elapsed="0.001076"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.935971" elapsed="0.001144"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.937205" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:17.778790" elapsed="0.158609"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.774516" elapsed="0.162928"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.774499" elapsed="0.162969"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.938189" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:17.938061" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:17.938430" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:17.938310" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.938043" elapsed="0.000539"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.938731" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:50:17.938850" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:17.937771" elapsed="0.001104"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.939448" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.939044" elapsed="0.000430"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.940212" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.939646" elapsed="0.000594"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.947487" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.946797" elapsed="0.000878"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.948673" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.947934" elapsed="0.000900"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:17.956919" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:17.956978" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:17 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":43,"LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.054","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"206.3 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":10171},"timestamp":1775782217,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:17.957236" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:17.951317" elapsed="0.005956"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.948952" elapsed="0.008379"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.957731" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.957393" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.948919" elapsed="0.008973"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.964471" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":42,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":42,"Leader":"member-1-shard-topology-operational","LastIndex":43,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":43,"LastLogIndex":43,"LastLeadershipChangeTime":"2026-04-10 00:49:56.054","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"206.3 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":43,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":10171},"timestamp":1775782217,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.960871" elapsed="0.003706"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.960412" elapsed="0.004215"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.960347" elapsed="0.004343"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.967956" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:17.965238" elapsed="0.002764"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.964881" elapsed="0.003156"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.964818" elapsed="0.003263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.968786" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.968339" elapsed="0.000498"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.969255" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.968986" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.969845" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.969521" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.969355" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.968941" elapsed="0.001007"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.970656" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.970202" elapsed="0.000505"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.971095" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.970855" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.971679" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.971361" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.971196" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.970810" elapsed="0.000971"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:17.972025" elapsed="0.000421"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:17.973048" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.972719" elapsed="0.000412"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.973379" elapsed="0.002478"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:17.958963" elapsed="0.017001"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:17.976310" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:17.976091" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.976059" elapsed="0.000398"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:17.980050" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:17.976718" elapsed="0.003424"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:17.980227" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:17.980503" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:17.941288" elapsed="0.039243"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:17.980638" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:17.980791" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:17.940459" elapsed="0.040358"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.982145" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:17.981436" elapsed="0.000738"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:17.982222" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:17.982407" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:17.981038" elapsed="0.001395"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:17.982831" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 43, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.982606" elapsed="0.000252"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:17.983249" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.983016" elapsed="0.000259"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:17.983321" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:17.983471" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:17.772655" elapsed="0.210841"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:17.983614" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:17.983764" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:17.771917" elapsed="0.211872"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.984086" elapsed="0.000189"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:17.983868" elapsed="0.000444"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.984484" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.984336" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.984723" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.984578" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.983851" elapsed="0.000946"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:17.771744" elapsed="0.213077"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:17.565209" elapsed="0.419642"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:17.984891" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:17.985111" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:50:17.985158" level="INFO">${follower_list} = [3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:17.561185" elapsed="0.423997"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.985640" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:17.985718" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:17.985359" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:17.986026" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:17.985811" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:17.985793" elapsed="0.000310"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.988362" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:17.986241" elapsed="0.002169"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:17.988835" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:17.988644" elapsed="0.000218"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:17.988911" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:17.558454" elapsed="0.430654"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:50:17.558222" elapsed="0.430935"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.994782" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:17.994315" elapsed="0.000495"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.995283" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:17.994975" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:17.995357" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:17.995530" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:17.993911" elapsed="0.001660"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:17.995731" elapsed="0.000167"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.996608" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:17.996060" elapsed="0.000574"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.997032" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:17.996794" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:17.997485" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:17.997249" elapsed="0.000262"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.000301" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:17.999806" elapsed="0.000524"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:18.000378" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:50:18.000535" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:17.999339" elapsed="0.001239"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.060127" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.059719" elapsed="0.000442"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.061022" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:18.060695" elapsed="0.000408">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:18.061228" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:18.060338" elapsed="0.000916"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.061834" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:18.061424" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.062166" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:18.062333" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:18.062025" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.062881" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.062623" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.063915" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.063658" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.064399" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.064130" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.064775" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.064985" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.065189" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:18.064634" elapsed="0.000614"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.064479" elapsed="0.000800"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:18.065327" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:18.065495" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:18.063316" elapsed="0.002204"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.063006" elapsed="0.002562"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.065745" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.065595" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.062983" elapsed="0.002845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.066418" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.065974" elapsed="0.000472"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.066495" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:18.059081" elapsed="0.007558"/>
</kw>
<msg time="2026-04-10T00:50:18.066694" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:18.046352" elapsed="0.020394"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.079357" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.091731" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.104159" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.104357" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.104535" elapsed="0.000034"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.104958" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.104810" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:18.104795" 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-04-10T00:50:18.105199" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.105369" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.105535" elapsed="0.000036"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:18.104765" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.104662" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.105779" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.105855" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:18.106126" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:18.041766" elapsed="0.064397"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.107843" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:18.107599" elapsed="0.000308">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:18.107998" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:18.107239" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.108345" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.108094" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.108910" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.108620" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.108425" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.108075" elapsed="0.000916"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.111326" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:18.109174" elapsed="0.002179"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:18.111404" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:18.111745" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:18.106799" elapsed="0.004981"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.113418" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:18.113176" elapsed="0.000304">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:18.113589" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:18.112814" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:18.113820" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:18.113687" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.113669" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.114058" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.114229" elapsed="0.000032"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.114306" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:18.116577" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:18.112360" elapsed="0.004255"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.118429" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.118176" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.118887" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.118644" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:18.131025" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:18.131628" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:18.131909" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:18.121093" elapsed="0.010854"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.118996" elapsed="0.013012"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.132262" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.132046" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.118978" elapsed="0.013404"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.137678" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.133840" elapsed="0.004300"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.133510" elapsed="0.004680"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.133483" elapsed="0.004742"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.141984" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.138649" elapsed="0.003400"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.138304" elapsed="0.003794"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.138281" elapsed="0.003845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.142688" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.142291" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.143021" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.142785" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.143583" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.143264" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.143103" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.142767" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.144191" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.143831" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.144529" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.144297" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.145093" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.144794" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.144631" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.144280" elapsed="0.000922"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:18.145352" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:18.146165" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.145880" elapsed="0.000310"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.146346" elapsed="0.002609"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:18.132893" elapsed="0.016126"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.149248" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:18.149091" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.149071" elapsed="0.000246"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:18.157742" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:18.149466" elapsed="0.008307"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:18.157827" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:18.158155" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:18.117237" elapsed="0.040956"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.158285" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:50:18.158651" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:18.016290" elapsed="0.142404"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.159640" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.158887" elapsed="0.000914"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.158868" elapsed="0.000973"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.159932" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:18.005068" elapsed="0.155057"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.000655" elapsed="0.159516"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.000636" elapsed="0.159559"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.160919" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:18.160790" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:18.161185" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:18.161039" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.160772" elapsed="0.000550"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.161477" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:18.161615" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:18.160484" elapsed="0.001157"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.162218" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.161812" elapsed="0.000433"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.162975" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.162403" elapsed="0.000601"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.170136" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.169430" elapsed="0.000870"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.171260" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.170575" elapsed="0.000851"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:18.180760" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:18.180819" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":23,"SnapshotIndex":106,"InMemoryJournalLogSize":80,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-default-operational","LastIndex":186,"RaftState":"Leader","LastApplied":185,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":186,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.266","active":true,"matchIndex":185,"voting":true,"id":"member-3-shard-default-operational","nextIndex":186},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-default-operational","nextIndex":107}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"552.2 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":185,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":17,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":95867},"timestamp":1775782218,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:18.181029" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:18.173962" elapsed="0.007103"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.171615" elapsed="0.009511"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.181537" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.181223" elapsed="0.000433"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.171519" elapsed="0.010234"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.188126" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":23,"SnapshotIndex":106,"InMemoryJournalLogSize":80,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-default-operational","LastIndex":186,"RaftState":"Leader","LastApplied":185,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":186,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.266","active":true,"matchIndex":185,"voting":true,"id":"member-3-shard-default-operational","nextIndex":186},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-default-operational","nextIndex":107}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"552.2 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":185,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":17,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":95867},"timestamp":1775782218,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.184539" elapsed="0.003675"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.184225" elapsed="0.004038"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.184161" elapsed="0.004165"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.191679" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.188968" elapsed="0.002756"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.188517" elapsed="0.003242"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.188454" elapsed="0.003358"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.192505" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.192067" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.192982" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.192741" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.193594" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.193267" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.193083" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.192695" elapsed="0.001003"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.194364" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.193948" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.194819" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.194579" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.195378" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.195080" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.194918" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.194518" elapsed="0.000958"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:18.195735" elapsed="0.000417"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:18.196761" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.196407" elapsed="0.000404"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.197057" elapsed="0.002435"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:18.182763" elapsed="0.016854"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.199973" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:18.199751" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.199718" elapsed="0.000405"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:18.203846" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:18.200354" elapsed="0.003586"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:18.204070" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:18.204351" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:18.164014" elapsed="0.040365"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.204438" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:18.204660" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:18.163218" elapsed="0.041468"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.206034" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578221...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.205308" elapsed="0.000754"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:18.206111" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:18.206292" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578221...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:18.204914" elapsed="0.001405"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:18.206726" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 185, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.206478" elapsed="0.000275"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:18.207145" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.206911" elapsed="0.000259"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:18.207217" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:18.207370" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:17.998737" elapsed="0.208657"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:18.207452" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:18.207617" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:17.997991" elapsed="0.209652"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.207942" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.207724" elapsed="0.000276"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.208231" elapsed="0.000188"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.208024" elapsed="0.000432"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.208685" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.208480" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.207707" elapsed="0.001057"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:17.997813" elapsed="0.210975"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.211424" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.210958" elapsed="0.000493"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:18.211497" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:18.211666" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:18.210589" elapsed="0.001103"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.269202" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.268826" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.270100" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:18.269843" elapsed="0.000332">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:18.270435" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:18.269483" elapsed="0.000977"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.271033" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:18.270650" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.271362" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:18.271556" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:18.271223" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.271988" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.271744" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.272994" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.272733" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.273489" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.273199" 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-04-10T00:50:18.273855" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.274060" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.274238" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:18.273720" elapsed="0.000576"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.273580" elapsed="0.000746"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:18.274370" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:18.274528" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:18.272396" elapsed="0.002173"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.272103" elapsed="0.002499"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.274775" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.274627" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.272083" elapsed="0.002770"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.275427" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.274996" elapsed="0.000459"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.275502" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:18.268203" elapsed="0.007441"/>
</kw>
<msg time="2026-04-10T00:50:18.275698" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:18.255692" elapsed="0.020058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.288302" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.300646" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.312922" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.313118" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.313306" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.313695" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.313535" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:18.313521" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.313914" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.314081" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.314244" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:18.313491" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.313385" elapsed="0.000937"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.314617" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.314698" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:18.314966" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:18.251153" elapsed="0.063848"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.316673" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:18.316407" elapsed="0.000331">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:18.316828" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:18.316068" elapsed="0.000785"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.317167" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.316922" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.317765" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.317453" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.317281" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.316904" elapsed="0.000943"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.320148" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:18.317996" elapsed="0.002179"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:18.320224" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:18.320525" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:18.315634" elapsed="0.004975"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.322262" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:18.322024" elapsed="0.000300">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:18.322416" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:18.321682" elapsed="0.000758"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:18.322660" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:18.322510" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.322491" elapsed="0.000253"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.322891" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.323061" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.323126" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:18.325349" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:18.321221" elapsed="0.004165"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.327160" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.326906" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.327616" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.327361" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:18.344425" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:18.345028" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:18.345349" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:18.329795" elapsed="0.015592"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.327725" elapsed="0.017722"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.345720" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.345484" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.327707" elapsed="0.018134"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.351023" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.347231" elapsed="0.004285"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.346925" elapsed="0.004662"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.346899" elapsed="0.004724"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.354989" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.352018" elapsed="0.003018"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.351704" elapsed="0.003367"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.351680" elapsed="0.003415"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.355657" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.355261" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.355992" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.355755" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.356535" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.356235" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.356073" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.355737" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.357169" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.356802" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.357516" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.357280" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.358199" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.357899" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.357615" elapsed="0.000646"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.357246" elapsed="0.001036"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:18.358432" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:18.359245" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.358966" elapsed="0.000305"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.359427" elapsed="0.002517"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:18.346323" elapsed="0.015685"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.362181" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:18.362078" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.362059" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:18.370751" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:18.362396" elapsed="0.008385"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:18.370833" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:18.371145" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:18.325978" elapsed="0.045203"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.371271" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:50:18.371630" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:18.226759" elapsed="0.144914"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.372596" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.371860" elapsed="0.000894"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.371841" elapsed="0.000952"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.372881" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:18.216027" elapsed="0.157049"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.211760" elapsed="0.161360"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.211742" elapsed="0.161402"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.373888" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:18.373761" elapsed="0.000219"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:50:18.374124" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:18.374005" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.373744" elapsed="0.000512"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.374406" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:18.374524" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:18.373454" elapsed="0.001111"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.375140" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.374735" elapsed="0.000432"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.375902" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.375323" elapsed="0.000607"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.383011" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.382305" elapsed="0.000869"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.384142" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.383433" elapsed="0.000871"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:18.392392" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:18.392450" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":106,"InMemoryJournalLogSize":79,"ReplicatedToAllIndex":106,"Leader":"member-1-shard-default-operational","LastIndex":185,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":185,"LastLogIndex":185,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"204.4 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":185,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":95826},"timestamp":1775782218,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:18.392776" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:18.386839" elapsed="0.005974"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.384424" elapsed="0.008445"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.393249" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.392932" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.384389" elapsed="0.009056"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.401470" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":106,"InMemoryJournalLogSize":79,"ReplicatedToAllIndex":106,"Leader":"member-1-shard-default-operational","LastIndex":185,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":185,"LastLogIndex":185,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"204.4 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":185,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":95826},"timestamp":1775782218,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.396256" elapsed="0.005323"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.395888" elapsed="0.005743"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.395824" elapsed="0.005871"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.404669" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.402183" elapsed="0.002536"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.401888" elapsed="0.002866"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.401825" elapsed="0.002974"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.405522" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.405061" elapsed="0.000528"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.405985" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.405741" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.406576" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.406251" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.406086" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.405695" elapsed="0.000985"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.407349" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.406931" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.407814" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.407571" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.408381" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.408078" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.407914" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.407506" elapsed="0.000978"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:18.408760" elapsed="0.000424"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:18.409839" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.409484" elapsed="0.000405"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.410135" elapsed="0.002460"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:18.394461" elapsed="0.018242"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.413053" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:18.412834" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.412801" elapsed="0.000402"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:18.416838" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:18.413449" elapsed="0.003483"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:18.417022" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:18.417342" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:18.376929" elapsed="0.040441"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.417480" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:18.417688" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:18.376144" elapsed="0.041571"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.419024" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578221...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.418313" elapsed="0.000740"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:18.419104" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:18.419314" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578221...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:18.417942" elapsed="0.001401"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:18.419745" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 185, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.419502" elapsed="0.000270"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:18.420178" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.419936" elapsed="0.000268"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:18.420251" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:18.420401" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:18.209968" elapsed="0.210458"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:18.420482" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:18.420644" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:18.209225" elapsed="0.211444"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.420964" elapsed="0.000199"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.420748" elapsed="0.000454"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.421392" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.421226" elapsed="0.000221"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.421664" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.421470" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.420730" elapsed="0.001009"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:18.208952" elapsed="0.212811"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:17.997594" elapsed="0.424198"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:18.421832" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:18.422031" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:50:18.422076" level="INFO">${follower_list} = [3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:17.992987" elapsed="0.429112"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.422536" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:18.422706" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:18.422271" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.423014" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.422801" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.422783" elapsed="0.000308"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.425195" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:18.423228" elapsed="0.002014"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:18.425685" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.425478" elapsed="0.000233"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:18.425758" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:17.989482" elapsed="0.436429"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:50:17.989249" elapsed="0.436708"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:50:17.126950" elapsed="1.299037"/>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:50:17.126470" elapsed="1.299571"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.431382" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:18.430997" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.431885" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:18.431584" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:18.431955" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:18.432111" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:18.430620" elapsed="0.001515"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:18.432289" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.432951" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:18.432618" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.433407" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:18.433137" elapsed="0.000296"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.433840" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:18.433601" elapsed="0.000264"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.436455" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.435995" elapsed="0.000487"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:18.436527" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:50:18.436700" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:18.435629" elapsed="0.001095"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.494734" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.494188" elapsed="0.000574"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.495515" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:18.495267" elapsed="0.000337">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:18.495698" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:18.494927" elapsed="0.000796"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.496277" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:18.495889" elapsed="0.000416"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.496623" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:18.496816" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:18.496468" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.497255" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.497005" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.498297" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.498039" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.498799" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.498504" 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-04-10T00:50:18.499151" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.499359" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.499538" elapsed="0.000042"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:18.499013" elapsed="0.000605"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.498876" elapsed="0.000773"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:18.499693" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:18.499857" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:18.497710" elapsed="0.002172"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.497392" elapsed="0.002523"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.500092" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.499940" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.497371" elapsed="0.002800"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.500773" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.500318" elapsed="0.000483"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.500850" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:18.493571" elapsed="0.007405"/>
</kw>
<msg time="2026-04-10T00:50:18.501032" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:18.480897" elapsed="0.020187"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.513765" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.526184" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.538694" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.538946" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.539128" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.539513" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.539366" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:18.539351" 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-04-10T00:50:18.539754" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.539923" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.540090" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:18.539321" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.539213" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.540326" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.540401" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:18.540704" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:18.476533" elapsed="0.064208"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.542427" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:18.542179" elapsed="0.000313">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:18.542602" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:18.541836" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.542943" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.542698" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.543485" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.543194" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.543023" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.542680" elapsed="0.000903"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.545935" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:18.543735" elapsed="0.002227"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:18.546013" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:18.546321" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:18.541345" elapsed="0.005011"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.547982" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:18.547742" elapsed="0.000303">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:18.548138" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:18.547386" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:18.548368" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:18.548234" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.548215" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.548651" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.548828" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.548894" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:18.551190" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:18.546955" elapsed="0.004271"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.553054" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.552796" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.553536" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.553256" elapsed="0.000341"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:18.564910" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:18.565336" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:18.565597" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:18.555729" elapsed="0.009897"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.553665" elapsed="0.012005"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.565854" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.565697" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.553647" elapsed="0.012295"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.574248" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.568064" elapsed="0.006538"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.567540" elapsed="0.007098"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.567499" elapsed="0.007165"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.577315" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.574952" elapsed="0.002410"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.574722" elapsed="0.002691"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.574704" elapsed="0.002733"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.578002" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.577621" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.578338" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.578101" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.578901" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.578598" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.578419" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.578082" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.579508" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.579147" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.579858" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.579622" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.580395" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.580099" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.579938" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.579604" elapsed="0.000873"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:18.580644" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:18.581477" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.581156" elapsed="0.000348"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.581676" elapsed="0.002464"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:18.566590" elapsed="0.017614"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.584379" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:18.584273" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.584255" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:18.592758" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:18.584607" elapsed="0.008182"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:18.592842" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:18.593172" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:18.551821" elapsed="0.041389"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.593302" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:50:18.593689" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:18.451856" elapsed="0.141876"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.594685" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.593927" elapsed="0.000920"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.593908" elapsed="0.000980"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.594978" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:18.440971" elapsed="0.154204"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.436793" elapsed="0.158428"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.436775" elapsed="0.158471"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:50:18.595968" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:18.595841" elapsed="0.000238"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.596148" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:18.596108" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.595822" elapsed="0.000440"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.596411" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:18.596532" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:18.595532" elapsed="0.001042"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.597156" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.596747" elapsed="0.000437"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.597953" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.597341" elapsed="0.000641"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.605001" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.604294" elapsed="0.000873"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.606150" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.605449" elapsed="0.000861"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:18.615015" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:18.615076" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-inventory-config","LastIndex":40025,"RaftState":"Leader","LastApplied":40025,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40025,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":40024},{"timeSinceLastActivity":"00:00:00.226","active":true,"matchIndex":40025,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":40026}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"370.8 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":40025,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":3457},"timestamp":1775782218,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:18.615292" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:18.608820" elapsed="0.006509"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.606429" elapsed="0.008958"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.615781" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.615448" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.606396" elapsed="0.009580"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.621747" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-inventory-config","LastIndex":40025,"RaftState":"Leader","LastApplied":40025,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40025,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":40024},{"timeSinceLastActivity":"00:00:00.226","active":true,"matchIndex":40025,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":40026}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"370.8 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":40025,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":3457},"timestamp":1775782218,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.618126" elapsed="0.003708"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.617889" elapsed="0.003995"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.617843" elapsed="0.004103"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.625939" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.622453" elapsed="0.003552"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.622135" elapsed="0.003919"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.622073" elapsed="0.004041"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.626843" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.626375" elapsed="0.000533"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.627314" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.627068" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.627896" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.627591" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.627413" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.627021" elapsed="0.000995"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.628858" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.628338" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.629356" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.629076" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.629997" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.629689" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.629492" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.629027" elapsed="0.001071"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:18.630476" elapsed="0.000440"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:18.631513" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.631177" elapsed="0.000403"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.631831" elapsed="0.002549"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:18.616830" elapsed="0.017657"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.634872" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:18.634648" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.634603" elapsed="0.000417"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:18.638747" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:18.635252" elapsed="0.003587"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:18.638960" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:50:18.639245" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:18.598997" elapsed="0.040275"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.639331" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:18.639480" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:18.598199" elapsed="0.041306"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.640878" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782218, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.640111" elapsed="0.000796"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:18.640954" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:18.641139" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782218, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:18.639746" elapsed="0.001419"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:18.641601" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 40025, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.641321" elapsed="0.000309"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:18.642036" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.641789" elapsed="0.000273"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:18.642109" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:18.642261" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:18.435012" elapsed="0.207274"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:18.642344" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:50:18.642492" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:18.434281" elapsed="0.208236"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.642835" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.642615" elapsed="0.000277"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.643120" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.642915" elapsed="0.000434"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.643519" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.643372" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.642598" elapsed="0.001012"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:18.434113" elapsed="0.209521"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.646235" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.645770" elapsed="0.000492"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:18.646308" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:18.646453" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:18.645354" elapsed="0.001124"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.703903" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.703513" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.704755" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:18.704484" elapsed="0.000345">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:18.704922" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:18.704145" elapsed="0.000801"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.705530" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:18.705113" elapsed="0.000458"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.705874" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:18.706024" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:18.705737" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.706449" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.706206" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.707451" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.707198" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.707939" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.707672" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.708289" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.708493" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.708682" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:18.708154" elapsed="0.000586"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.708015" elapsed="0.000755"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:18.708814" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:18.708970" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:18.706873" elapsed="0.002122"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.706578" elapsed="0.002449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.709199" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.709051" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.706556" elapsed="0.002718"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.709889" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.709416" elapsed="0.000500"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.709965" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:18.702903" elapsed="0.007185"/>
</kw>
<msg time="2026-04-10T00:50:18.710146" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:18.690396" elapsed="0.019801"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.722582" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.734949" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.747343" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.747538" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.747727" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.748091" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.747947" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:18.747932" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.748309" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.748475" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.748661" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:18.747904" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.747804" elapsed="0.000936"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.748886" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.748962" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:18.749230" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:18.686083" elapsed="0.063183"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.750966" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:18.750721" elapsed="0.000310">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:18.751122" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:18.750362" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.751457" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.751215" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.752018" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.751728" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.751560" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.751197" elapsed="0.000903"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.754412" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:18.752258" elapsed="0.002180"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:18.754487" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:18.754825" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:18.749929" elapsed="0.004931"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.756517" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:18.756275" elapsed="0.000320">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:18.756688" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:18.755939" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:18.756915" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:18.756782" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.756764" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.757144" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.757313" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.757378" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:18.759629" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:18.755475" elapsed="0.004191"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.761451" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.761196" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.761955" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.761707" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:18.779463" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:18.780419" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:18.781003" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:18.764135" elapsed="0.016930"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.762065" elapsed="0.019096"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.781630" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.781220" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.762047" elapsed="0.019779"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.790197" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.784117" elapsed="0.006440"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.783624" elapsed="0.006970"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.783543" elapsed="0.007075"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.793240" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.790900" elapsed="0.002387"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.790675" elapsed="0.002646"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.790658" elapsed="0.002687"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.793927" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.793529" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.794258" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.794024" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.794818" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.794501" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.794340" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.794006" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.795425" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.795058" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.795769" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.795521" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.796302" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.796009" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.795850" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.795503" elapsed="0.000881"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:18.796538" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:18.797339" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.797061" elapsed="0.000303"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.797539" elapsed="0.002470"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:18.782644" elapsed="0.017429"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.800245" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:18.800141" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.800123" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:18.808734" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:18.800456" elapsed="0.008308"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:18.808815" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:18.809133" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:18.760262" elapsed="0.048907"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.809259" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:50:18.809666" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:18.661713" elapsed="0.147995"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.810654" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.809900" elapsed="0.000914"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.809881" elapsed="0.000973"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.810941" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:18.650806" elapsed="0.160332"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.646560" elapsed="0.164623"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.646528" elapsed="0.164680"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:50:18.811925" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:18.811800" elapsed="0.000239"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.812102" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:18.812065" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.811782" elapsed="0.000433"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.812362" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:50:18.812481" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:18.811494" elapsed="0.001012"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.813093" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.812689" elapsed="0.000431"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.813868" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.813274" elapsed="0.000622"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.820833" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.820139" elapsed="0.000854"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.821984" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.821250" elapsed="0.000892"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:18.830370" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:18.830451" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-inventory-config","LastIndex":40025,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":40025,"LastLogIndex":40025,"LastLeadershipChangeTime":"2026-04-10 00:50:15.798","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"291.1 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":40025,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":3495},"timestamp":1775782218,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:18.830767" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:18.824668" elapsed="0.006148"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.822258" elapsed="0.008635"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.831410" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.830977" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.822226" elapsed="0.009437"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.838124" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-inventory-config","LastIndex":40025,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":40025,"LastLogIndex":40025,"LastLeadershipChangeTime":"2026-04-10 00:50:15.798","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"291.1 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":40025,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":3495},"timestamp":1775782218,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.834565" elapsed="0.003653"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.834235" elapsed="0.004019"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.834171" elapsed="0.004127"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.841040" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.838680" elapsed="0.002406"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.838434" elapsed="0.002686"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.838390" elapsed="0.002774"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.841986" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.841421" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.842433" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.842192" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.843024" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.842711" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.842531" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.842147" elapsed="0.000978"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.844055" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.843528" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.844496" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.844257" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.845079" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.844779" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.844614" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.844212" elapsed="0.000968"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:18.845423" elapsed="0.000494"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:18.846512" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.846173" elapsed="0.000404"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.846828" elapsed="0.002417"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:18.832784" elapsed="0.016568"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.849760" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:18.849481" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.849449" elapsed="0.000459"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:18.853418" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:18.850137" elapsed="0.003376"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:18.853721" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:18.854000" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:18.814904" elapsed="0.039124"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.854118" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:18.854272" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:18.814117" elapsed="0.040181"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.855618" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782218, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.854907" elapsed="0.000740"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:18.855697" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:18.855872" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782218, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:18.854523" elapsed="0.001376"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:18.856286" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 40025, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInit...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.856057" elapsed="0.000257"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:18.856732" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.856479" elapsed="0.000278"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:18.856804" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:18.856957" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:18.644752" elapsed="0.212230"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:18.857038" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:18.857187" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:18.643976" elapsed="0.213236"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.857510" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.857293" elapsed="0.000537"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.858001" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.857854" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.858219" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.858078" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.857275" elapsed="0.001022"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:18.643805" elapsed="0.214517"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:18.433913" elapsed="0.424442"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:18.858398" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:18.858620" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:50:18.858667" level="INFO">${follower_list} = [3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:18.429891" elapsed="0.428800"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.859133" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:18.859209" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:18.858868" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.859515" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.859300" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.859283" elapsed="0.000326"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.863038" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:18.859749" elapsed="0.003337"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:18.863479" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.863289" elapsed="0.000216"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:18.863569" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:18.427037" elapsed="0.436689"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:50:18.426815" elapsed="0.436957"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.868252" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:18.867867" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.868759" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:18.868440" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:18.868831" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:18.868987" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:18.867479" elapsed="0.001533"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:18.869167" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.869848" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:18.869481" elapsed="0.000393"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.870269" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:18.870032" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.870695" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:18.870442" elapsed="0.000278"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.873326" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.872863" elapsed="0.000490"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:18.873399" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:18.873602" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:18.872477" elapsed="0.001153"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.931532" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.931153" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.932334" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:18.932087" elapsed="0.000322">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:18.932501" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:18.931753" elapsed="0.000772"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.933085" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:18.932706" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.933410" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:18.933590" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:18.933272" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.934017" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.933774" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.935058" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.934805" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.935536" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:18.935269" 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-04-10T00:50:18.935902" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.936108" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.936282" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:18.935767" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.935630" elapsed="0.000740"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:18.936414" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:18.936589" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:18.934466" elapsed="0.002149"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.934172" elapsed="0.002476"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.936819" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.936672" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.934152" elapsed="0.002743"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.937473" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:18.937038" elapsed="0.000463"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:18.937564" elapsed="0.000069"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:18.930525" elapsed="0.007209"/>
</kw>
<msg time="2026-04-10T00:50:18.937789" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:18.917953" elapsed="0.019894"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.950526" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.962833" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.975146" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.975358" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.975540" elapsed="0.000039"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.975951" elapsed="0.000083"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.975803" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:18.975787" elapsed="0.000311"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.976241" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.976411" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.976594" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:18.975754" elapsed="0.000895"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.975643" elapsed="0.001033"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.976824" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.976901" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:50:18.977212" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:18.913601" elapsed="0.063649"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.979082" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:18.978790" elapsed="0.000369">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:18.979253" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:18.978392" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.979629" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:18.979350" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.980184" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:18.979888" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.979711" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.979331" elapsed="0.000937"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.982721" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:18.980421" elapsed="0.002327"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:18.982801" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:18.983115" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:18.977933" elapsed="0.005218"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:18.984893" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:18.984644" elapsed="0.000314">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:18.985052" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:18.984285" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:18.985291" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:18.985154" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.985134" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:18.985523" 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-04-10T00:50:18.985809" elapsed="0.000028"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:18.985888" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:18.988223" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:18.983760" elapsed="0.004562"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.990288" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.990010" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:18.990801" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:18.990496" elapsed="0.000351"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:19.004030" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:19.005121" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:19.005763" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:18.993044" elapsed="0.012792"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.990919" elapsed="0.015042"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.006492" elapsed="0.000093"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.006048" elapsed="0.000645"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.990899" elapsed="0.015847"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.013084" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.009698" elapsed="0.003903"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.008998" elapsed="0.004666"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.008947" elapsed="0.004749"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.016582" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.014031" elapsed="0.002608"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.013784" elapsed="0.002892"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.013764" elapsed="0.002937"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.017325" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.016904" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.017732" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.017428" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.018336" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.017996" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.017827" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.017408" elapsed="0.001015"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.018979" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.018605" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.019327" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.019078" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.019887" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.019588" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.019411" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.019060" elapsed="0.000910"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:19.020133" elapsed="0.000439"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:19.021043" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.020746" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.021228" elapsed="0.002669"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:19.007801" elapsed="0.016172"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.024175" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.024057" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.024034" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:19.033273" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:19.024424" elapsed="0.008893"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:19.033391" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:50:19.033836" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:18.988979" elapsed="0.044897"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:19.033972" elapsed="0.000076"/>
</return>
<msg time="2026-04-10T00:50:19.034321" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:18.888925" elapsed="0.145439"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.035507" elapsed="0.000107"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.034596" elapsed="0.001174"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.034572" elapsed="0.001245"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:19.035912" 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="PASS" start="2026-04-10T00:50:18.878043" elapsed="0.158072"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:18.873705" elapsed="0.162458"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:18.873687" elapsed="0.162501"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:50:19.037011" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:50:19.036872" elapsed="0.000255"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.037197" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.037157" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.036853" elapsed="0.000459"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.037481" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:50:19.037677" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:19.036489" elapsed="0.001234"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.038397" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.037926" elapsed="0.000499"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.039243" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.038616" elapsed="0.000656"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.046920" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.046161" elapsed="0.000926"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.048075" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.047351" elapsed="0.000892"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:19.056367" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:19.056431" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:49:55.684","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"234.2 μs","Voting":true,"CurrentTerm":3,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":0},"timestamp":1775782219,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:19.056675" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:19.050878" elapsed="0.005834"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.048364" elapsed="0.008407"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.057223" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.056838" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.048330" elapsed="0.009065"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.064252" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:49:55.684","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"234.2 μs","Voting":true,"CurrentTerm":3,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":0},"timestamp":1775782219,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.060476" elapsed="0.003924"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.060148" elapsed="0.004305"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.060079" elapsed="0.004438"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.068606" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.065099" elapsed="0.003574"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.064739" elapsed="0.003983"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.064673" elapsed="0.004113"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.070009" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.069217" elapsed="0.000865"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.070505" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.070253" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.071108" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.070794" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.070625" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.070206" elapsed="0.001006"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.071946" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.071497" elapsed="0.000500"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.072427" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.072147" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.073095" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.072748" elapsed="0.000377"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.072532" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.072101" elapsed="0.001105"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:19.073456" elapsed="0.000517"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:19.074642" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.074262" elapsed="0.000434"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.074976" elapsed="0.002503"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:19.058485" elapsed="0.019132"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.078017" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.077793" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.077759" elapsed="0.000410"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:19.081919" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:19.078399" elapsed="0.003614"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:19.082100" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:19.082379" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:19.040347" elapsed="0.042060"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:19.082466" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:19.082636" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:19.039493" elapsed="0.043171"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.083968" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782219, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.083257" elapsed="0.000740"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:19.084084" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:19.084264" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782219, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:19.082891" elapsed="0.001401"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:19.084742" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.084462" elapsed="0.000309"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:19.085181" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.084933" elapsed="0.000275"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:19.085255" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:19.085411" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:18.871872" elapsed="0.213565"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:19.085496" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:19.085757" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:18.871138" elapsed="0.214646"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.086087" elapsed="0.000195"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.085867" elapsed="0.000453"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.086495" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.086345" elapsed="0.000221"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.086740" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.086592" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.085849" elapsed="0.000967"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:18.870969" elapsed="0.215872"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.089405" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.088926" elapsed="0.000507"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:19.089595" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:19.089786" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:19.088534" elapsed="0.001281"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.149523" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.149121" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:19.150405" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:19.150140" elapsed="0.000341">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:19.150593" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:19.149791" elapsed="0.000829"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.151184" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:19.150792" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:19.151590" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:19.151753" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:19.151416" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.152260" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.152004" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.153310" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.153050" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.153863" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.153522" 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-04-10T00:50:19.154233" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.154445" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.154642" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:19.154091" elapsed="0.000612"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.153947" elapsed="0.000787"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:19.154782" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:19.154952" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:19.152712" elapsed="0.002266"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.152385" elapsed="0.002626"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.155195" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.155037" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.152361" elapsed="0.002914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.155883" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.155422" elapsed="0.000490"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:19.155961" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:19.148478" elapsed="0.007611"/>
</kw>
<msg time="2026-04-10T00:50:19.156144" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:19.135603" elapsed="0.020595"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.168924" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.181240" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.193500" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.193741" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.193923" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.194346" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.194199" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:19.194183" 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-04-10T00:50:19.194583" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.194753" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.194921" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:19.194153" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.194049" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.195148" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.195223" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:19.195497" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:19.131127" elapsed="0.064406"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:19.197222" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:19.196968" elapsed="0.000318">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:19.197377" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:19.196625" 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-04-10T00:50:19.197753" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.197470" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.198300" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.198011" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.197834" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.197452" elapsed="0.000929"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.200715" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:19.198530" elapsed="0.002212"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:19.200792" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:19.201103" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:19.196171" elapsed="0.004967"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:19.202995" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:19.202750" elapsed="0.000309">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:19.203152" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:19.202230" elapsed="0.000947"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:19.203382" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:19.203247" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.203229" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.203627" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.203806" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.203910" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:19.206237" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:19.201785" elapsed="0.004490"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.208109" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.207853" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.208588" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.208308" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:19.225517" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:19.226505" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:19.226989" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:19.210772" elapsed="0.016279"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.208700" elapsed="0.018453"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.227592" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.227214" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.208682" elapsed="0.019106"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.235205" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.230121" elapsed="0.005440"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.229594" elapsed="0.006005"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.229523" elapsed="0.006100"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.238257" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.235906" elapsed="0.002397"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.235681" elapsed="0.002657"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.235664" elapsed="0.002698"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.238932" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.238534" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.239265" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.239029" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.239826" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.239508" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.239347" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.239011" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.240428" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.240069" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.240779" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.240525" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.241314" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.241020" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.240860" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.240507" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:19.241562" elapsed="0.000377"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:19.242391" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.242105" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.242587" elapsed="0.002474"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:19.228624" elapsed="0.016501"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.245298" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.245195" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.245176" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:19.253678" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:19.245510" elapsed="0.008198"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:19.253775" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:19.254099" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:19.206893" elapsed="0.047242"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:19.254226" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:50:19.254592" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:19.105800" elapsed="0.148836"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.255575" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.254828" elapsed="0.000909"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.254809" elapsed="0.000968"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:19.255865" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:19.094259" elapsed="0.161800"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.089890" elapsed="0.166215"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.089870" elapsed="0.166260"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:50:19.256856" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:19.256730" elapsed="0.000235"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.257029" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.256991" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.256712" elapsed="0.000430"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.257293" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:19.257413" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:19.256419" elapsed="0.001020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.258117" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.257628" elapsed="0.000518"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.258920" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.258309" elapsed="0.000641"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.266268" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.265490" elapsed="0.000948"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.267425" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.266719" elapsed="0.000936"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:19.276306" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:19.276403" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:49:55.680","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-config","nextIndex":-1},{"timeSinceLastActivity":"00:00:00.210","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"434.2 μs","Voting":true,"CurrentTerm":3,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782219,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:19.276772" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:19.270231" elapsed="0.006597"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.267781" elapsed="0.009140"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.277525" elapsed="0.000095"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.277019" elapsed="0.000688"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.267746" elapsed="0.010088"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.285434" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:49:55.680","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-config","nextIndex":-1},{"timeSinceLastActivity":"00:00:00.210","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"434.2 μs","Voting":true,"CurrentTerm":3,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782219,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.281415" elapsed="0.004115"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.281052" elapsed="0.004554"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.280980" elapsed="0.004696"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.288722" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.286240" elapsed="0.002530"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.285943" elapsed="0.002863"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.285872" elapsed="0.002980"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.289630" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.289138" elapsed="0.000545"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.290116" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.289866" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.290734" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.290399" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.290222" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.289817" elapsed="0.001023"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.291752" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.291099" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.292203" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.291959" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.292806" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.292475" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.292304" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.291913" elapsed="0.000998"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:19.293166" elapsed="0.000460"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:19.294298" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.293941" elapsed="0.000409"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.294634" elapsed="0.002451"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:19.279385" elapsed="0.017816"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.297587" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.297335" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.297302" elapsed="0.000444"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:19.301535" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:19.298009" elapsed="0.003649"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:19.301750" elapsed="0.000063"/>
</return>
<msg time="2026-04-10T00:50:19.302123" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:19.260001" elapsed="0.042153"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:19.302216" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:19.302375" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:19.259170" elapsed="0.043233"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.303930" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782219, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.303121" elapsed="0.000840"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:19.304012" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:19.304196" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782219, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:19.302726" elapsed="0.001499"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:19.304650" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.304387" elapsed="0.000296"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:19.305090" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.304846" elapsed="0.000271"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:19.305167" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:19.305327" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:19.087920" elapsed="0.217433"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:19.305413" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:19.305586" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:19.087179" elapsed="0.218434"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.306022" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.305709" elapsed="0.000374"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.306325" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.306108" elapsed="0.000468"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.306755" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.306601" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.305688" elapsed="0.001142"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:19.087006" elapsed="0.219849"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:18.870768" elapsed="0.436119"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:19.306932" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:19.307134" level="INFO">${leader_list} = [3]</msg>
<msg time="2026-04-10T00:50:19.307182" level="INFO">${follower_list} = [1]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:18.866766" elapsed="0.440440"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.307816" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:19.307895" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:19.307383" elapsed="0.000535"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.308202" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.307988" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.307971" elapsed="0.000348"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.310523" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:19.308461" elapsed="0.002126"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:19.310938" level="INFO">${leader} = 3</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.310752" elapsed="0.000211"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:19.311009" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:18.864085" elapsed="0.447076"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:50:18.863859" elapsed="0.447349"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.315735" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:19.315334" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.316224" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:19.315923" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:19.316295" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:19.316450" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:19.314960" elapsed="0.001515"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:19.316647" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.317293" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:19.316963" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.317735" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:19.317478" elapsed="0.000283"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.318185" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:19.317951" elapsed="0.000259"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.320840" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.320349" elapsed="0.000518"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:19.320914" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:19.321063" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:19.319979" elapsed="0.001109"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.380282" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.379898" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:19.381096" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:19.380838" elapsed="0.000336">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:19.381266" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:19.380481" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.381873" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:19.381457" elapsed="0.000443"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:19.382204" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:19.382406" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:19.382061" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.382852" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.382606" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.383864" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.383606" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.384341" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.384070" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.384712" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.384918" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.385093" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:19.384573" elapsed="0.000577"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.384419" elapsed="0.000762"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:19.385226" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:19.385386" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:19.383267" elapsed="0.002143"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.382969" elapsed="0.002473"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.385628" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.385467" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.382948" elapsed="0.002760"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.386323" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.385886" elapsed="0.000465"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:19.386401" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:19.379271" elapsed="0.007254"/>
</kw>
<msg time="2026-04-10T00:50:19.386596" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:19.366591" elapsed="0.020058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.399483" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.411823" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.424285" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.424486" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.424748" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.425126" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.424980" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:19.424965" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.425428" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.425621" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.425792" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:19.424934" elapsed="0.000940"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.424830" elapsed="0.001072"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.426050" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.426127" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:19.426406" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:19.362199" elapsed="0.064243"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:19.428132" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:19.427878" elapsed="0.000321">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:19.428290" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:19.427510" elapsed="0.000804"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.428646" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.428384" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.429196" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.428905" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.428727" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.428366" elapsed="0.000913"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.431648" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:19.429429" elapsed="0.002245"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:19.431725" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:19.432030" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:19.427070" elapsed="0.004994"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:19.433694" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:19.433437" elapsed="0.000322">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:19.433890" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:19.433096" elapsed="0.000820"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:19.434123" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:50:19.433988" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.433969" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.434351" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.434522" elapsed="0.000074"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.434647" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:19.436885" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:19.432662" elapsed="0.004259"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.438729" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.438455" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.439171" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.438932" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:19.452282" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:19.453251" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:19.453751" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:19.441367" elapsed="0.012446"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.439279" elapsed="0.014687"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.454382" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.454029" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.439262" elapsed="0.015344"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.462642" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.457007" elapsed="0.005959"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.456470" elapsed="0.006532"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.456425" elapsed="0.006601"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.465711" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.463312" elapsed="0.002446"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.463083" elapsed="0.002710"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.463065" elapsed="0.002752"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.466427" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.466036" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.466780" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.466524" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.467325" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.467020" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.466860" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.466507" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.467946" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.467586" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.468272" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.468041" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.468819" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.468510" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.468352" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.468024" elapsed="0.000877"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:19.469051" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:19.469881" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.469576" elapsed="0.000332"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.470064" elapsed="0.002373"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:19.455398" elapsed="0.017101"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.472691" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.472584" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.472564" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:19.481339" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:19.472923" elapsed="0.008446"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:19.481421" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:19.481766" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:19.437504" elapsed="0.044299"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:19.481928" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:50:19.482271" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:19.337515" elapsed="0.144797"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.483262" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.482505" elapsed="0.000920"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.482486" elapsed="0.000979"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:19.483569" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:19.326713" elapsed="0.157053"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.321157" elapsed="0.162656"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.321139" elapsed="0.162699"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:50:19.484538" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T00:50:19.484413" elapsed="0.000252"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.484729" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.484691" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.484395" elapsed="0.000445"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.484990" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:19.485110" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:19.484126" elapsed="0.001009"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.485724" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.485304" elapsed="0.000447"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.486495" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.485931" elapsed="0.000592"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.493597" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.492889" elapsed="0.000874"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.494784" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.494044" elapsed="0.000901"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:19.505076" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:19.505137" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-default-config","LastIndex":74,"RaftState":"Leader","LastApplied":74,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:49:56.029","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.076","active":true,"matchIndex":74,"voting":true,"id":"member-3-shard-default-config","nextIndex":75},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-default-config","nextIndex":74}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"727.1 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":10671},"timestamp":1775782219,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:19.505353" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:19.497379" elapsed="0.008010"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.495062" elapsed="0.010385"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.505843" elapsed="0.000090"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.505509" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.495030" elapsed="0.011019"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.515382" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-default-config","LastIndex":74,"RaftState":"Leader","LastApplied":74,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:49:56.029","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.076","active":true,"matchIndex":74,"voting":true,"id":"member-3-shard-default-config","nextIndex":75},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-default-config","nextIndex":74}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"727.1 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":10671},"timestamp":1775782219,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.510880" elapsed="0.004567"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.510310" elapsed="0.005173"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.510206" elapsed="0.005322"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.518360" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.515914" elapsed="0.002495"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.515684" elapsed="0.002760"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.515638" elapsed="0.002851"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.519266" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.518834" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.519730" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.519468" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.520304" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.519998" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.519833" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.519422" elapsed="0.000984"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.521097" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.520675" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.521535" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.521297" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.522217" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.521815" elapsed="0.000431"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.521651" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.521252" elapsed="0.001071"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:19.522591" elapsed="0.000429"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:19.523648" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.523281" elapsed="0.000419"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.523948" elapsed="0.002619"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:19.507984" elapsed="0.018694"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.527034" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.526812" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.526779" elapsed="0.000410"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:19.531044" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757822...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:19.527419" elapsed="0.003718"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:19.531226" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:19.531539" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757822...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:19.487530" elapsed="0.044053"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:19.531642" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:19.531795" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757822...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:19.486763" elapsed="0.045058"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.533150" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782219, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.532413" elapsed="0.000766"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:19.533228" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:19.533409" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782219, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:19.532048" elapsed="0.001388"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:19.533841" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 74, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.533610" elapsed="0.000258"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:19.534302" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.534067" elapsed="0.000261"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:19.534374" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:19.534525" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:19.319357" elapsed="0.215212"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:19.534628" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:19.534776" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:19.318648" elapsed="0.216152"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.535097" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.534881" elapsed="0.000274"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.535386" elapsed="0.000206"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.535178" elapsed="0.000452"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.535803" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.535654" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.534864" elapsed="0.001013"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:19.318461" elapsed="0.217439"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.538469" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.538004" elapsed="0.000492"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:19.538555" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:19.538706" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:19.537617" elapsed="0.001113"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.596470" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.596077" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:19.597351" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:19.597088" elapsed="0.000336">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:19.597519" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:19.596686" elapsed="0.000873"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.598150" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:19.597730" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:19.598483" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:19.598649" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:19.598342" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.599081" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.598834" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.600109" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.599853" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.600606" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.600317" 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-04-10T00:50:19.600962" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.601176" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.601354" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:19.600824" elapsed="0.000590"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.600685" elapsed="0.000759"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:19.601491" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:19.601670" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:19.599508" elapsed="0.002188"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.599204" elapsed="0.002526"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.601903" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.601755" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.599183" elapsed="0.002826"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.602605" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.602152" elapsed="0.000482"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:19.602683" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:19.595444" elapsed="0.007363"/>
</kw>
<msg time="2026-04-10T00:50:19.602862" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:19.582891" elapsed="0.020022"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.615476" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.628179" elapsed="0.000106"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.641131" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.641341" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.641521" elapsed="0.000035"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.641926" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.641777" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:19.641762" elapsed="0.000321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.642234" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.642404" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.642589" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:19.641728" elapsed="0.000917"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.641622" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.642819" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.642897" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:50:19.643201" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:19.578410" elapsed="0.064827"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:19.644978" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:19.644709" elapsed="0.000339">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:19.645141" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:19.644328" elapsed="0.000838"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.645484" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.645235" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.646088" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.645763" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.645582" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.645217" elapsed="0.000952"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.648471" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:19.646319" elapsed="0.002179"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:19.648583" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:19.648892" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:19.643878" elapsed="0.005049"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:19.650632" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:19.650372" elapsed="0.000324">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:19.650791" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:19.650030" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:19.651020" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:19.650887" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.650869" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.651252" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.651426" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.651491" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:19.653740" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:19.649570" elapsed="0.004207"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.655618" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.655346" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.656058" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.655818" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:19.674109" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:19.674852" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:19.675228" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:19.658271" elapsed="0.016999"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.656167" elapsed="0.019180"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.675719" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.675404" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.656150" elapsed="0.019703"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.682063" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.677620" elapsed="0.004981"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.677212" elapsed="0.005447"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.677177" elapsed="0.005519"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.686874" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.683128" elapsed="0.003843"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.682783" elapsed="0.004247"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.682757" elapsed="0.004327"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.688065" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.687430" elapsed="0.000676"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.688655" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.688217" elapsed="0.000549"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.689675" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.689153" elapsed="0.000564"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.688814" elapsed="0.000959"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.688189" elapsed="0.001615"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.690671" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.690100" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.691164" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.690818" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.691757" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.691429" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.691252" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.690791" elapsed="0.001052"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:19.691998" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:19.692846" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.692517" elapsed="0.000368"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.693109" elapsed="0.002958"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:19.676421" elapsed="0.019717"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.696323" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.696212" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.696192" elapsed="0.000203"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:19.705057" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:19.696560" elapsed="0.008531"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:19.705148" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:50:19.705494" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:19.654410" elapsed="0.051121"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:19.705652" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:50:19.706020" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:19.554006" elapsed="0.152057"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.707037" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.706258" elapsed="0.000958"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.706238" elapsed="0.001019"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:19.707346" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:19.543069" elapsed="0.164488"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.538798" elapsed="0.168807"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.538780" elapsed="0.168850"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:50:19.708359" elapsed="0.000157"/>
</return>
<status status="PASS" start="2026-04-10T00:50:19.708232" elapsed="0.000384"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.708681" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.708643" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.708215" elapsed="0.000577"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.708947" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:50:19.709067" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:19.707922" elapsed="0.001170"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.709711" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.709269" elapsed="0.000469"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.710486" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.709898" elapsed="0.000618"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.717585" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.716880" elapsed="0.000870"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.718762" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.718037" elapsed="0.000883"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:19.726668" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:19.726732" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-1-shard-default-config","LastIndex":74,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":74,"LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:49:56.029","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"213.3 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":10671},"timestamp":1775782219,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:19.726947" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:19.721374" elapsed="0.005609"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.719042" elapsed="0.008000"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.727424" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.727105" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.719007" elapsed="0.008597"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.732954" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-1-shard-default-config","LastIndex":74,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":74,"LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:49:56.029","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"213.3 μs","Voting":true,"CurrentTerm":3,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":10671},"timestamp":1775782219,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.729687" elapsed="0.003458"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.729445" elapsed="0.003767"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.729399" elapsed="0.003896"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.737978" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.733876" elapsed="0.004231"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.733506" elapsed="0.004658"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.733440" elapsed="0.004794"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.739327" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.738663" elapsed="0.000719"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.739827" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.739572" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.740416" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.740099" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.739931" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.739506" elapsed="0.001015"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.741236" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.740810" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.741699" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.741441" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.742315" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:19.741964" elapsed="0.000378"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.741800" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.741395" elapsed="0.001023"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:19.742685" elapsed="0.000430"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:19.743759" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.743377" elapsed="0.000433"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.744159" elapsed="0.002510"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:19.728423" elapsed="0.018360"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.747143" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.746915" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.746882" elapsed="0.000415"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:19.751094" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757822...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:19.747538" elapsed="0.003655"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:19.751282" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:50:19.751589" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757822...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:19.711529" elapsed="0.040090"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:19.751677" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:19.751833" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757822...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:19.710765" elapsed="0.041095"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.753200" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782219, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:19.752471" elapsed="0.000759"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:19.753333" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:50:19.753605" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782219, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:19.752095" elapsed="0.001543"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:19.754076" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 74, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.753805" elapsed="0.000302"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:19.754528" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.754287" elapsed="0.000286"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:19.754622" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:19.754777" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:19.537002" elapsed="0.217800"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:19.754861" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:50:19.755010" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:19.536232" elapsed="0.218804"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.755336" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.755118" elapsed="0.000464"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.755753" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.755607" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.755974" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.755832" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.755101" elapsed="0.000946"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:19.536063" elapsed="0.220008"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:19.318259" elapsed="0.437846"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:19.756149" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:19.756352" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:50:19.756398" level="INFO">${follower_list} = [3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:19.314228" elapsed="0.442193"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.756886" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:19.756962" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:19.756614" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.757273" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.757055" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.757037" elapsed="0.000312"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.759731" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:19.757486" elapsed="0.002294"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:19.760132" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.759947" elapsed="0.000210"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:19.760203" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:19.311526" elapsed="0.448831"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:50:19.311299" elapsed="0.449103"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:50:18.426684" elapsed="1.333749"/>
</for>
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:50:18.426280" elapsed="1.334211"/>
</kw>
<arg>${Inventory_Followers}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:50:17.099598" elapsed="2.661011"/>
</kw>
<arg>${operation_timeout}</arg>
<arg>2s</arg>
<arg>ClusterOpenFlow.Check OpenFlow Shards Status</arg>
<arg>${Inventory_Followers}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:49:58.999305" elapsed="20.761358"/>
</kw>
<doc>Wait for node convergence and check status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:49:48.611836" elapsed="31.148956"/>
</test>
<test id="s1-s2-t5" name="Check Shard Status For Leader After PreLeader Shutdown" line="73">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:50:19.764385" elapsed="0.000261"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:50:19.764097" elapsed="0.000606"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.765763" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.765647" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.765628" elapsed="0.000204"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.771013" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.770890" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.770868" elapsed="0.000215"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.772101" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:19.771718" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.772608" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:19.772287" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:19.772679" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:19.772834" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:19.771321" elapsed="0.001538"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.778437" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.778330" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.778311" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.779687" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.779578" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.779538" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:19.780239" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.779906" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:19.780686" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:19.780434" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:19.818575" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:19.781243" elapsed="0.037525"/>
</kw>
<msg time="2026-04-10T00:50:19.819009" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:50:19.819069" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:19.780889" elapsed="0.038220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:19.904040" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "[C "S "t "a "t "u "s "[C "F "o "r "[C "L "e "a "d "e "r "[C "A "f "t "e "r "[C "P "r "e "L "e "a "d "e "r "[C "S "h "u "t "d "o "w "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:50:19.820003" elapsed="0.084207"/>
</kw>
<msg time="2026-04-10T00:50:19.904391" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:50:19.904438" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:19.819534" elapsed="0.084940"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.904891" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.904607" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.904577" elapsed="0.000481"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.905783" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "[C "S "t "a "t "u "s "[C "F "o "r "[C "L "e "a "d "e "r "[C "A "f "t "e "r "[C "P "r "e "L "e "a "d "e "r "[C "S "h "u "t "d "o "w "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.905209" elapsed="0.000667"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.906202" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.905946" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.905927" elapsed="0.000358"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:50:19.906324" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:19.908085" elapsed="0.000802"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.909174" elapsed="0.000501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:19.909952" elapsed="0.000398"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:19.907251" elapsed="0.003204"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:19.906669" elapsed="0.003852"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:50:19.779254" elapsed="0.131390"/>
</kw>
<msg time="2026-04-10T00:50:19.910741" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:19.910786" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:19.778675" elapsed="0.132149"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:50:19.911016" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:19.910904" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.910885" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.911557" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.911909" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.911984" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:50:19.777953" elapsed="0.134144"/>
</kw>
<msg time="2026-04-10T00:50:19.912198" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:19.912245" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:19.773231" elapsed="0.139059"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.912653" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.912372" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.912354" elapsed="0.000380"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:19.773087" elapsed="0.139671"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.920122" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.920010" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.919991" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.921363" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.921256" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.921238" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:19.921905" level="INFO">${karaf_connection_index} = 126</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.921602" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:19.922420" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:19.922194" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:19.923239" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:50:19.922980" elapsed="0.000996">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:50:19.924173" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:50:19.924220" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:19.922633" elapsed="0.001610"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:19.925025" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:50:19.924780" elapsed="0.001023">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:50:19.925995" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:50:19.926041" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:19.924416" elapsed="0.001650"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.927041" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shard Status For Leader After PreLeader Shutdown"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:50:19.926394" elapsed="0.000712">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shard Status For Leader After PreLeader Shutdown"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:50:19.926168" elapsed="0.001010">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shard Status For Leader After PreLeader Shutdown"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:50:19.926148" elapsed="0.001063">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shard Status For Leader After PreLeader Shutdown"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.927397" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:19.927654" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:19.927489" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:19.927472" elapsed="0.000262"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.927768" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:19.929224" elapsed="0.000814"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.930362" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:19.931122" 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-04-10T00:50:19.928595" elapsed="0.003021"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:19.928038" elapsed="0.003645"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:50:19.920943" elapsed="0.010829">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shard Status For Leader After PreLeader Shutdown"</status>
</kw>
<msg time="2026-04-10T00:50:19.931880" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:50:19.931925" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shard Status For Leader After PreLeader...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:19.920349" elapsed="0.011602"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.932150" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.932039" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.932021" elapsed="0.000197"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:19.933012" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:19.932909" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.932892" elapsed="0.000185"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:19.992091" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:19.933228" elapsed="0.059177"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.993014" level="INFO">{1: 88, 2: 126, 3: 92}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.992653" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:19.993466" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:19.993219" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.994097" elapsed="0.000333"/>
</kw>
<msg time="2026-04-10T00:50:19.994533" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:19.994607" level="INFO">${old_connection_index} = 126</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:19.993693" elapsed="0.000939"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:19.995524" elapsed="0.000229"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:19.996938" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:50:19.996455" elapsed="0.001466">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:19.995928" elapsed="0.002096"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:19.998785" elapsed="0.000295"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:19.998255" elapsed="0.000930"/>
</kw>
<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="PASS" start="2026-04-10T00:50:19.994973" elapsed="0.004261"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:19.994723" elapsed="0.004562"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:19.994700" elapsed="0.004612"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:20.000278" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:19.999936" elapsed="0.000371"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:50:20.000359" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:20.000518" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:19.999586" elapsed="0.000973"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.000719" elapsed="0.000468"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.001557" level="INFO">index=131
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:20.001401" elapsed="0.000293"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.001848" elapsed="0.002572"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.004889" level="INFO">Logging into '10.30.170.169:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:50:20.007338" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</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="FAIL" start="2026-04-10T00:50:20.004619" elapsed="0.003235">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:20.020712" elapsed="0.000498"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.021381" elapsed="0.000155"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:20.021869" elapsed="0.000101"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:20.008738" elapsed="0.013286"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:20.008158" elapsed="0.013915"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:50:19.932621" elapsed="0.089611">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.022603" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.022679" 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="FAIL" start="2026-04-10T00:50:19.919639" elapsed="0.103152">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<msg time="2026-04-10T00:50:20.022901" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:50:20.022946" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:19.913036" elapsed="0.109934"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.023311" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.023052" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.023034" elapsed="0.000364"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:50:19.912891" elapsed="0.110541"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.029031" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.028923" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.028904" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.030445" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.030337" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.030319" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:20.031097" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.030787" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.031558" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:20.031287" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.068017" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:20.032124" elapsed="0.036127"/>
</kw>
<msg time="2026-04-10T00:50:20.068579" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:50:20.068656" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.031781" elapsed="0.036932"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.160638" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "[C "S "t "a "t "u "s "[C "F "o "r "[C "L "e "a "d "e "r "[C "A "f "t "e "r "[C "P "r "e "L "e "a "d "e "r "[C "S "h "u "t "d "o "w "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:50:20.069692" elapsed="0.091129"/>
</kw>
<msg time="2026-04-10T00:50:20.161014" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:50:20.161062" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.069043" elapsed="0.092057"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.161504" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.161207" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.161176" elapsed="0.000440"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.162110" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "[C "S "t "a "t "u "s "[C "F "o "r "[C "L "e "a "d "e "r "[C "A "f "t "e "r "[C "P "r "e "L "e "a "d "e "r "[C "S "h "u "t "d "o "w "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.161767" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.162636" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.162391" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.162371" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:50:20.162753" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:20.164560" elapsed="0.000797"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.165661" elapsed="0.000474"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:20.166464" elapsed="0.000388"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:20.163673" elapsed="0.003282"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:20.163074" elapsed="0.003946"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:50:20.030008" elapsed="0.137112"/>
</kw>
<msg time="2026-04-10T00:50:20.167214" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:20.167258" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.029252" elapsed="0.138044"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:50:20.167522" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T00:50:20.167396" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.167365" elapsed="0.000282"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.168057" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.168420" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.168498" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:50:20.028573" elapsed="0.140056"/>
</kw>
<msg time="2026-04-10T00:50:20.168725" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:20.168771" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.023764" elapsed="0.145044"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.169150" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.168885" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.168868" elapsed="0.000389"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:20.023613" elapsed="0.145676"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:19.772914" elapsed="0.396420"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:50:19.770492" elapsed="0.398927"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:50:19.765316" elapsed="0.404200"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:19.764862" elapsed="0.404741"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:50:19.761894" elapsed="0.407786"/>
</kw>
<kw name="Get InventoryConfig Shard Status" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.176813" level="INFO">${return_list_reference} = [1, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:20.176336" elapsed="0.000514"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.177505" level="INFO">${return_list_copy} = [1, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:20.177078" elapsed="0.000455"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:20.177604" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:20.177766" level="INFO">${index_list} = [1, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:20.175838" elapsed="0.002028"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:50:20.178055" elapsed="0.000199"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.178820" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:20.178423" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.179259" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:20.179011" elapsed="0.000274"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.179720" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:20.179451" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.182432" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.182084" elapsed="0.000375"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:20.182507" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:20.182679" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:20.181523" elapsed="0.001186"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.260339" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.259924" elapsed="0.000449"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:20.261185" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:20.260911" elapsed="0.000352">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:20.261357" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:20.260568" elapsed="0.000814"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.261954" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:20.261567" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:20.262319" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:20.262539" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:20.262145" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.263033" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.262742" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.264158" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.263903" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.264655" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.264364" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.265013" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.265405" 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-04-10T00:50:20.265637" elapsed="0.000032"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:20.264876" elapsed="0.000843"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.264735" elapsed="0.001027"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:20.265826" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:50:20.266048" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:20.263575" elapsed="0.002574"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.263198" elapsed="0.002996"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.266470" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.266227" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.263166" elapsed="0.003434"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.267431" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.266814" elapsed="0.000655"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:20.267534" elapsed="0.000059"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:20.259178" elapsed="0.008607"/>
</kw>
<msg time="2026-04-10T00:50:20.267878" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:20.244148" elapsed="0.023924"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.282832" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.300320" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.314964" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.315343" elapsed="0.000089"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.315722" elapsed="0.000076"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.316618" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.316359" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:20.316322" elapsed="0.000409"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.317006" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.317346" elapsed="0.000037"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.317670" elapsed="0.000036"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:20.316232" elapsed="0.001525"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.315954" elapsed="0.001878"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.318215" elapsed="0.000076"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.318509" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:50:20.318724" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:20.232878" elapsed="0.085875"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:20.320937" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:20.320579" elapsed="0.000437">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:20.321167" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:20.319735" elapsed="0.001471"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.322667" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.321355" elapsed="0.001401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.323675" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.323100" elapsed="0.000623"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.322795" elapsed="0.000978"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.321335" elapsed="0.002473"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.326827" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:20.324010" elapsed="0.002859"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:20.327005" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:20.327235" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:20.319207" elapsed="0.008054"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:20.329281" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:20.328977" elapsed="0.000368">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:20.329494" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:20.328186" elapsed="0.001348"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:20.329994" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-10T00:50:20.329701" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.329682" elapsed="0.000490"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.330391" elapsed="0.000077"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.330728" elapsed="0.000073"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.330919" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:50:20.348968" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:20.327730" elapsed="0.021307"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.354094" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.353149" elapsed="0.001149"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.355646" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.354706" elapsed="0.001140"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:20.370405" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:20.371055" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:20.371714" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:20.360434" elapsed="0.011353"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.356038" elapsed="0.015837"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.373495" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.371939" elapsed="0.001725"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.356006" elapsed="0.017710"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.381443" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.377341" elapsed="0.004761"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.376901" elapsed="0.005290"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.376853" elapsed="0.005406"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.386469" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.382856" elapsed="0.003682"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.382419" elapsed="0.004230"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.382376" elapsed="0.004344"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.387772" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.387212" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.388245" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.387930" elapsed="0.000395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.388916" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.388603" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.388372" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.387899" elapsed="0.001148"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.389911" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.389382" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.390395" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.390068" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.391069" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.390763" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.390523" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.390037" elapsed="0.001163"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:20.391531" elapsed="0.000459"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:20.392785" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.392334" elapsed="0.000497"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.393166" elapsed="0.002502"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:20.375060" elapsed="0.020689"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.396121" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.395918" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.395897" elapsed="0.000388"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:20.406877" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:20.396482" elapsed="0.010442"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:20.407065" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:50:20.407312" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:20.350097" elapsed="0.057243"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:20.407407" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:20.407596" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:20.191166" elapsed="0.216459"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.407958" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.407712" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.407694" elapsed="0.000409"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:20.408137" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:20.186887" elapsed="0.221377"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.182794" elapsed="0.225515"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.182772" elapsed="0.225562"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:50:20.408959" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:20.408853" elapsed="0.000167"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.409081" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.409043" elapsed="0.000077"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.408836" elapsed="0.000307"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.409291" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:50:20.409410" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:20.408583" elapsed="0.000853"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.409998" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.409623" elapsed="0.000403"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.410694" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.410184" elapsed="0.000538"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.416428" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.416149" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.416917" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.416649" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:20.425997" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:20.426106" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-inventory-config","LastIndex":40025,"RaftState":"Leader","LastApplied":40025,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40025,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":40024},{"timeSinceLastActivity":"00:00:00.226","active":true,"matchIndex":40025,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":40026}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"370.8 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":40025,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":3457},"timestamp":1775782220,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:20.426263" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:20.419210" elapsed="0.007080"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.417031" elapsed="0.009302"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.426580" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.426394" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.417013" elapsed="0.009686"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.432783" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-inventory-config","LastIndex":40025,"RaftState":"Leader","LastApplied":40025,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":40025,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":40024},{"timeSinceLastActivity":"00:00:00.226","active":true,"matchIndex":40025,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":40026}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"370.8 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":40025,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":3457},"timestamp":1775782220,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.428372" elapsed="0.004631"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.427931" elapsed="0.005204"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.427904" elapsed="0.005272"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.437008" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.433758" elapsed="0.003384"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.433264" elapsed="0.003985"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.433237" elapsed="0.004047"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.438052" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.437457" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.438873" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.438191" elapsed="0.000865"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.440332" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.439582" elapsed="0.000793"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.439085" elapsed="0.001394"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.438168" elapsed="0.002336"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.441246" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.440684" elapsed="0.000590"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.442022" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.441381" elapsed="0.000829"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.443576" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.442816" elapsed="0.000807"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.442239" elapsed="0.001488"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.441362" elapsed="0.002391"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:20.443909" elapsed="0.000753"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:20.445413" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.444880" elapsed="0.000560"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.445690" elapsed="0.002946"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:20.427234" elapsed="0.021503"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.448933" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.448819" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.448796" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:20.466233" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:20.449158" elapsed="0.017105"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:20.466367" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:50:20.466779" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:20.411648" elapsed="0.055161"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:20.466868" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:20.467019" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:20.410941" elapsed="0.056104"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.468139" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782220, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.467661" elapsed="0.000506"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:20.468217" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:20.468396" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782220, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:20.467279" elapsed="0.001144"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:20.468813" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 40025, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.468604" elapsed="0.000236"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:20.469192" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.468995" elapsed="0.000223"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:20.469266" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:20.469419" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:20.180916" elapsed="0.288527"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:20.469501" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:20.469672" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:20.180182" elapsed="0.289515"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.469995" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.469777" elapsed="0.000274"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.470281" elapsed="0.000221"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.470075" elapsed="0.000465"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.471155" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.471003" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.469760" elapsed="0.001469"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:20.180009" elapsed="0.291244"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.473771" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.473443" elapsed="0.000355"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:20.473844" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:20.473992" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:20.473096" elapsed="0.000921"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.548687" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.548280" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:20.549569" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:20.549291" elapsed="0.000359">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:20.549745" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:20.548946" elapsed="0.000824"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.550324" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:20.549937" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:50:20.550712" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:50:20.550933" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:50:20.550566" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.551364" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.551119" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.552589" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.552119" elapsed="0.000515"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.553065" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.552796" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.553419" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.553642" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.553819" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:50:20.553280" elapsed="0.000596"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.553142" elapsed="0.000765"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:50:20.553952" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:20.554111" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:50:20.551796" elapsed="0.002340"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.551477" elapsed="0.002691"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.554339" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.554192" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.551458" elapsed="0.002957"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.555027" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.554593" elapsed="0.000462"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:50:20.555102" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:50:20.547583" elapsed="0.007686"/>
</kw>
<msg time="2026-04-10T00:50:20.555341" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:20.534025" elapsed="0.021456"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.569459" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.583219" elapsed="0.000057"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.596964" elapsed="0.000078"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.597402" elapsed="0.000077"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.597762" elapsed="0.000076"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.598678" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.598388" elapsed="0.000359"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:20.598357" elapsed="0.000434"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.599059" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.599370" elapsed="0.000034"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.599686" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:50:20.598282" elapsed="0.001486"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.597993" elapsed="0.001849"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.600166" elapsed="0.000081"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.600420" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:50:20.600645" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:50:20.523268" elapsed="0.077405"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:20.602870" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:20.602496" elapsed="0.000452">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:20.603099" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:20.601607" elapsed="0.001533"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.604576" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.603292" elapsed="0.001373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.605524" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.605015" elapsed="0.000635"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.604705" elapsed="0.000996"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.603272" elapsed="0.002465"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.608704" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:20.605942" elapsed="0.002803"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:50:20.608878" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:20.609109" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:20.601089" elapsed="0.008046"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:50:20.611240" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:50:20.610935" elapsed="0.000370">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:50:20.611453" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:50:20.610121" elapsed="0.001372"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:50:20.611963" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-04-10T00:50:20.611668" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.611648" elapsed="0.000495"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.612342" elapsed="0.000076"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.612679" elapsed="0.000076"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.612877" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:50:20.627842" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:50:20.609661" elapsed="0.018210"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.630836" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.630200" elapsed="0.000771"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.631813" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.631208" elapsed="0.000737"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:20.650173" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:20.650843" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:50:20.651446" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:20.635454" elapsed="0.016062"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.632070" elapsed="0.019568"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.653242" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.651707" elapsed="0.001677"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.632050" elapsed="0.021386"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.661337" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.657172" elapsed="0.004763"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.656726" elapsed="0.005302"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.656677" elapsed="0.005424"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.666364" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.662719" elapsed="0.003713"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.662243" elapsed="0.004298"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.662199" elapsed="0.004435"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.667951" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.667152" elapsed="0.000866"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.668652" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.668179" elapsed="0.000594"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.669662" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.669157" elapsed="0.000545"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.668842" elapsed="0.000948"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.668133" elapsed="0.001723"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.671161" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.670353" elapsed="0.000862"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.671644" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.671325" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.672290" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.671983" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.671772" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.671294" elapsed="0.001126"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:20.672765" elapsed="0.000439"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:20.673997" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.673562" elapsed="0.000480"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.674375" elapsed="0.002635"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:20.654849" elapsed="0.022275"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.677502" elapsed="0.000054"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.677296" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.677276" elapsed="0.000406"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:20.688219" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:20.677880" elapsed="0.010384"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:20.688405" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:50:20.688666" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:20.628236" elapsed="0.060458"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:20.688759" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:20.688913" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:50:20.482581" elapsed="0.206358"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.689266" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.689024" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.689007" elapsed="0.000394"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:20.689435" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:50:20.478271" elapsed="0.211324"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.474259" elapsed="0.215381"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.474067" elapsed="0.215598"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:50:20.690271" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:20.690165" elapsed="0.000166"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.690392" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.690355" elapsed="0.000077"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.690147" elapsed="0.000308"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.690638" elapsed="0.000024"/>
</kw>
<msg time="2026-04-10T00:50:20.690763" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:50:20.689895" elapsed="0.000894"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.691332" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.690960" elapsed="0.000399"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.691995" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.691517" elapsed="0.000505"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.697624" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.697335" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.698090" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.697827" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:20.705992" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:20.706099" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-inventory-config","LastIndex":40025,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":40025,"LastLogIndex":40025,"LastLeadershipChangeTime":"2026-04-10 00:50:15.798","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"291.1 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":40025,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":3495},"timestamp":1775782220,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:20.706252" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:20.700249" elapsed="0.006030"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.698199" elapsed="0.008123"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.706499" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.706348" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.698181" elapsed="0.008450"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.712262" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":40023,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":-1,"Leader":"member-1-shard-inventory-config","LastIndex":40025,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":40025,"LastLogIndex":40025,"LastLeadershipChangeTime":"2026-04-10 00:50:15.798","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"291.1 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":40025,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":3495},"timestamp":1775782220,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.707911" elapsed="0.004616"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.707608" elapsed="0.005077"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.707590" elapsed="0.005137"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.717389" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.713266" elapsed="0.004343"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.712813" elapsed="0.004930"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.712787" elapsed="0.004996"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.718949" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.718034" elapsed="0.000957"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.719773" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.719144" elapsed="0.000807"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.721207" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.720456" elapsed="0.000793"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.719978" elapsed="0.001371"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.719116" elapsed="0.002258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.722101" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.721537" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.722918" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.722239" elapsed="0.000857"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.724379" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:20.723620" elapsed="0.000801"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.723123" elapsed="0.001400"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.722218" elapsed="0.002346"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:20.724720" elapsed="0.000732"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:20.726208" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.725682" elapsed="0.000552"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.726430" elapsed="0.002770"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:20.707136" elapsed="0.022460"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.729781" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.729672" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.729653" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:20.746284" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:20.729994" elapsed="0.016319"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:20.746365" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:20.746773" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:20.692939" elapsed="0.053865"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:20.746899" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:20.747053" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:50:20.692238" elapsed="0.054841"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.748112" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782220, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:20.747668" elapsed="0.000473"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:20.748189" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:20.748362" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782220, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:20.747306" elapsed="0.001083"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:20.748763" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 40025, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInit...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.748561" elapsed="0.000230"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:20.749143" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.748947" elapsed="0.000222"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:50:20.749220" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:20.749371" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:20.472470" elapsed="0.276926"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:50:20.749453" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:20.749616" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:50:20.471753" elapsed="0.277888"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.749937" elapsed="0.000189"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.749721" elapsed="0.000443"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.750335" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.750188" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.750625" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.750412" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.749703" elapsed="0.001000"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:20.471422" elapsed="0.279305"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:20.179800" elapsed="0.570957"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:20.750800" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:20.750998" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:50:20.751045" level="INFO">${follower_list} = [3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:50:20.174866" elapsed="0.576202"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.751514" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:50:20.751847" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:20.751246" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.752156" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.751941" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.751924" elapsed="0.000308"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.754265" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:50:20.752367" elapsed="0.001945"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:20.754929" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.754518" elapsed="0.000438"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:50:20.755004" elapsed="0.000028"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:50:20.171385" elapsed="0.583771"/>
</kw>
<msg time="2026-04-10T00:50:20.755257" level="INFO">${inv_conf_leader} = 1</msg>
<msg time="2026-04-10T00:50:20.755303" level="INFO">${inv_conf_followers_list} = [3]</msg>
<var>${inv_conf_leader}</var>
<var>${inv_conf_followers_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Get_Leader_And_Followers_For_Shard</arg>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:50:20.170536" elapsed="0.584790"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.755818" level="INFO">config inventory Leader is 1 and followers are [3]</msg>
<arg>config inventory Leader is ${inv_conf_leader} and followers are ${inv_conf_followers_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.755513" elapsed="0.000349"/>
</kw>
<return>
<value>${inv_conf_leader}</value>
<value>${inv_conf_followers_list}</value>
<status status="PASS" start="2026-04-10T00:50:20.755905" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:20.756102" level="INFO">${Inventory_Leader_Post} = 1</msg>
<msg time="2026-04-10T00:50:20.756149" level="INFO">${inventory_followers} = [3]</msg>
<var>${Inventory_Leader_Post}</var>
<var>${inventory_followers}</var>
<arg>${Inventory_Followers}</arg>
<doc>Check Status for Inventory Config shard in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:50:20.169985" elapsed="0.586186"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.756659" level="INFO">${Inventory_Leader_List_Post} = [1]</msg>
<var>${Inventory_Leader_List_Post}</var>
<arg>${Inventory_Leader_Post}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:20.756351" elapsed="0.000334"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:50:20.757041" level="INFO">${Follower_Node_1} = 3</msg>
<var>${Follower_Node_1}</var>
<arg>${Inventory_Followers}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.756860" elapsed="0.000206"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.757582" level="INFO">${Inventory_Followers} = [3]</msg>
<arg>${Inventory_Followers}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:50:20.757253" elapsed="0.000372"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.758104" level="INFO">${Follower_Node_1} = 3</msg>
<arg>${Follower_Node_1}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:50:20.757806" elapsed="0.000338"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.758667" level="INFO">${Inventory_Leader_Post} = 1</msg>
<arg>${Inventory_Leader_Post}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:50:20.758321" elapsed="0.000389"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.759196" level="INFO">${Inventory_Leader_List_Post} = [1]</msg>
<arg>${Inventory_Leader_List_Post}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:50:20.758889" elapsed="0.000348"/>
</kw>
<doc>Find a Leader in the inventory config shard</doc>
<status status="PASS" start="2026-04-10T00:50:19.761217" elapsed="0.998129"/>
</test>
<test id="s1-s2-t6" name="Start Mininet Connect To Follower Node1" line="84">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:50:20.762879" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:50:20.762613" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.764127" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.764018" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.764000" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.769264" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.769158" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.769139" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.770332" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:20.769955" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.770860" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:20.770521" elapsed="0.000365"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:20.770930" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:20.771083" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:20.769576" elapsed="0.001532"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.776536" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.776430" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.776412" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.777808" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.777702" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.777684" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:20.778312" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.778021" elapsed="0.000318"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.778753" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:20.778498" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.816832" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:20.779278" elapsed="0.037732"/>
</kw>
<msg time="2026-04-10T00:50:20.817210" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:50:20.817259" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.778941" elapsed="0.038356"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.896048" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:50:20.817948" elapsed="0.078339"/>
</kw>
<msg time="2026-04-10T00:50:20.896503" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:50:20.896570" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.817519" elapsed="0.079092"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.897035" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.896723" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.896691" elapsed="0.000428"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.897645" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.897266" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.898022" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.897805" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.897787" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:50:20.898137" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:20.900094" elapsed="0.000783"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.901160" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:20.901910" elapsed="0.000354"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:20.899290" elapsed="0.003077"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:20.898717" elapsed="0.003714"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:50:20.777377" elapsed="0.125154"/>
</kw>
<msg time="2026-04-10T00:50:20.902675" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:20.902722" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.776809" elapsed="0.125951"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:50:20.902945" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:20.902839" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.902820" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.903496" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.903857" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.903929" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:50:20.776095" elapsed="0.127943"/>
</kw>
<msg time="2026-04-10T00:50:20.904133" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:20.904176" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.771478" elapsed="0.132735"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.904604" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.904289" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.904273" elapsed="0.000412"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:20.771332" elapsed="0.133376"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.910204" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.910097" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.910078" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.911419" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.911313" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.911296" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:20.911956" level="INFO">${karaf_connection_index} = 131</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.911657" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.912358" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:20.912142" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.913151" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:50:20.912897" elapsed="0.000926">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:50:20.914006" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:50:20.914052" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.912559" elapsed="0.001516"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.915038" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:50:20.914603" elapsed="0.001092">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:50:20.915881" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:50:20.915927" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.914245" elapsed="0.001706"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.916880" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Start Mininet Connect To Follower Node1"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:50:20.916247" elapsed="0.000697">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Start Mininet Connect To Follower Node1"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:50:20.916027" elapsed="0.000988">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Start Mininet Connect To Follower Node1"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:50:20.916009" elapsed="0.001038">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Start Mininet Connect To Follower Node1"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.917210" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.917439" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.917296" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:20.917279" elapsed="0.000281"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.917599" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:20.919044" elapsed="0.000779"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.920102" elapsed="0.000437"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:20.920839" elapsed="0.000346"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:20.918388" elapsed="0.002895"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:20.917859" elapsed="0.003487"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:50:20.911014" elapsed="0.010418">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Start Mininet Connect To Follower Node1"</status>
</kw>
<msg time="2026-04-10T00:50:20.921532" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:50:20.921593" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Start Mininet Connect To Follower Node1"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.910424" elapsed="0.011193"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.921800" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.921695" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.921677" elapsed="0.000189"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.922681" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.922533" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.922516" elapsed="0.000232"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.923032" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:20.922899" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.923580" level="INFO">{1: 88, 2: 131, 3: 92}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.923310" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:20.924018" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:20.923778" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.924639" elapsed="0.000258"/>
</kw>
<msg time="2026-04-10T00:50:20.924996" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:20.925041" level="INFO">${old_connection_index} = 131</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.924218" elapsed="0.000845"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:20.925882" elapsed="0.000191"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.927142" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:50:20.926747" elapsed="0.001239">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.926241" elapsed="0.001847"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:20.928850" elapsed="0.000268"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.928261" elapsed="0.000940"/>
</kw>
<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="PASS" start="2026-04-10T00:50:20.925356" elapsed="0.003891"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:20.925138" elapsed="0.004159"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.925120" elapsed="0.004201"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:20.930175" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.929872" elapsed="0.000329"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:50:20.930292" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:20.930449" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:20.929528" elapsed="0.000946"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.930670" elapsed="0.000571"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.931527" level="INFO">index=136
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:20.931411" 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-04-10T00:50:20.931822" elapsed="0.002337"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.934603" level="INFO">Logging into '10.30.170.169:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:50:20.935695" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</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="FAIL" start="2026-04-10T00:50:20.934327" elapsed="0.001747">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:20.948466" elapsed="0.000502"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.949135" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:20.949435" 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-04-10T00:50:20.936878" elapsed="0.012720"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:20.936348" elapsed="0.013296"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:50:20.922247" elapsed="0.027479">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.950060" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.950134" 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="FAIL" start="2026-04-10T00:50:20.909757" elapsed="0.040481">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<msg time="2026-04-10T00:50:20.950342" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:50:20.950384" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.904985" elapsed="0.045422"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:20.950768" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:20.950482" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.950465" elapsed="0.000381"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:50:20.904840" elapsed="0.046029"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.956643" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.956521" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.956503" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:20.957841" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:20.957735" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:20.957718" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:20.958349" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:20.958053" elapsed="0.000323"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.958956" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:20.958742" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:20.993953" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:20.959522" elapsed="0.034535"/>
</kw>
<msg time="2026-04-10T00:50:20.994220" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:50:20.994266" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.959180" elapsed="0.035123"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:21.076568" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:50:20.994878" elapsed="0.081949"/>
</kw>
<msg time="2026-04-10T00:50:21.077051" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:50:21.077100" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.994477" elapsed="0.082661"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:21.077582" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:21.077252" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:21.077219" elapsed="0.000450"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:21.078180" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:21.077818" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:21.078581" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:21.078344" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:21.078327" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:50:21.078697" elapsed="0.000077"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:21.080501" 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-04-10T00:50:21.081603" elapsed="0.000468"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:21.082341" 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-04-10T00:50:21.079862" elapsed="0.002985"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:21.079048" elapsed="0.003863"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:50:20.957419" elapsed="0.125593"/>
</kw>
<msg time="2026-04-10T00:50:21.083106" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:21.083151" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.956862" elapsed="0.126327"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:50:21.083377" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:21.083268" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:21.083250" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:21.083882" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:21.084223" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:21.084295" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:50:20.956179" elapsed="0.128225"/>
</kw>
<msg time="2026-04-10T00:50:21.084572" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:21.084620" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.951133" elapsed="0.133524"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:21.084985" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:21.084734" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:21.084716" elapsed="0.000345"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:20.950992" elapsed="0.134093"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:20.771161" elapsed="0.313955"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:50:20.768800" elapsed="0.316374"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:50:20.763732" elapsed="0.321501"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:20.763293" elapsed="0.321988"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:50:20.760228" elapsed="0.325109"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:21.088383" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:21.088157" elapsed="0.000272"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:21.090993" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:21.090700" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:21.090681" elapsed="0.000392"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:21.091354" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:21.091221" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:21.092028" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:21.091650" elapsed="0.000425"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:21.092610" level="INFO">${conn_id} = 139</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:21.092232" elapsed="0.000405"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:21.093516" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:50:21.093611" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:21.093245" elapsed="0.000391"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:21.093793" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:50:21.094995" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:50:21.799250" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:50:21 UTC 2026

  System load:  0.08               Processes:             184
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:16 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:50:21.094648" elapsed="0.704757"/>
</kw>
<msg time="2026-04-10T00:50:21.799493" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:21.094277" elapsed="0.705315"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:50:21.092852" elapsed="0.706854"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:50:21.800268" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:50:23.029129" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:50:23.029498" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:50:23.029605" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:50:21.800028" elapsed="1.229608"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:23.029960" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:23.031006" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:23.030642" 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-04-10T00:50:23.031331" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:23.031163" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:23.031132" 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-04-10T00:50:23.031595" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:50:23.031468" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:23.031453" elapsed="0.000240"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:50:23.031729" elapsed="0.000228"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:23.035133" elapsed="0.000351"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:23.035671" elapsed="0.000193"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:23.036017" elapsed="0.000100"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:23.032421" elapsed="0.003749"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:50:21.090054" elapsed="1.946212"/>
</kw>
<msg time="2026-04-10T00:50:23.036330" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:21.089493" elapsed="1.946895"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:50:21.089004" elapsed="1.947466"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:23.038623" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:23.038328" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:23.038311" elapsed="0.000395"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:23.039011" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:23.038862" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:23.039698" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:23.039300" elapsed="0.000458"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:23.040293" level="INFO">${conn_id} = 141</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:23.039919" elapsed="0.000400"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:23.041325" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:50:23.041402" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:23.041037" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:23.041602" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:50:23.042996" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:50:23.416395" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:50:21 UTC 2026

  System load:  0.08               Processes:             184
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:50:21 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:50:23.042459" elapsed="0.374136"/>
</kw>
<msg time="2026-04-10T00:50:23.416693" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:23.042097" elapsed="0.374690"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:50:23.040636" elapsed="0.376287"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:50:23.417437" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:50:23.450217" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:50:23.450361" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:50:23.450405" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:50:23.417188" elapsed="0.033240"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:23.450669" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:23.451649" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:23.451302" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:50:23.451955" elapsed="0.000056"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:23.451791" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:23.451760" elapsed="0.000314"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:50:23.452237" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:50:23.452128" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:23.452112" elapsed="0.000219"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:50:23.452366" elapsed="0.000014"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:23.455375" elapsed="0.000343"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:23.455885" elapsed="0.000185"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:23.456220" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:23.452731" elapsed="0.003646"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:50:23.037798" elapsed="0.418672"/>
</kw>
<msg time="2026-04-10T00:50:23.456526" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:23.037181" elapsed="0.419414"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:50:23.036671" elapsed="0.420007"/>
</kw>
<arg>${mininet}</arg>
<status status="PASS" start="2026-04-10T00:50:21.088648" elapsed="2.368092"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:23.461807" level="INFO">${tools_connection} = 143</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:23.461422" elapsed="0.000411"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:23.463685" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:50:23.463762" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:23.463390" elapsed="0.000395"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:23.463944" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:50:23.465135" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:50:23.783911" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:50:21 UTC 2026

  System load:  0.08               Processes:             184
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:50:23 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:50:23.464819" elapsed="0.319440"/>
</kw>
<msg time="2026-04-10T00:50:23.784423" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:23.464447" elapsed="0.320154"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:50:23.462910" elapsed="0.321962"/>
</kw>
<msg time="2026-04-10T00:50:23.785021" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:23.462495" elapsed="0.322661"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:50:23.462109" elapsed="0.323232"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-10T00:50:23.785429" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:50:23.785768" level="INFO">${mininet_conn_id} = 143</msg>
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-10T00:50:23.460934" elapsed="0.324874"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:23.786826" level="INFO">${mininet_conn_id} = 143</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:50:23.786200" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:23.790334" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:23.787028" elapsed="0.003391"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:23.786986" elapsed="0.003469"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:23.791141" level="INFO">Start mininet --topo linear,1 to 10.30.171.151</msg>
<arg>Start mininet ${options} to ${controller}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:23.790704" elapsed="0.000505"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:23.794179" level="INFO">sudo mn --controller 'remote,ip=10.30.171.151,port=6633' --topo linear,1 --switch ovsk,protocols=OpenFlow13</msg>
<arg>sudo mn --controller 'remote,ip=${controller},port=${ofport}' ${options} --switch ovsk,protocols=OpenFlow${ofversion}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:23.791460" elapsed="0.002783"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:50:23.913351" level="INFO">[?2004l*** Creating network
*** Adding controller
*** Adding hosts:
h1 
*** Adding switches:
s1 
*** Adding links:
(h1, s1) 
*** Configuring hosts
h1 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:50:23.794416" elapsed="0.119106"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:23.914375" level="INFO">Check OVS configuratiom</msg>
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:23.913903" elapsed="0.000535"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:23.916088" level="INFO">sh ovs-vsctl show</msg>
<arg>sh ovs-vsctl show</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:23.914690" elapsed="0.001475"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:50:23.923844" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Bridge s1
        Controller "ptcp:6654"
        Controller "tcp:10.30.171.151:6633"
        fail_mode: secure
        Port s1
            Interface s1
                type: internal
        Port s1-eth1
            Interface s1-eth1
    ovs_version: "2.17.11"
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:50:23.916439" elapsed="0.007507"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="PASS" start="2026-04-10T00:50:23.924014" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T00:50:23.924335" level="INFO">${mininet_conn_id} = 143</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${Follower_Node_1}_IP}</arg>
<arg>--topo linear,${switch_count}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="PASS" start="2026-04-10T00:50:21.085661" elapsed="2.838703"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:23.925082" level="INFO">${mininet_conn_id} = 143</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:50:23.924675" elapsed="0.000449"/>
</kw>
<doc>Start mininet with connection to Follower Node1</doc>
<status status="PASS" start="2026-04-10T00:50:20.759689" elapsed="3.165685"/>
</test>
<test id="s1-s2-t7" name="Add Bulk Flow From Follower" line="92">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:50:23.929092" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:50:23.928820" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:23.930469" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:23.930331" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:23.930306" 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-04-10T00:50:23.935965" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:23.935853" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:23.935833" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:23.937167" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:23.936771" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:23.937679" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:23.937357" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:23.937750" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:23.937908" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:23.936359" elapsed="0.001574"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:23.943371" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:23.943264" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:23.943245" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:23.944930" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:23.944806" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:23.944785" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:23.945537" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:23.945150" elapsed="0.000451"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:23.946187" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:23.945840" elapsed="0.000386"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:23.984537" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:23.946991" elapsed="0.037733"/>
</kw>
<msg time="2026-04-10T00:50:23.984944" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:50:23.985004" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:23.946466" elapsed="0.038587"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:24.062245" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:50:23.985755" elapsed="0.076764"/>
</kw>
<msg time="2026-04-10T00:50:24.062794" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:50:24.062842" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:23.985280" elapsed="0.077599"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.063344" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:24.063000" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.062966" elapsed="0.000467"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.064020" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:24.063612" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.064616" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:24.064342" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.064263" elapsed="0.000437"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:50:24.064738" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:24.067617" elapsed="0.000160"/>
</kw>
<msg time="2026-04-10T00:50:24.067842" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:24.066365" elapsed="0.001625"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.068514" elapsed="0.000109"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.068935" 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-04-10T00:50:24.065669" elapsed="0.003483"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:24.065066" elapsed="0.004154"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:50:23.944209" elapsed="0.125110"/>
</kw>
<msg time="2026-04-10T00:50:24.069412" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:24.069456" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:23.943608" elapsed="0.125884"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:50:24.069696" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:24.069587" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.069567" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.070187" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.070525" elapsed="0.000041"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:24.070620" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:50:23.942925" elapsed="0.127804"/>
</kw>
<msg time="2026-04-10T00:50:24.070821" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:24.070864" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:23.938316" elapsed="0.132583"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.071223" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:24.070974" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.070957" elapsed="0.000341"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:23.938168" elapsed="0.133153"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:24.077950" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:24.077792" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.077766" elapsed="0.000284"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:24.079821" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:24.079657" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.079629" elapsed="0.000295"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:24.080724" level="INFO">${karaf_connection_index} = 136</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:24.080174" elapsed="0.000590"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:24.081341" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:24.081003" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:24.082211" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:50:24.081908" elapsed="0.001131">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:50:24.083258" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:50:24.083305" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:24.081532" elapsed="0.001797"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:24.084139" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:50:24.083882" elapsed="0.001029">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:50:24.085115" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:50:24.085162" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:24.083502" elapsed="0.001703"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.086221" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Add Bulk Flow From Follower"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:50:24.085522" elapsed="0.000767">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Add Bulk Flow From Follower"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:50:24.085291" elapsed="0.001070">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Add Bulk Flow From Follower"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:50:24.085272" elapsed="0.001293">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Add Bulk Flow From Follower"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.086737" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.086968" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:24.086826" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:24.086808" elapsed="0.000234"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:50:24.087075" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:24.089883" elapsed="0.000155"/>
</kw>
<msg time="2026-04-10T00:50:24.090104" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:24.088705" elapsed="0.001541"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.090573" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.090946" elapsed="0.000085"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:24.087926" elapsed="0.003225"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:24.087353" elapsed="0.003864"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:50:24.079155" elapsed="0.012159">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Add Bulk Flow From Follower"</status>
</kw>
<msg time="2026-04-10T00:50:24.091420" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:50:24.091467" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Add Bulk Flow From Follower"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:24.078295" elapsed="0.013197"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:24.091713" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:24.091600" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.091580" elapsed="0.000203"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:24.092718" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:24.092521" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.092504" elapsed="0.000283"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:24.093079" level="INFO">index=143
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:24.092942" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.093706" level="INFO">{1: 88, 2: 136, 3: 92}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:24.093417" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.094164" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:24.093912" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:24.094780" elapsed="0.000305"/>
</kw>
<msg time="2026-04-10T00:50:24.095188" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:24.095235" level="INFO">${old_connection_index} = 136</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:24.094380" elapsed="0.000879"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:24.096144" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:24.098020" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:50:24.097303" elapsed="0.001728">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:24.096793" elapsed="0.002347"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:24.099842" elapsed="0.000332"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:24.099315" elapsed="0.000967"/>
</kw>
<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="PASS" start="2026-04-10T00:50:24.095623" elapsed="0.004742"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:24.095339" elapsed="0.005079"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.095320" elapsed="0.005124"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:24.101354" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:24.101043" elapsed="0.000338"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:50:24.101429" elapsed="0.000215"/>
</return>
<msg time="2026-04-10T00:50:24.101777" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:24.100706" elapsed="0.001095"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:24.101957" elapsed="0.000425"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:24.102700" level="INFO">index=144
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:24.102569" elapsed="0.000287"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:50:24.103014" elapsed="0.004519"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:50:24.108006" level="INFO">Logging into '10.30.170.169:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:50:24.109145" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</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="FAIL" start="2026-04-10T00:50:24.107731" elapsed="0.001810">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:24.126334" elapsed="0.000482"/>
</kw>
<msg time="2026-04-10T00:50:24.126913" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:24.124783" elapsed="0.002293"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.127240" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.127401" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:24.110447" elapsed="0.017038"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:24.109877" elapsed="0.017654"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:50:24.092177" elapsed="0.035551">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.128080" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:24.128154" 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="FAIL" start="2026-04-10T00:50:24.077265" elapsed="0.050995">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<msg time="2026-04-10T00:50:24.128397" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:50:24.128440" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:24.071627" elapsed="0.056836"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.129081" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:24.128821" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.128526" elapsed="0.000632"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:50:24.071454" elapsed="0.057728"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:24.134950" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:24.134844" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.134825" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:24.136158" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:24.136050" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.136033" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:24.136731" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:24.136393" elapsed="0.000365"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:24.137139" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:24.136915" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:24.173702" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:24.137674" elapsed="0.036153"/>
</kw>
<msg time="2026-04-10T00:50:24.174010" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:50:24.174056" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:24.137322" elapsed="0.036771"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:24.242884" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:50:24.174673" elapsed="0.068488"/>
</kw>
<msg time="2026-04-10T00:50:24.243419" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:50:24.243469" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:24.174280" elapsed="0.069227"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.244002" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:24.243664" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.243627" elapsed="0.000465"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.244678" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:24.244242" elapsed="0.000525"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.245060" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:24.244836" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.244818" elapsed="0.000394"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:50:24.245251" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:24.248458" elapsed="0.000201"/>
</kw>
<msg time="2026-04-10T00:50:24.248734" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:24.247177" elapsed="0.001708"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.249183" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.249561" 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-04-10T00:50:24.246464" elapsed="0.003305"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:24.245591" elapsed="0.004246"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:50:24.135750" elapsed="0.114187"/>
</kw>
<msg time="2026-04-10T00:50:24.250035" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:24.250080" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:24.135169" elapsed="0.114950"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:50:24.250322" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:50:24.250207" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.250185" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.250855" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.251197" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:24.251270" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:50:24.134367" elapsed="0.117013"/>
</kw>
<msg time="2026-04-10T00:50:24.251476" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:24.251520" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:24.129452" elapsed="0.122136"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.251920" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:24.251667" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.251650" elapsed="0.000349"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:24.129310" elapsed="0.122713"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:23.937990" elapsed="0.314068"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:50:23.935458" elapsed="0.316657"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:50:23.930017" elapsed="0.322157"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:23.929522" elapsed="0.322697"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:50:23.926475" elapsed="0.325797"/>
</kw>
<kw name="Add Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Add Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.263430" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:24.263078" elapsed="0.000379"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:24.263503" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:24.263673" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:24.262724" elapsed="0.000973"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.277826" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:24.277496" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.278279" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:24.278038" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.278742" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:24.278478" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.279175" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:24.278936" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:24.280047" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:50:24.279841" elapsed="0.000233"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:50:24.280422" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:50:24.280228" elapsed="0.000221"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:50:24.280616" elapsed="0.000202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.281218" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:24.280974" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:50:24.281305" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:24.281465" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:50:24.279420" elapsed="0.002070"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:24.316907" level="INFO">POST Request : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Content-Length': '403', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:50:24.317016" level="INFO">POST Response : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:24.317214" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:24.283722" elapsed="0.033548"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:24.281585" elapsed="0.035787"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.317806" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:24.317433" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.281564" elapsed="0.036437"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.325779" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:24.320348" elapsed="0.005475"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:24.319853" elapsed="0.006006"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.319813" elapsed="0.006071"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.328633" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:24.326164" elapsed="0.002516"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:24.325940" elapsed="0.002774"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.325923" elapsed="0.002815"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.329321" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:24.328918" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.329713" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:24.329419" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.330274" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:24.329967" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:24.329800" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.329401" elapsed="0.000957"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.330992" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:24.330519" elapsed="0.000500"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.331322" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:24.331089" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.331879" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:24.331580" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:24.331403" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.331071" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:24.332117" elapsed="0.000579"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:24.333167" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:24.332867" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:24.333351" elapsed="0.002406"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:24.318820" elapsed="0.017003"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:24.336001" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:24.335896" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.335878" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:24.339013" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:24.336214" elapsed="0.002827"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:24.339100" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:24.339262" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:24.274758" elapsed="0.064528"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:24.339353" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:24.339501" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:50:24.271898" elapsed="0.067627"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:24.339596" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:24.339743" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:24.262264" elapsed="0.077503"/>
</kw>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Add Bulk Flow in member 3 according to ${json_body_add}.</doc>
<status status="PASS" start="2026-04-10T00:50:24.257771" elapsed="0.082059"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.347520" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:24.347168" elapsed="0.000412"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:24.347635" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:24.347813" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:24.346663" elapsed="0.001177"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.355355" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:24.355094" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.355822" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:24.355575" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:24.362501" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:24.362635" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:24 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:24 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782224,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:24.362732" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:24.358047" elapsed="0.004712"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:24.355936" elapsed="0.006866"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.362984" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:24.362830" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.355918" elapsed="0.007153"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.367124" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782224,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:24.364092" elapsed="0.003103"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:24.363869" elapsed="0.003378"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.363851" elapsed="0.003433"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.371406" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:24.367717" elapsed="0.003756"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:24.367368" elapsed="0.004156"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.367343" elapsed="0.004237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.372382" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:24.371831" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.372942" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:24.372590" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.373619" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:24.373300" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:24.373061" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.372561" elapsed="0.001141"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.374220" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:24.373862" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.374565" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:24.374316" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.375100" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:24.374807" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:24.374646" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.374299" elapsed="0.000882"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:24.375332" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:24.376133" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:24.375856" elapsed="0.000303"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:24.376312" elapsed="0.002473"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:24.363433" elapsed="0.015414"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:24.379021" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:50:24.378916" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:24.378898" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:24.379255" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:24.379325" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:24.381668" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782224,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:24.348246" elapsed="0.033483"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:24.381784" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:24.381936" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782224,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:24.346114" elapsed="0.035847"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.382936" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782224, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:24.382518" elapsed="0.000447"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:24.383013" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:24.383166" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782224, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:24.382181" elapsed="0.001010"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:24.383564" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:24.383369" elapsed="0.000221"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.384068" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:24.383768" elapsed="0.000326"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.384559" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:24.384266" elapsed="0.000320"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:24.385133" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:24.384762" elapsed="0.000443">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:24.341207" elapsed="0.044109">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:25.396046" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:25.395527" elapsed="0.000563"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:25.396169" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:50:25.396399" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:25.395021" elapsed="0.001414"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:25.404581" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:25.404304" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:25.405058" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:25.404790" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:25.413315" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:25.413493" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:25 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:25 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782225,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:25.413810" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:25.407412" elapsed="0.006464"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:25.405176" elapsed="0.008822"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:25.414524" elapsed="0.000089"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:25.414076" elapsed="0.000638"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:25.405155" elapsed="0.009609"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:25.423016" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782225,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:25.417616" elapsed="0.005460"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:25.416954" elapsed="0.006286"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:25.416904" elapsed="0.006366"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:25.426093" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:25.423589" elapsed="0.002567"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:25.423332" elapsed="0.002861"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:25.423313" elapsed="0.002904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:25.426861" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:25.426423" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:25.427211" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:25.426965" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:25.427826" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:25.427463" elapsed="0.000391"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:25.427295" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:25.426946" elapsed="0.000966"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:25.428447" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:25.428076" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:25.428805" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:25.428564" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:25.429429" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:25.429124" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:25.428909" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:25.428528" elapsed="0.000987"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:25.429692" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:25.430673" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:25.430326" elapsed="0.000374"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:25.430862" elapsed="0.003054"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:25.415693" elapsed="0.018295"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:25.434185" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T00:50:25.434061" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:25.434042" elapsed="0.000255"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:25.434497" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:25.434612" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:50:25.437126" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782225,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:25.396937" elapsed="0.040221"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:25.437215" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:25.437372" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782225,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:25.394333" elapsed="0.043065"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:25.438447" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782225, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:25.438019" elapsed="0.000457"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:25.438526" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:50:25.438703" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782225, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:25.437659" elapsed="0.001119"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:25.439165" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:25.438966" elapsed="0.000226"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:25.439701" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:25.439373" elapsed="0.000355"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:25.440182" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:25.439904" elapsed="0.000304"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:25.440759" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:25.440386" elapsed="0.000449">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:25.386268" elapsed="0.054684">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.449839" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:26.449329" elapsed="0.000554"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:26.449959" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:50:26.450172" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:26.448844" elapsed="0.001361"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.459504" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.459141" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.460011" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.459757" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:26.466943" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:26.467011" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:26 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:26 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782226,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:26.467141" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:26.462331" elapsed="0.004845"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:26.460142" elapsed="0.007086"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.467468" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.467262" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.460117" elapsed="0.007501"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.472844" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782226,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.469231" elapsed="0.003693"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:26.468878" elapsed="0.004103"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.468850" elapsed="0.004167"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.476986" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.473443" elapsed="0.003616"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:26.473104" elapsed="0.004007"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.473078" elapsed="0.004068"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.478151" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:26.477424" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.478598" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.478298" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.479246" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:26.478851" elapsed="0.000423"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:26.478684" elapsed="0.000708"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.478270" elapsed="0.001147"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.479987" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:26.479610" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.480326" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.480087" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.480888" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:26.480585" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:26.480407" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.480069" elapsed="0.000905"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:26.481142" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:26.482062" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:26.481737" elapsed="0.000352"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:26.482250" elapsed="0.002827"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:26.468205" elapsed="0.016949"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:26.485356" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:50:26.485238" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.485216" 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-04-10T00:50:26.485685" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:26.485771" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:50:26.488175" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782226,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:26.450688" elapsed="0.037518"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:26.488261" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:26.488418" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782226,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:26.447985" elapsed="0.040459"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.489655" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782226, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:26.489127" elapsed="0.000564"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:26.489749" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:26.489933" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782226, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:26.488717" elapsed="0.001246"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:26.490341" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:26.490152" elapsed="0.000215"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.490877" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:26.490563" elapsed="0.000341"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.491348" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:26.491079" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:50:26.491569" elapsed="0.000321"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:50:26.441755" elapsed="0.050198"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:50:24.340612" elapsed="2.151398"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 3.</doc>
<status status="PASS" start="2026-04-10T00:50:24.340087" elapsed="2.151989"/>
</kw>
<arg>${temp_json_config_add}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Add Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:50:24.257235" elapsed="2.234985"/>
</kw>
<doc>10000 Flows added via Follower Node1 and verify it gets applied in all instances.</doc>
<status status="PASS" start="2026-04-10T00:50:23.925843" elapsed="2.566505"/>
</test>
<test id="s1-s2-t8" name="Get Bulk Flows And Verify In Leader" line="96">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:50:26.496354" elapsed="0.000259"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:50:26.496069" elapsed="0.000609"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:26.497854" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:26.497696" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.497668" elapsed="0.000263"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:26.503392" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:26.503251" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.503227" elapsed="0.000250"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.504678" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:26.504212" elapsed="0.000496"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.505211" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:26.504876" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:26.505283" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:50:26.505450" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:26.503786" elapsed="0.001689"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:26.511392" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:26.511254" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.511230" elapsed="0.000247"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:26.512930" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:26.512819" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.512801" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:26.513492" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:26.513156" elapsed="0.000365"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:26.514057" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:26.513778" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:26.551450" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:26.514640" elapsed="0.037071"/>
</kw>
<msg time="2026-04-10T00:50:26.551973" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:50:26.552047" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.514253" elapsed="0.037835"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:26.629143" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "A "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:50:26.552865" elapsed="0.076616"/>
</kw>
<msg time="2026-04-10T00:50:26.629887" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:50:26.629959" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.552348" elapsed="0.077670"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.630705" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.630203" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.630146" elapsed="0.000696"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.631782" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "A "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.631192" elapsed="0.000734"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.632377" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.632034" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.632005" elapsed="0.000504"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:50:26.632592" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:26.636525" elapsed="0.000199"/>
</kw>
<msg time="2026-04-10T00:50:26.636801" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:26.635053" elapsed="0.001907"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.637267" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.637694" elapsed="0.000089"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:26.634102" elapsed="0.003812"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:26.633106" elapsed="0.004881"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:50:26.512466" elapsed="0.125626"/>
</kw>
<msg time="2026-04-10T00:50:26.638197" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:26.638241" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.511717" elapsed="0.126561"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:50:26.638505" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:50:26.638375" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.638349" elapsed="0.000290"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.639105" elapsed="0.000031"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.639461" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:26.639535" elapsed="0.000034"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:50:26.510817" elapsed="0.128859"/>
</kw>
<msg time="2026-04-10T00:50:26.639777" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:26.639822" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.505972" elapsed="0.133887"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.640202" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.639937" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.639920" elapsed="0.000382"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:26.505790" elapsed="0.134545"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:26.646247" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:26.646134" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.646113" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:26.647851" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:26.647739" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.647721" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:26.648468" level="INFO">${karaf_connection_index} = 144</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:26.648070" elapsed="0.000433"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:26.649086" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:26.648833" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:26.650178" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:50:26.649696" elapsed="0.001228">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:50:26.651133" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:50:26.651180" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.649281" elapsed="0.001923"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:26.652032" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:50:26.651771" elapsed="0.000981">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:50:26.652954" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:50:26.653000" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.651379" elapsed="0.001646"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.654109" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Get Bulk Flows And Verify In Leader"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:50:26.653328" elapsed="0.000865">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Get Bulk Flows And Verify In Leader"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:50:26.653103" elapsed="0.001168">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Get Bulk Flows And Verify In Leader"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:50:26.653083" elapsed="0.001221">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Get Bulk Flows And Verify In Leader"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.654474" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.654800" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.654608" elapsed="0.000263"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:26.654583" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:50:26.654943" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:26.657849" elapsed="0.000162"/>
</kw>
<msg time="2026-04-10T00:50:26.658080" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:26.656513" elapsed="0.001718"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.658533" elapsed="0.000196"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.659017" elapsed="0.000086"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:26.655827" elapsed="0.003398"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:26.655227" elapsed="0.004067"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:50:26.647387" elapsed="0.011995">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Get Bulk Flows And Verify In Leader"</status>
</kw>
<msg time="2026-04-10T00:50:26.659484" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:50:26.659528" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Get Bulk Flows And Verify In Leader"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.646522" elapsed="0.013046"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:26.659772" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:26.659658" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.659635" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:26.660658" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:26.660533" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.660516" elapsed="0.000209"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:26.661017" level="INFO">index=143
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:26.660880" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.661633" level="INFO">{1: 88, 2: 144, 3: 92}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.661350" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.662124" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.661878" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:26.662812" elapsed="0.000298"/>
</kw>
<msg time="2026-04-10T00:50:26.663210" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:26.663256" level="INFO">${old_connection_index} = 144</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.662327" elapsed="0.000952"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:26.664114" elapsed="0.000209"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:26.665624" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:50:26.665002" elapsed="0.001671">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.664492" elapsed="0.002288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:26.667450" elapsed="0.000333"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.666957" elapsed="0.000917"/>
</kw>
<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="PASS" start="2026-04-10T00:50:26.663595" elapsed="0.004326"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:26.663356" elapsed="0.004615"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.663338" elapsed="0.004658"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:26.668917" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:26.668538" elapsed="0.000406"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:50:26.668994" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:26.669149" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:26.668206" elapsed="0.000967"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:26.669330" elapsed="0.000479"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:26.670105" level="INFO">index=145
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:26.669986" elapsed="0.000245"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:50:26.670383" elapsed="0.002607"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:50:26.673518" level="INFO">Logging into '10.30.170.169:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:50:26.674915" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</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="FAIL" start="2026-04-10T00:50:26.673199" elapsed="0.002110">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:26.691443" elapsed="0.000471"/>
</kw>
<msg time="2026-04-10T00:50:26.692022" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:26.689883" elapsed="0.002313"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.692362" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.692528" elapsed="0.000402"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:26.676158" elapsed="0.016909"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:26.675628" elapsed="0.017491"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:50:26.660239" elapsed="0.032969">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.693623" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:26.693737" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-10T00:50:26.645698" elapsed="0.048159">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<msg time="2026-04-10T00:50:26.693977" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:50:26.694021" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.640693" elapsed="0.053351"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.694399" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.694133" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.694113" elapsed="0.000366"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:50:26.640505" elapsed="0.053999"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:26.702658" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:26.702520" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.702500" 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-04-10T00:50:26.703913" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:26.703806" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.703789" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:26.704454" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:26.704128" elapsed="0.000353"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:26.704887" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:26.704658" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:26.737665" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:26.705407" elapsed="0.032484"/>
</kw>
<msg time="2026-04-10T00:50:26.738122" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:50:26.738169" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.705072" elapsed="0.033134"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:26.843950" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "A "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:50:26.738911" elapsed="0.105304"/>
</kw>
<msg time="2026-04-10T00:50:26.844463" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:50:26.844515" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.738450" elapsed="0.106130"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.845027" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.844699" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.844667" elapsed="0.000446"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.845667" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "A "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.845264" elapsed="0.000606"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.846170" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.845943" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.845924" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:50:26.846288" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:26.849238" elapsed="0.000159"/>
</kw>
<msg time="2026-04-10T00:50:26.849462" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:26.847993" elapsed="0.001859"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.850154" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.850532" elapsed="0.000103"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:26.847265" elapsed="0.003495"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:26.846638" elapsed="0.004191"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:50:26.703479" elapsed="0.147448"/>
</kw>
<msg time="2026-04-10T00:50:26.851025" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:26.851071" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.702887" elapsed="0.148221"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:50:26.851299" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:50:26.851188" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.851169" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.851819" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.852166" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:26.852239" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:50:26.702136" elapsed="0.150214"/>
</kw>
<msg time="2026-04-10T00:50:26.852447" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:26.852493" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.694809" elapsed="0.157721"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.852882" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.852627" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.852609" elapsed="0.000350"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:26.694659" elapsed="0.158324"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:26.505536" elapsed="0.347481"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:50:26.502771" elapsed="0.350305"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:50:26.497292" elapsed="0.355844"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:26.496837" elapsed="0.356348"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:50:26.493342" elapsed="0.359899"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.863934" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:26.863511" elapsed="0.000451"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.864427" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:26.864127" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:26.864567" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:50:26.864731" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:26.863126" elapsed="0.001630"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.875275" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:26.874956" elapsed="0.000347"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:26.875352" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:26.875505" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:26.874600" elapsed="0.000931"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.889378" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.889105" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.889961" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.889670" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.890410" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.890164" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.890868" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.890627" elapsed="0.000286"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:26.891754" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:50:26.891523" elapsed="0.000258"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:50:26.892108" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:50:26.891936" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:50:26.892284" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.892902" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.892655" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:50:26.892990" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:50:26.893153" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:50:26.891115" elapsed="0.002063"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:26.931347" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:50:26.931488" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:26.931846" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:26.895590" elapsed="0.036322"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:26.893256" elapsed="0.038778"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.932514" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.932104" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.893236" elapsed="0.039544"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.940960" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.935511" elapsed="0.005541"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:26.934969" elapsed="0.006152"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.934915" elapsed="0.006251"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.946717" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.942026" elapsed="0.004785"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:26.941275" elapsed="0.005802"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.941242" elapsed="0.005891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.948191" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:26.947480" elapsed="0.000751"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.948738" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.948347" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.949565" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:26.949092" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:26.948863" elapsed="0.000794"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.948317" elapsed="0.001370"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.950480" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:26.949957" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.950980" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.950641" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.951773" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:26.951329" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:26.951098" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.950614" elapsed="0.001272"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:26.952111" elapsed="0.000535"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:26.953302" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:26.952892" elapsed="0.000447"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:26.953592" elapsed="0.003540"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:26.933672" elapsed="0.023558"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:26.957492" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:26.957341" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.957313" elapsed="0.000297"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:50:26.960561" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:50:26.957807" elapsed="0.002784"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:50:26.960649" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:50:26.960839" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:26.886341" elapsed="0.074530"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:26.960941" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:26.961096" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:50:26.883668" elapsed="0.077453"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:26.961186" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:50:26.961337" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:26.874124" elapsed="0.087240"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:50:26.869611" elapsed="0.091828"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:26.864945" elapsed="0.096530"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:26.864813" elapsed="0.096699"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.973954" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:26.973604" elapsed="0.000378"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:26.974029" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:26.974181" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:26.973151" elapsed="0.001055"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.981220" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.980953" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.981687" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.981423" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:26.988645" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:26.988705" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:26 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:26 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782226,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:26.988798" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:26.983988" elapsed="0.004837"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:26.981802" elapsed="0.007067"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.989065" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.988897" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.981782" elapsed="0.007373"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.994052" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782226,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.990321" elapsed="0.003805"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:26.990094" elapsed="0.004086"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.990075" elapsed="0.004141"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.998440" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:26.994662" elapsed="0.003829"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:26.994303" elapsed="0.004223"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.994277" elapsed="0.004296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:26.999143" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:26.998751" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:26.999481" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:26.999242" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:27.000084" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:26.999777" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:26.999603" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:26.999223" elapsed="0.000947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:27.000719" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:27.000331" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:27.001054" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:27.000816" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:27.001616" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:27.001299" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:27.001137" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:27.000799" elapsed="0.000900"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:27.001877" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:27.002787" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:27.002476" elapsed="0.000338"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:27.002981" elapsed="0.002545"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:26.989586" elapsed="0.016023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:27.005791" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:50:27.005681" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:27.005663" elapsed="0.000257"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:27.006103" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:27.006184" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:27.008529" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782226,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:26.974576" elapsed="0.033995"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:27.008627" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:27.008780" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782226,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:26.972688" elapsed="0.036118"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:27.009821" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782226, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:27.009370" elapsed="0.000504"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:27.009926" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:27.010085" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782226, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:27.009029" elapsed="0.001082"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:27.010475" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:27.010292" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:27.010999" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:27.010693" elapsed="0.000331"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:27.011482" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:27.011213" elapsed="0.000294"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:27.012049" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:27.011697" elapsed="0.000428">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:26.967771" elapsed="0.044479">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:28.021573" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:28.021024" elapsed="0.000596"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:28.021701" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T00:50:28.021965" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:28.020421" elapsed="0.001595"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:28.029484" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:28.029216" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:28.029962" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:28.029710" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:28.036755" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:28.036894" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:28 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782228,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:28.036993" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:28.032221" elapsed="0.004798"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:28.030082" elapsed="0.006980"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:28.037251" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:28.037091" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:28.030060" elapsed="0.007279"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:28.040993" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782228,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:28.038427" elapsed="0.002616"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:28.038170" elapsed="0.002908"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:28.038152" elapsed="0.002950"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:28.044214" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:28.041385" elapsed="0.002895"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:28.041160" elapsed="0.003163"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:28.041143" elapsed="0.003211"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:28.045086" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:28.044619" elapsed="0.000494"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:28.045451" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:28.045194" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:28.046050" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:28.045735" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:28.045537" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:28.045174" elapsed="0.000963"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:28.046748" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:28.046304" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:28.047088" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:28.046848" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:28.047662" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:28.047334" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:28.047170" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:28.046830" elapsed="0.000916"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:28.047911" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:28.048794" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:28.048437" elapsed="0.000391"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:28.048991" elapsed="0.002832"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:28.037737" elapsed="0.014161"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:28.052088" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:50:28.051974" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:28.051955" 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-04-10T00:50:28.052342" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:28.052413" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:28.054778" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782228,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:28.022644" elapsed="0.032225"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:28.054925" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:28.055082" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782228,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:28.019718" elapsed="0.035391"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:28.056351" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782228, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:28.055823" elapsed="0.000564"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:28.056449" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:28.056630" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782228, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:28.055356" elapsed="0.001303"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:28.057099" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:28.056883" elapsed="0.000242"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:28.057634" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:28.057306" elapsed="0.000356"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:28.058102" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:28.057837" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:28.058725" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:28.058301" elapsed="0.000498">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:28.012942" elapsed="0.045971">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:29.070468" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:29.069897" elapsed="0.000617"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:29.070618" elapsed="0.000059"/>
</return>
<msg time="2026-04-10T00:50:29.070860" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:29.069345" elapsed="0.001551"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:29.077965" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:29.077680" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:29.078429" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:29.078177" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:30.033315" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:30.033494" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:30 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782230,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:30.033861" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:29.080796" elapsed="0.953136"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:29.078573" elapsed="0.955479"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:30.034675" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:30.034131" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:29.078531" elapsed="0.956420"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:30.042111" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782230,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:30.037970" elapsed="0.004194"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:30.037347" elapsed="0.004941"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:30.037300" elapsed="0.005016"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:30.045268" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:30.042632" elapsed="0.002685"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:30.042378" elapsed="0.002975"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:30.042360" elapsed="0.003018"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:30.045991" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:30.045581" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:30.046334" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:30.046091" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:30.046914" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:30.046602" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:30.046417" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:30.046073" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:30.047674" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:30.047160" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:30.048023" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:30.047778" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:30.048624" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:30.048293" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:30.048125" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:30.047758" elapsed="0.000953"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:30.048871" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:30.049745" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:30.049394" elapsed="0.000378"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:30.049932" elapsed="0.002722"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:30.036150" elapsed="0.016575"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:30.052911" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-10T00:50:30.052798" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:30.052779" elapsed="0.000267"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:30.053203" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:30.053276" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:30.055792" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782230,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:29.071458" elapsed="0.984366"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:30.055879" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:30.056034" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782230,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:29.068523" elapsed="0.987538"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:30.057200" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782230, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:30.056732" elapsed="0.000505"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:30.057297" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:30.057472" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782230, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:30.056335" elapsed="0.001388"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:30.058140" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:30.057935" elapsed="0.000237"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:30.058727" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:30.058371" elapsed="0.000384"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:30.059202" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:30.058932" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:30.059908" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:30.059410" elapsed="0.000577">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:29.059913" elapsed="1.000192">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:31.070608" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:31.070086" elapsed="0.000566"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:31.070730" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:50:31.070960" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:31.069582" elapsed="0.001414"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:31.079642" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:31.079362" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:31.080122" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:31.079849" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:31.086686" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:31.086748" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:31 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:31 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782231,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:31.086843" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:31.082360" elapsed="0.004510"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:31.080242" elapsed="0.006672"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:31.087099" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:31.086942" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:31.080220" elapsed="0.006966"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:31.090738" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782231,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:31.088244" elapsed="0.002543"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:31.088016" elapsed="0.002807"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:31.087974" elapsed="0.002873"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:31.094203" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:31.091129" elapsed="0.003143"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:31.090903" elapsed="0.003417"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:31.090887" elapsed="0.003469"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:31.095168" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:31.094622" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:31.095674" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:31.095307" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:31.096464" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:31.096039" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:31.095794" elapsed="0.001000"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:31.095281" elapsed="0.001563"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:31.097969" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:31.097151" elapsed="0.000864"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:31.098466" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:31.098124" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:31.099273" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:31.098850" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:31.098618" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:31.098096" elapsed="0.001295"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:31.099643" elapsed="0.000514"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:31.100816" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:31.100391" elapsed="0.000462"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:31.101071" elapsed="0.003444"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:31.087568" elapsed="0.017059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:31.104815" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:50:31.104701" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:31.104682" elapsed="0.000229"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:31.105063" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:31.105135" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:31.107446" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782231,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:31.071481" elapsed="0.035993"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:31.107527" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:50:31.107719" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782231,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:31.068907" elapsed="0.038848"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:31.108879" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782231, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:31.108461" elapsed="0.000446"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:31.108957" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:31.109110" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782231, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:31.108086" elapsed="0.001049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:31.109491" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:31.109312" elapsed="0.000204"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:31.110013" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:31.109707" elapsed="0.000333"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:31.110471" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:31.110211" elapsed="0.000285"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:31.111032" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:31.110683" elapsed="0.000420">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:31.061094" elapsed="0.050122">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:32.125500" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:32.124954" elapsed="0.000711"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:32.125755" elapsed="0.000083"/>
</return>
<msg time="2026-04-10T00:50:32.126058" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:32.124224" elapsed="0.001898"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:32.134680" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:32.134345" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:32.135210" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:32.134915" elapsed="0.000343"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:32.142970" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:32.143039" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:32 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:32 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782232,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:32.143162" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:32.138037" elapsed="0.005153"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:32.135343" elapsed="0.007902"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:32.143452" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:32.143278" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:32.135321" elapsed="0.008242"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:32.147540" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782232,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:32.144813" elapsed="0.002832"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:32.144497" elapsed="0.003188"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:32.144476" elapsed="0.003235"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:32.151113" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:32.148009" elapsed="0.003175"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:32.147773" elapsed="0.003463"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:32.147755" elapsed="0.003517"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:32.152326" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:32.151537" elapsed="0.000831"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:32.153087" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:32.152479" elapsed="0.000710"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:32.153989" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:32.153472" elapsed="0.000559"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:32.153226" elapsed="0.000866"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:32.152450" elapsed="0.001679"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:32.154952" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:32.154374" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:32.155447" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:32.155096" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:32.156275" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:32.155835" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:32.155591" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:32.155070" elapsed="0.001328"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:32.156799" elapsed="0.000734"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:32.158300" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:32.157826" elapsed="0.000594"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:32.158685" elapsed="0.004262"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:32.144017" elapsed="0.019036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:32.163383" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-10T00:50:32.163200" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:32.163167" elapsed="0.000357"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:32.163793" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:32.163902" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:50:32.167912" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782232,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:32.126687" elapsed="0.041280"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:32.168050" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:50:32.168289" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782232,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:32.123357" elapsed="0.044972"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:32.170181" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782232, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:32.169688" elapsed="0.000524"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:32.170265" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:50:32.170427" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782232, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:32.168967" elapsed="0.001487"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:32.170896" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:32.170656" elapsed="0.000268"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:32.171481" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:32.171124" elapsed="0.000384"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:32.171974" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:32.171704" elapsed="0.000296"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:32.172639" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:32.172192" elapsed="0.000529">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:32.112213" elapsed="0.060625">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:33.183871" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:33.183346" elapsed="0.000569"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:33.183993" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:50:33.184223" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:33.182835" elapsed="0.001423"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:33.191466" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:33.191200" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:33.191939" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:33.191690" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:33.198574" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:33.198703" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:33 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:33 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782233,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:33.198803" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:33.194185" elapsed="0.004646"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:33.192058" elapsed="0.006817"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:33.199062" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:33.198903" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:33.192037" elapsed="0.007112"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:33.203151" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782233,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:33.200203" elapsed="0.003018"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:33.199974" elapsed="0.003296"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:33.199956" elapsed="0.003348"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:33.209104" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:33.203723" elapsed="0.005495"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:33.203384" elapsed="0.005884"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:33.203361" elapsed="0.005942"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:33.210021" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:33.209595" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:33.210361" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:33.210120" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:33.210978" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:33.210665" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:33.210444" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:33.210103" elapsed="0.000961"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:33.211616" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:33.211228" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:33.211950" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:33.211714" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:33.212491" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:33.212193" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:33.212030" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:33.211696" elapsed="0.000895"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:33.212750" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:33.213588" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:33.213283" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:33.213774" elapsed="0.002421"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:33.199519" elapsed="0.016741"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:33.216438" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:50:33.216330" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:33.216311" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:33.216697" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:33.216770" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:33.219126" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782233,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:33.184763" elapsed="0.034435"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:33.219253" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:33.219406" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782233,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:33.182140" elapsed="0.037292"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:33.220431" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782233, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:33.220027" elapsed="0.000433"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:33.220508" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:33.220681" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782233, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:33.219680" elapsed="0.001027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:33.221065" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:33.220885" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:33.221609" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:33.221286" elapsed="0.000350"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:33.222077" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:33.221811" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:33.222646" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:33.222278" elapsed="0.000438">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:33.173796" elapsed="0.049030">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:34.234631" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:34.234104" elapsed="0.000572"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:34.234753" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:50:34.234984" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:34.233566" elapsed="0.001455"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:34.244204" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:34.243936" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:34.244681" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:34.244413" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:34.251006" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:34.251087" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782234,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:34.251218" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:34.246932" elapsed="0.004322"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:34.244801" elapsed="0.006514"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:34.251601" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:34.251354" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:34.244780" elapsed="0.006944"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:34.256669" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782234,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:34.253155" elapsed="0.003585"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:34.252839" elapsed="0.004018"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:34.252814" elapsed="0.004079"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:34.260785" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:34.257291" elapsed="0.003562"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:34.256973" elapsed="0.003928"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:34.256949" elapsed="0.003987"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:34.261789" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:34.261186" elapsed="0.000641"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:34.262264" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:34.261927" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:34.262972" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:34.262629" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:34.262378" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:34.261902" elapsed="0.001154"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:34.263596" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:34.263217" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:34.263930" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:34.263695" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:34.264462" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:34.264168" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:34.264011" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:34.263677" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:34.264725" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:34.265533" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:34.265242" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:34.265763" elapsed="0.002498"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:34.252224" elapsed="0.016102"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:34.268504" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:50:34.268396" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:34.268377" elapsed="0.000236"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:34.268766" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:34.268837" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:34.271181" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782234,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:34.235509" elapsed="0.035701"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:34.271261" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:34.271431" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782234,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:34.232870" elapsed="0.038587"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:34.272433" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782234, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:34.272037" elapsed="0.000424"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:34.272509" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:34.272687" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782234, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:34.271695" elapsed="0.001060"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:34.273119" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:34.272937" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:34.273642" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:34.273320" elapsed="0.000348"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:34.274125" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:34.273859" elapsed="0.000291"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:34.274686" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:34.274321" elapsed="0.000437">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:34.223723" elapsed="0.051147">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:35.288103" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:35.287513" elapsed="0.000636"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:35.288230" elapsed="0.000061"/>
</return>
<msg time="2026-04-10T00:50:35.288500" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:35.286965" elapsed="0.001574"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:35.297407" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:35.297136" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:35.297900" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:35.297647" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:35.305184" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:35.305250" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:35 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:35 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782235,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:35.305380" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:35.300249" elapsed="0.005163"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:35.298106" elapsed="0.007352"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:35.305692" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:35.305489" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:35.298082" elapsed="0.007707"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:35.309466" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782235,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:35.306865" elapsed="0.002651"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:35.306620" elapsed="0.002958"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:35.306601" elapsed="0.003002"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:35.312327" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:35.309885" elapsed="0.002492"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:35.309660" elapsed="0.002751"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:35.309643" elapsed="0.002792"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:35.313030" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:35.312631" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:35.313400" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:35.313155" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:35.314083" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:35.313677" elapsed="0.000443"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:35.313483" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:35.313136" elapsed="0.001139"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:35.315091" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:35.314502" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:35.315578" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:35.315228" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:35.316384" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:35.315970" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:35.315693" elapsed="0.000778"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:35.315203" elapsed="0.001299"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:35.316759" elapsed="0.000557"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:35.318034" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:35.317614" elapsed="0.000458"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:35.318293" elapsed="0.003679"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:35.306172" elapsed="0.015892"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:35.322312" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-10T00:50:35.322162" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:35.322136" 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-04-10T00:50:35.322667" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:35.322774" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:50:35.326187" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782235,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:35.289059" elapsed="0.037157"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:35.326268" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:35.326423" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782235,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:35.286253" elapsed="0.040196"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:35.327447" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782235, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:35.327047" elapsed="0.000429"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:35.327525" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:50:35.327701" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782235, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:35.326694" elapsed="0.001034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:35.328096" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:35.327915" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:35.328632" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:35.328300" elapsed="0.000360"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:35.329100" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:35.328836" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:35.329782" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:35.329334" elapsed="0.000531">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:35.275888" elapsed="0.054108">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:36.342848" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:36.342440" elapsed="0.000545"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:36.343047" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:50:36.343251" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:36.342050" elapsed="0.001227"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:36.350590" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:36.350301" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:36.351053" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:36.350802" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:36.358792" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:36.358855" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:36 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:36 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782236,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:36.358954" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:36.353387" elapsed="0.005594"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:36.351192" elapsed="0.007834"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:36.359213" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:36.359056" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:36.351169" elapsed="0.008131"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:36.362945" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782236,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:36.360390" elapsed="0.002606"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:36.360159" elapsed="0.002872"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:36.360140" elapsed="0.002916"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:36.365817" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:36.363343" elapsed="0.002521"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:36.363114" elapsed="0.002785"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:36.363097" elapsed="0.002826"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:36.366507" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:36.366109" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:36.366866" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:36.366624" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:36.367425" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:36.367116" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:36.366949" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:36.366605" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:36.368099" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:36.367728" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:36.368433" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:36.368197" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:36.368995" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:36.368695" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:36.368515" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:36.368179" elapsed="0.000900"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:36.369235" elapsed="0.000373"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:36.370075" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:36.369778" elapsed="0.000380"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:36.370319" elapsed="0.002450"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:36.359699" elapsed="0.013138"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:36.373019" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:50:36.372908" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:36.372890" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:36.373266" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:36.373338" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:36.375699" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782236,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:36.343679" elapsed="0.032049"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:36.375783" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:36.375936" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782236,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:36.341512" elapsed="0.034450"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:36.377048" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782236, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:36.376645" elapsed="0.000431"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:36.377125" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:36.377280" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782236, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:36.376187" elapsed="0.001119"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:36.377686" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:36.377486" elapsed="0.000226"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:36.378196" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:36.377888" elapsed="0.000334"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:36.378679" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:36.378397" elapsed="0.000308"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:36.379257" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:36.378876" elapsed="0.000470">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:36.331284" elapsed="0.048174">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:37.391068" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:37.390619" elapsed="0.000483"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:37.391160" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:50:37.391337" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:37.390219" elapsed="0.001144"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:37.398262" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:37.397978" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:37.398777" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:37.398477" elapsed="0.000348"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:37.405801" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:37.405996" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:37 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:37 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782237,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:37.406141" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:37.401053" elapsed="0.005126"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:37.398900" elapsed="0.007341"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:37.406517" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:37.406279" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:37.398880" elapsed="0.007798"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:37.412082" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782237,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:37.408319" elapsed="0.003835"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:37.408002" elapsed="0.004203"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:37.407976" elapsed="0.004263"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:37.416238" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:37.412705" elapsed="0.003582"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:37.412320" elapsed="0.004004"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:37.412296" elapsed="0.004054"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:37.417082" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:37.416604" elapsed="0.000505"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:37.417470" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:37.417185" elapsed="0.000355"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:37.418253" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:37.417836" elapsed="0.000446"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:37.417616" elapsed="0.000704"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:37.417163" elapsed="0.001179"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:37.418965" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:37.418508" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:37.419338" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:37.419065" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:37.420008" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:37.419661" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:37.419437" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:37.419047" elapsed="0.001047"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:37.420284" elapsed="0.000477"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:37.421269" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:37.420958" elapsed="0.000338"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:37.421456" elapsed="0.002547"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:37.407340" elapsed="0.016731"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:37.424280" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:50:37.424143" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:37.424124" elapsed="0.000251"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:37.424570" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:37.424667" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:50:37.427592" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782237,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:37.391748" elapsed="0.035947"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:37.427772" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:50:37.427985" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782237,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:37.389718" elapsed="0.038304"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:37.429160" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782237, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:37.428681" elapsed="0.000520"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:37.429271" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:50:37.429495" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782237, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:37.428300" elapsed="0.001226"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:37.429925" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:37.429733" elapsed="0.000218"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:37.430492" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:37.430160" elapsed="0.000366"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:37.431165" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:37.430793" elapsed="0.000406"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:37.431875" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:37.431448" elapsed="0.000523">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:37.380602" elapsed="0.051490">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:38.443898" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:38.443509" elapsed="0.000422"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:38.443990" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:50:38.444162" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:38.443137" elapsed="0.001050"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:38.451274" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:38.450984" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:38.451782" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:38.451504" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:38.458680" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:38.458742" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:38 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:38 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782238,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:38.458837" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:38.454089" elapsed="0.004775"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:38.451905" elapsed="0.007009"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:38.459243" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:38.458942" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:38.451884" elapsed="0.007446"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:38.462998" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782238,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:38.460366" elapsed="0.002682"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:38.460142" elapsed="0.003002"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:38.460124" elapsed="0.003047"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:38.466592" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:38.463459" elapsed="0.003203"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:38.463230" elapsed="0.003483"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:38.463211" elapsed="0.003537"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:38.467593" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:38.466998" elapsed="0.000642"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:38.468084" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:38.467744" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:38.469423" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:38.468897" elapsed="0.000565"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:38.468201" elapsed="0.001323"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:38.467718" elapsed="0.001857"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:38.470331" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:38.469810" elapsed="0.000559"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:38.470820" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:38.470469" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:38.471603" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:38.471161" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:38.470939" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:38.470442" elapsed="0.001280"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:38.471939" elapsed="0.000519"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:38.473159" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:38.472749" elapsed="0.000448"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:38.473417" elapsed="0.003550"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:38.459714" elapsed="0.017320"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:38.477215" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:50:38.477107" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:38.477088" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:38.477455" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:38.477526" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:38.479835" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782238,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:38.444561" elapsed="0.035303"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:38.479930" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:38.480096" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782238,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:38.442642" elapsed="0.037481"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:38.481189" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782238, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:38.480733" elapsed="0.000491"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:38.481273" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:38.481428" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782238, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:38.480355" elapsed="0.001169"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:38.481916" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:38.481729" elapsed="0.000213"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:38.482426" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:38.482121" elapsed="0.000331"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:38.482911" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:38.482641" elapsed="0.000296"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:38.483460" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:38.483112" elapsed="0.000421">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:38.432970" elapsed="0.050690">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:39.495863" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:39.495336" elapsed="0.000571"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:39.495987" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:50:39.496219" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:39.494835" elapsed="0.001419"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:39.504828" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:39.504562" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:39.505283" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:39.505038" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:39.512804" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:39.512968" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:39 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:39 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782239,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:39.513215" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:39.507507" elapsed="0.005767"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:39.505401" elapsed="0.007970"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:39.513853" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:39.513433" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:39.505380" elapsed="0.008665"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:39.521130" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782239,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:39.516379" elapsed="0.004829"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:39.515882" elapsed="0.005379"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:39.515841" elapsed="0.005456"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:39.525499" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:39.521785" elapsed="0.003820"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:39.521405" elapsed="0.004251"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:39.521380" elapsed="0.004310"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:39.526530" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:39.525952" elapsed="0.000638"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:39.527030" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:39.526693" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:39.527878" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:39.527372" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:39.527145" elapsed="0.000921"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:39.526667" elapsed="0.001436"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:39.529004" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:39.528373" elapsed="0.000681"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:39.529687" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:39.529180" elapsed="0.000609"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:39.530360" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:39.530054" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:39.529830" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:39.529149" elapsed="0.001296"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:39.530620" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:39.531442" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:39.531148" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:39.531658" elapsed="0.002479"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:39.514900" elapsed="0.019305"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:39.534388" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:50:39.534278" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:39.534258" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:39.534646" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:39.534720" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:39.537040" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782239,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:39.496758" elapsed="0.040331"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:39.537149" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:39.537302" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782239,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:39.494131" elapsed="0.043196"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:39.538366" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782239, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:39.537955" elapsed="0.000439"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:39.538443" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:39.538618" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782239, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:39.537573" elapsed="0.001072"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:39.539040" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:39.538824" elapsed="0.000248"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:39.539624" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:39.539285" elapsed="0.000366"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:39.540094" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:39.539827" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:39.540656" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:39.540290" elapsed="0.000436">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:39.484530" elapsed="0.056308">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:40.552010" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:40.551589" elapsed="0.000552"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:40.552209" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:50:40.552393" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:40.551192" elapsed="0.001227"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:40.559316" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:40.559029" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:40.559835" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:40.559530" elapsed="0.000354"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:40.566765" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:40.566827" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:40 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:40 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782240,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:40.566926" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:40.562194" elapsed="0.004762"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:40.559965" elapsed="0.007039"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:40.567205" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:40.567033" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:40.559943" elapsed="0.007351"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:40.571130" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782240,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:40.568372" elapsed="0.002810"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:40.568140" elapsed="0.003079"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:40.568122" elapsed="0.003121"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:40.574568" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:40.571531" elapsed="0.003108"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:40.571301" elapsed="0.003400"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:40.571284" elapsed="0.003465"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:40.575673" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:40.575021" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:40.576175" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:40.575818" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:40.577017" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:40.576525" elapsed="0.000545"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:40.576294" elapsed="0.000831"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:40.575792" elapsed="0.001366"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:40.578050" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:40.577390" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:40.578623" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:40.578203" elapsed="0.000544"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:40.579689" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:40.579123" elapsed="0.000622"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:40.578796" elapsed="0.001019"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:40.578177" elapsed="0.001677"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:40.580103" elapsed="0.000565"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:40.581399" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:40.580970" elapsed="0.000527"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:40.581763" elapsed="0.003549"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:40.567692" elapsed="0.017714"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:40.585690" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T00:50:40.585508" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:40.585481" 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-04-10T00:50:40.586007" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:40.586080" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:40.588458" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782240,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:40.552831" elapsed="0.035658"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:40.588563" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:40.588744" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782240,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:40.550670" elapsed="0.038106"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:40.589849" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782240, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:40.589394" elapsed="0.000484"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:40.589928" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:40.590085" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782240, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:40.589015" elapsed="0.001097"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:40.590479" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:40.590294" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:40.591008" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:40.590697" elapsed="0.000337"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:40.591475" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:40.591207" elapsed="0.000294"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:40.592141" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:40.591740" elapsed="0.000476">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:40.542051" elapsed="0.050277">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:41.605787" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:41.605389" elapsed="0.000432"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:41.605882" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:50:41.606051" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:41.605000" elapsed="0.001077"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:41.615137" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:41.614790" elapsed="0.000409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:41.615646" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:41.615372" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:41.623560" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:41.623685" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:41 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:41 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782241,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:41.623798" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:41.617978" elapsed="0.005847"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:41.615770" elapsed="0.008099"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:41.624097" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:41.623898" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:41.615749" elapsed="0.008469"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:41.629274" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782241,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:41.625702" elapsed="0.003642"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:41.625362" elapsed="0.004032"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:41.625336" elapsed="0.004093"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:41.633400" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:41.629871" elapsed="0.003595"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:41.629509" elapsed="0.004007"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:41.629485" elapsed="0.004105"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:41.634391" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:41.633843" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:41.634990" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:41.634529" elapsed="0.000527"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:41.635572" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:41.635246" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:41.635080" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:41.634505" elapsed="0.001154"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:41.636192" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:41.635824" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:41.636526" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:41.636290" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:41.637088" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:41.636786" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:41.636624" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:41.636272" elapsed="0.000900"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:41.637327" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:41.638170" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:41.637876" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:41.638351" elapsed="0.002515"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:41.624757" elapsed="0.016174"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:41.641114" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:50:41.641003" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:41.640985" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:41.641360" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:41.641431" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:41.643828" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782241,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:41.606436" elapsed="0.037467"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:41.643961" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:41.644120" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782241,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:41.604290" elapsed="0.039856"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:41.645171" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782241, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:41.644759" elapsed="0.000441"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:41.645249" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:41.645406" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782241, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:41.644380" elapsed="0.001053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:41.645816" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:41.645631" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:41.646364" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:41.646021" elapsed="0.000379"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:41.646968" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:41.646664" elapsed="0.000330"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:41.647527" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:41.647171" elapsed="0.000448">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:41.593203" elapsed="0.054527">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:42.660183" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:42.659674" elapsed="0.000550"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:42.660300" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T00:50:42.660518" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:42.659140" elapsed="0.001427"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:42.669940" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:42.669501" elapsed="0.000512"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:42.670557" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:42.670230" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:42.679290" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:42.679383" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:42 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:42 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782242,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:42.679533" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:42.673653" elapsed="0.005940"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:42.670841" elapsed="0.008823"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:42.679974" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:42.679712" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:42.670799" elapsed="0.009296"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:42.684980" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782242,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:42.681579" elapsed="0.003472"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:42.681245" elapsed="0.003926"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:42.681218" elapsed="0.003987"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:42.688856" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:42.685602" elapsed="0.003320"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:42.685281" elapsed="0.003686"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:42.685258" elapsed="0.003741"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:42.689792" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:42.689258" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:42.690237" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:42.689921" elapsed="0.000388"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:42.691024" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:42.690641" elapsed="0.000416"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:42.690340" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:42.689896" elapsed="0.001231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:42.691820" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:42.691342" elapsed="0.000513"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:42.692244" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:42.691944" elapsed="0.000370"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:42.692947" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:42.692576" elapsed="0.000405"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:42.692344" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:42.691921" elapsed="0.001133"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:42.693265" elapsed="0.000459"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:42.694307" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:42.693939" elapsed="0.000401"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:42.694589" elapsed="0.003500"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:42.680645" elapsed="0.017519"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:42.698359" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-04-10T00:50:42.698244" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:42.698224" elapsed="0.000253"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:42.698662" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:42.698735" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:42.701646" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782242,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:42.661029" elapsed="0.040655"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:42.701749" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:50:42.701939" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782242,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:42.658192" elapsed="0.043779"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:42.703348" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782242, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:42.702819" elapsed="0.000565"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:42.703444" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:50:42.703658" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782242, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:42.702280" elapsed="0.001542"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:42.704292" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:42.704063" elapsed="0.000261"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:42.704975" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:42.704581" elapsed="0.000429"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:42.705594" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:42.705239" elapsed="0.000388"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:42.706339" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:42.705854" elapsed="0.000574">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:42.648674" elapsed="0.057920">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:43.716822" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:43.716158" elapsed="0.000713"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:43.716953" elapsed="0.000061"/>
</return>
<msg time="2026-04-10T00:50:43.717216" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:43.715581" elapsed="0.001673"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:43.731108" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:43.730732" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:43.731621" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:43.731348" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:43.738400" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:43.738484" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:43 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782243,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:43.738648" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:43.733942" elapsed="0.004739"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:43.731757" elapsed="0.006981"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:43.738984" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:43.738775" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:43.731729" elapsed="0.007347"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:43.743211" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782243,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:43.740335" elapsed="0.002935"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:43.740032" elapsed="0.003278"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:43.739988" elapsed="0.003348"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:43.746358" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:43.743664" elapsed="0.002747"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:43.743399" elapsed="0.003049"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:43.743381" elapsed="0.003093"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:43.747150" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:43.746722" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:43.747503" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:43.747255" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:43.748143" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:43.747783" elapsed="0.000388"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:43.747612" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:43.747236" elapsed="0.001074"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:43.748878" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:43.748478" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:43.749218" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:43.748978" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:43.749842" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:43.749466" elapsed="0.000405"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:43.749301" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:43.748960" elapsed="0.000970"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:43.750101" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:43.750988" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:43.750683" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:43.751180" elapsed="0.002608"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:43.739502" elapsed="0.014363"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:43.754069" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:50:43.753951" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:43.753929" elapsed="0.000237"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:43.754332" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:43.754406" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:43.756804" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782243,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:43.717800" elapsed="0.039036"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:43.756890" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:43.757051" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782243,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:43.714651" elapsed="0.042427"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:43.758206" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782243, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:43.757752" elapsed="0.000483"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:43.758284" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:43.758442" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782243, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:43.757331" elapsed="0.001138"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:43.758854" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:43.758666" elapsed="0.000214"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:43.759364" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:43.759056" elapsed="0.000335"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:43.759890" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:43.759581" elapsed="0.000335"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:43.760447" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:43.760089" elapsed="0.000429">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:43.707294" elapsed="0.053355">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:44.774225" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:44.773745" elapsed="0.000608"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:44.774416" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:50:44.774615" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:44.773298" elapsed="0.001344"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:44.782086" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:44.781706" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:44.782596" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:44.782323" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:44.789698" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:44.789790" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:44 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782244,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:44.789929" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:44.785010" elapsed="0.004950"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:44.782735" elapsed="0.007284"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:44.790276" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:44.790058" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:44.782709" elapsed="0.007658"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:44.794334" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782244,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:44.791662" elapsed="0.002733"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:44.791375" elapsed="0.003060"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:44.791349" elapsed="0.003113"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:44.798430" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:44.794788" elapsed="0.003728"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:44.794528" elapsed="0.004077"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:44.794509" elapsed="0.004139"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:44.799665" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:44.799005" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:44.800193" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:44.799825" elapsed="0.000457"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:44.801043" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:44.800584" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:44.800319" elapsed="0.000819"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:44.799794" elapsed="0.001378"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:44.802029" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:44.801415" elapsed="0.000656"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:44.802536" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:44.802181" elapsed="0.000477"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:44.803500" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:44.802984" elapsed="0.000590"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:44.802696" elapsed="0.000936"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:44.802153" elapsed="0.001511"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:44.803912" elapsed="0.000534"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:44.805162" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:44.804723" elapsed="0.000580"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:44.805574" elapsed="0.003319"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:44.790813" elapsed="0.018167"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:44.809203" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:50:44.809079" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:44.809052" elapsed="0.000255"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:44.809484" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:44.809575" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:44.812093" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782244,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:44.775014" elapsed="0.037116"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:44.812189" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:44.812357" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782244,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:44.772528" elapsed="0.039857"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:44.813667" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782244, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:44.813152" elapsed="0.000545"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:44.813749" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:44.813911" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782244, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:44.812669" elapsed="0.001269"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:44.814307" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:44.814120" elapsed="0.000214"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:44.814890" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:44.814512" elapsed="0.000409"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:44.815435" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:44.815139" elapsed="0.000322"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:44.816023" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:44.815656" elapsed="0.000443">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:44.761460" elapsed="0.054754">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:45.829417" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:45.828869" elapsed="0.000597"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:45.829573" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:50:45.829885" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:45.828251" elapsed="0.001676"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:45.839152" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:45.838784" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:45.839996" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:45.839702" elapsed="0.000347"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:45.847331" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:45.847533" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782245,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:45.847688" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:45.842384" elapsed="0.005333"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:45.840141" elapsed="0.007630"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:45.848007" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:45.847805" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:45.840114" elapsed="0.008000"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:45.852049" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782245,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:45.849333" elapsed="0.002775"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:45.849086" elapsed="0.003071"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:45.849065" elapsed="0.003128"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:45.855058" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:45.852517" elapsed="0.002594"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:45.852270" elapsed="0.002915"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:45.852251" elapsed="0.002961"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:45.855828" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:45.855400" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:45.856211" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:45.855928" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:45.857136" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:45.856656" elapsed="0.000523"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:45.856337" elapsed="0.000897"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:45.855909" elapsed="0.001362"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:45.858118" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:45.857527" elapsed="0.000632"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:45.858638" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:45.858265" elapsed="0.000459"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:45.859489" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:45.858997" elapsed="0.000564"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:45.858758" elapsed="0.000875"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:45.858238" elapsed="0.001433"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:45.859965" elapsed="0.000683"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:45.861356" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:45.860911" elapsed="0.000486"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:45.861667" elapsed="0.004188"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:45.848534" elapsed="0.017431"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:45.866273" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T00:50:45.866087" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:45.866050" elapsed="0.000360"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:45.866674" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:45.866785" elapsed="0.000024"/>
</return>
<msg time="2026-04-10T00:50:45.869634" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782245,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:45.830522" elapsed="0.039181"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:45.869761" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:45.869921" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782245,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:45.827187" elapsed="0.042762"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:45.870971" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782245, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:45.870557" elapsed="0.000443"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:45.871083" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:50:45.871260" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782245, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:45.870190" elapsed="0.001097"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:45.871682" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:45.871475" elapsed="0.000233"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:45.872209" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:45.871885" elapsed="0.000352"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:45.872731" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:45.872418" elapsed="0.000340"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:45.873317" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:45.872935" elapsed="0.000454">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:45.817192" elapsed="0.056310">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:46.885538" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:46.885052" elapsed="0.000558"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:46.885686" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:50:46.885914" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:46.884492" elapsed="0.001459"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:46.894691" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:46.894416" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:46.895138" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:46.894894" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:46.901658" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:46.901717" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:46 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:46 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782246,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:46.901809" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:46.897356" elapsed="0.004479"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:46.895254" elapsed="0.006624"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:46.902058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:46.901905" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:46.895233" elapsed="0.006911"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:46.907035" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782246,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:46.903574" elapsed="0.003530"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:46.903240" elapsed="0.003984"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:46.903215" elapsed="0.004045"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:46.911291" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:46.907682" elapsed="0.003676"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:46.907340" elapsed="0.004068"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:46.907316" elapsed="0.004125"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:46.912248" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:46.911709" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:46.912782" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:46.912387" elapsed="0.000480"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:46.913455" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:46.913129" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:46.912901" elapsed="0.000616"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:46.912361" elapsed="0.001178"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:46.914081" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:46.913717" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:46.914413" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:46.914179" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:46.914971" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:46.914673" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:46.914495" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:46.914160" elapsed="0.000895"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:46.915209" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:46.916031" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:46.915743" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:46.916214" elapsed="0.002438"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:46.902652" elapsed="0.016064"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:46.918890" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:50:46.918786" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:46.918768" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:46.919124" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:46.919195" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:46.921669" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782246,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:46.886426" elapsed="0.035273"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:46.921753" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:46.921907" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782246,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:46.883832" elapsed="0.038102"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:46.923050" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782246, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:46.922653" elapsed="0.000425"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:46.923126" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:46.923280" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782246, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:46.922154" elapsed="0.001185"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:46.923722" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:46.923521" elapsed="0.000227"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:46.924225" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:46.923924" elapsed="0.000327"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:46.924735" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:46.924421" elapsed="0.000340"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:46.925279" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:46.924933" elapsed="0.000560">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:46.874410" elapsed="0.051210">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:47.937679" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:47.937275" elapsed="0.000438"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:47.937773" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:50:47.937944" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:47.936881" elapsed="0.001088"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:47.945244" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:47.944970" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:47.945724" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:47.945455" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:47.952175" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:47.952240" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:47 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:47 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782247,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:47.952337" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:47.948188" elapsed="0.004175"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:47.945846" elapsed="0.006560"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:47.952612" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:47.952435" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:47.945824" elapsed="0.006875"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:47.956256" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782247,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:47.953772" elapsed="0.002533"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:47.953528" elapsed="0.002811"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:47.953509" elapsed="0.002855"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:47.959109" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:47.956659" elapsed="0.002497"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:47.956419" elapsed="0.002772"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:47.956402" elapsed="0.002814"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:47.959812" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:47.959399" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:47.960146" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:47.959910" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:47.960719" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:47.960393" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:47.960229" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:47.959892" elapsed="0.000976"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:47.961403" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:47.961031" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:47.961753" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:47.961500" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:47.962290" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:47.961994" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:47.961834" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:47.961482" elapsed="0.000891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:47.962690" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:47.963518" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:47.963227" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:47.963720" elapsed="0.002422"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:47.953079" elapsed="0.013128"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:47.966384" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:50:47.966278" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:47.966260" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:47.966639" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:47.966710" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:47.969187" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782247,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:47.938319" elapsed="0.030897"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:47.969268" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:47.969419" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782247,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:47.936222" elapsed="0.033223"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:47.970418" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782247, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:47.970022" elapsed="0.000424"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:47.970494" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:50:47.970702" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782247, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:47.969683" elapsed="0.001055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:47.971149" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:47.970966" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:47.971673" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:47.971349" elapsed="0.000349"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:47.972133" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:47.971871" elapsed="0.000287"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:47.972716" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:47.972329" elapsed="0.000470">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:47.926684" elapsed="0.046248">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:48.985253" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:48.984769" elapsed="0.000658"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:48.985527" elapsed="0.000082"/>
</return>
<msg time="2026-04-10T00:50:48.985799" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:48.984221" elapsed="0.001615"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:48.994436" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:48.994128" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:48.994924" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:48.994679" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:49.001908" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:49.001981" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:49 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:49 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782249,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:49.002134" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:48.997324" elapsed="0.004840"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:48.995048" elapsed="0.007169"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:49.002442" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:49.002253" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:48.995024" elapsed="0.007510"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:49.006477" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782249,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:49.003732" elapsed="0.002800"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:49.003462" elapsed="0.003126"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:49.003442" elapsed="0.003171"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:49.009392" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:49.006899" elapsed="0.002542"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:49.006673" elapsed="0.002803"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:49.006655" elapsed="0.002846"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:49.010218" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:49.009717" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:49.010729" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:49.010341" elapsed="0.000476"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:49.011593" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:49.011094" elapsed="0.000551"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:49.010852" elapsed="0.000848"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:49.010313" elapsed="0.001420"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:49.012533" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:49.011989" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:49.013051" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:49.012701" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:49.013873" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:49.013411" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:49.013170" elapsed="0.000795"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:49.012675" elapsed="0.001321"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:49.014293" elapsed="0.000664"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:49.015765" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:49.015274" elapsed="0.000619"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:49.016165" elapsed="0.003900"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:49.002981" elapsed="0.017200"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:49.020499" elapsed="0.000086"/>
</return>
<status status="PASS" start="2026-04-10T00:50:49.020305" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:49.020273" elapsed="0.000428"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:49.020998" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:49.021115" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:50:49.023941" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782249,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:48.986371" elapsed="0.037602"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:49.024030" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:49.024194" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782249,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:48.983413" elapsed="0.040808"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:49.025357" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782249, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:49.024907" elapsed="0.000479"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:49.025434" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:49.025609" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782249, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:49.024486" elapsed="0.001151"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:49.026022" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:49.025820" elapsed="0.000228"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:49.026529" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:49.026223" elapsed="0.000350"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:49.027011" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:49.026748" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:49.027582" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:49.027207" elapsed="0.000449">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:48.973870" elapsed="0.053896">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:50.043671" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:50.043282" elapsed="0.000421"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:50.043760" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:50:50.043929" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:50.042914" elapsed="0.001041"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:50.050798" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:50.050494" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:50.051283" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:50.051030" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:50.057931" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:50.058085" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:50 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:50 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782250,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:50.058193" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:50.053583" elapsed="0.004637"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:50.051404" elapsed="0.006858"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:50.058462" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:50.058289" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:50.051384" elapsed="0.007187"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:50.062100" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782250,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:50.059607" elapsed="0.002543"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:50.059366" elapsed="0.002820"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:50.059348" elapsed="0.002863"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:50.064944" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:50.062499" elapsed="0.002492"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:50.062268" elapsed="0.002759"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:50.062251" elapsed="0.002801"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:50.065647" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:50.065229" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:50.066023" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:50.065747" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:50.066605" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:50.066270" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:50.066107" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:50.065729" elapsed="0.000962"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:50.067225" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:50.066853" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:50.067578" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:50.067324" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:50.068125" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:50.067826" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:50.067661" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:50.067306" elapsed="0.000903"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:50.068364" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:50.069221" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:50.068898" elapsed="0.000351"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:50.069411" elapsed="0.002580"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:50.058934" elapsed="0.013136"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:50.072278" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:50:50.072145" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:50.072126" elapsed="0.000249"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:50.072528" elapsed="0.000039"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:50.072618" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:50:50.074948" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782250,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:50.044308" elapsed="0.030704"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:50.075067" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:50.075221" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782250,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:50.042394" elapsed="0.032853"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:50.076233" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782250, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:50.075831" elapsed="0.000430"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:50.076310" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:50.076466" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782250, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:50.075472" elapsed="0.001020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:50.076872" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:50.076689" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:50.077381" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:50.077075" elapsed="0.000332"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:50.077896" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:50.077597" elapsed="0.000326"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:50.078446" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:50.078097" elapsed="0.000419">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:50.028732" elapsed="0.049909">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:51.091739" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:51.091267" elapsed="0.000511"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:51.091848" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:50:51.092050" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:51.090804" elapsed="0.001278"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:51.099237" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:51.098968" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:51.099721" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:51.099448" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:51.106099" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:51.106159" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:51 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:51 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782251,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:51.106254" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:51.102123" elapsed="0.004158"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:51.099841" elapsed="0.006484"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:51.106694" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:51.106353" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:51.099820" elapsed="0.006964"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:51.110329" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782251,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:51.107818" elapsed="0.002597"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:51.107589" elapsed="0.002927"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:51.107570" elapsed="0.002989"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:51.113296" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:51.110853" elapsed="0.002490"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:51.110621" elapsed="0.002760"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:51.110603" elapsed="0.002805"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:51.114001" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:51.113603" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:51.114366" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:51.114100" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:51.114949" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:51.114640" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:51.114452" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:51.114082" elapsed="0.000952"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:51.115581" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:51.115197" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:51.115919" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:51.115681" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:51.116461" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:51.116163" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:51.116001" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:51.115663" elapsed="0.000898"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:51.116718" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:51.117527" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:51.117236" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:51.117728" elapsed="0.002422"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:51.107146" elapsed="0.013068"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:51.120397" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:50:51.120285" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:51.120267" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:51.120783" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:51.120855" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:50:51.123250" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782251,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:51.092528" elapsed="0.030752"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:51.123331" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:51.123484" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782251,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:51.090163" elapsed="0.033347"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:51.124510" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782251, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:51.124111" elapsed="0.000428"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:51.124604" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:51.124760" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782251, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:51.123756" elapsed="0.001063"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:51.125187" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:51.125003" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:51.125711" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:51.125390" elapsed="0.000347"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:51.126177" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:51.125911" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:50:51.126768" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:50:51.126397" elapsed="0.000444">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:50:51.079713" elapsed="0.047237">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.133861" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:52.133465" elapsed="0.000428"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:52.133954" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:50:52.134129" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.133094" elapsed="0.001060"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.140986" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.140718" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.141442" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.141194" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:52.148125" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:52.148185" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:52 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:52 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782252,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:52.148280" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:52.143768" elapsed="0.004538"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:52.141576" elapsed="0.006772"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.148532" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.148377" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.141540" elapsed="0.007095"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.152243" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782252,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.149682" elapsed="0.002610"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:52.149439" elapsed="0.002888"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.149421" elapsed="0.002930"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.155569" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.152649" elapsed="0.002993"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:52.152407" elapsed="0.003286"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.152390" elapsed="0.003339"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.156609" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:52.156004" elapsed="0.000646"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.157110" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.156756" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.157950" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:52.157475" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:52.157232" elapsed="0.000887"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.156729" elapsed="0.001427"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.158992" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:52.158401" elapsed="0.000632"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.159510" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.159136" elapsed="0.000505"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.160364" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:52.159920" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:52.159677" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.159110" elapsed="0.001377"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:52.160741" elapsed="0.000520"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:52.161957" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:52.161509" elapsed="0.000487"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.162227" elapsed="0.003357"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:52.149001" elapsed="0.016648"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:52.165844" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:50:52.165721" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.165702" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.166099" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.166174" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:50:52.168511" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782252,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:52.134508" elapsed="0.034032"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:52.168607" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:52.168762" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782252,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:52.132607" elapsed="0.036181"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.169826" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782252, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:52.169352" elapsed="0.000509"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:52.169913" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:52.170069" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782252, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:52.169009" elapsed="0.001086"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:52.170454" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.170272" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.170972" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:52.170668" elapsed="0.000329"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.171451" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:50:52.171168" elapsed="0.000314"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.171679" elapsed="0.000314"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:50:52.127572" elapsed="0.044482"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:50:26.967112" elapsed="25.204992"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:26.966576" elapsed="25.205591"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:26.961750" elapsed="25.210492"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:26.961586" elapsed="25.210696"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.183168" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:52.182866" elapsed="0.000329"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:52.183241" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:52.183409" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.182500" elapsed="0.000934"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.190285" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.190034" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.190750" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.190488" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:50:52.197763" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:50:52.197824" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:50:52 GMT', 'Expires': 'Thu, 09 Apr 2026 23:50:52 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782252,"status":200} 
 </msg>
<msg time="2026-04-10T00:50:52.197930" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:50:52.192953" elapsed="0.005006"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:52.190862" elapsed="0.007143"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.198193" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.198037" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.190843" elapsed="0.007442"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.201785" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782252,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.199331" elapsed="0.002504"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:52.199088" elapsed="0.002785"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.199070" elapsed="0.002828"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.204610" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.202181" elapsed="0.002476"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:52.201955" elapsed="0.002735"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.201938" elapsed="0.002777"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.205252" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:52.204878" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.205600" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.205349" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.206146" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:52.205844" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:52.205682" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.205331" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.206807" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:52.206387" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.207140" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.206905" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.207783" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:52.207462" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:52.207221" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.206888" elapsed="0.001014"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:52.208060" elapsed="0.000381"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:50:52.209081" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:52.208696" elapsed="0.000422"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.209337" elapsed="0.003452"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:50:52.198662" elapsed="0.014217"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:50:52.213126" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:50:52.212977" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.212952" elapsed="0.000292"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.213453" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.213571" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:50:52.216808" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782252,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:50:52.183779" elapsed="0.033069"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:50:52.216920" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:50:52.217130" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782252,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:50:52.182043" elapsed="0.035122"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:50:52.217229" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:50:52.217426" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782252,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 1. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:50:52.177633" elapsed="0.039828"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.218925" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782252, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:52.218351" elapsed="0.000613"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:50:52.219034" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:50:52.219297" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782252, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:50:52.217848" elapsed="0.001488"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:52.219859" level="INFO">${value} = 10000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.219605" elapsed="0.000289"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.220487" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:50:52.220142" elapsed="0.000413"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 10000.</doc>
<status status="PASS" start="2026-04-10T00:50:52.177170" elapsed="0.043446"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:52.172481" elapsed="0.048168"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:52.172338" elapsed="0.048342"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${Inventory_Leader_List_Post}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:50:26.862490" elapsed="25.358244"/>
</kw>
<doc>Initiate get operation and check flow count across cluster nodes.</doc>
<status status="PASS" start="2026-04-10T00:50:26.492721" elapsed="25.728143"/>
</test>
<test id="s1-s2-t9" name="Verify Flows In Switch Before Cluster Restart" line="104">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:50:52.224458" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:50:52.224190" elapsed="0.000550"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.225742" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.225631" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.225613" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.230975" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.230867" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.230849" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.232084" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:52.231701" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.232592" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:52.232273" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:52.232663" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:52.232818" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:52.231303" elapsed="0.001540"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.238306" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.238198" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.238180" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.239582" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.239452" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.239435" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:52.240126" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.239813" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.240578" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.240323" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.274400" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:52.241108" elapsed="0.033416"/>
</kw>
<msg time="2026-04-10T00:50:52.274725" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:50:52.274772" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.240768" elapsed="0.034041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.347602" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:50:52.275362" elapsed="0.072375"/>
</kw>
<msg time="2026-04-10T00:50:52.347907" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:50:52.347954" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.274988" elapsed="0.073002"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.348310" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.348073" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.348051" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.348871" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.348538" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.349256" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.349033" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.349014" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:50:52.349368" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.352147" elapsed="0.000153"/>
</kw>
<msg time="2026-04-10T00:50:52.352367" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:52.350979" elapsed="0.001534"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.352832" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.353200" elapsed="0.000083"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.350256" elapsed="0.003146"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:52.349705" elapsed="0.003765"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:50:52.239129" elapsed="0.114464"/>
</kw>
<msg time="2026-04-10T00:50:52.353687" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:52.353731" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.238527" elapsed="0.115241"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:50:52.353953" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:52.353845" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.353827" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.354434" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.354792" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.354882" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:50:52.237859" elapsed="0.117134"/>
</kw>
<msg time="2026-04-10T00:50:52.355088" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:52.355133" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.233211" elapsed="0.121961"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.355502" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.355248" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.355231" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:52.233066" elapsed="0.122558"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.361193" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.361086" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.361068" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.362572" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.362446" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.362429" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:52.363132" level="INFO">${karaf_connection_index} = 145</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.362788" elapsed="0.000371"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.363560" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.363318" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.364369" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.364103" elapsed="0.001220">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:50:52.365527" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:50:52.365592" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.363750" elapsed="0.001867"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.366428" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.366178" elapsed="0.000950">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:50:52.367327" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:50:52.367373" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.365830" elapsed="0.001567"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.368379" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Verify Flows In Switch Before Cluster Restart"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.367720" elapsed="0.000723">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Verify Flows In Switch Before Cluster Restart"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:50:52.367474" elapsed="0.001041">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Verify Flows In Switch Before Cluster Restart"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:50:52.367455" elapsed="0.001109">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Verify Flows In Switch Before Cluster Restart"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.368730" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.368959" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.368817" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:52.368800" elapsed="0.000233"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.369066" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.371752" elapsed="0.000155"/>
</kw>
<msg time="2026-04-10T00:50:52.371972" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:52.370539" elapsed="0.001570"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.372401" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.372789" elapsed="0.000086"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.369881" elapsed="0.003112"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:52.369330" elapsed="0.003730"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.362141" elapsed="0.011004">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Verify Flows In Switch Before Cluster Restart"</status>
</kw>
<msg time="2026-04-10T00:50:52.373246" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:50:52.373291" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Verify Flows In Switch Before Cluster Restart...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.361413" elapsed="0.011902"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.373498" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.373392" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.373374" elapsed="0.000292"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.374446" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.374341" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.374324" elapsed="0.000187"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.374854" level="INFO">index=143
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:52.374681" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.375399" level="INFO">{1: 88, 2: 145, 3: 92}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.375141" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.375852" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.375610" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.376451" elapsed="0.000289"/>
</kw>
<msg time="2026-04-10T00:50:52.376840" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:52.376886" level="INFO">${old_connection_index} = 145</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.376052" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.377860" elapsed="0.000209"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.379359" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.378753" elapsed="0.001530">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.378239" elapsed="0.002149"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:52.381060" elapsed="0.000307"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.380577" elapsed="0.000878"/>
</kw>
<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="PASS" start="2026-04-10T00:50:52.377207" elapsed="0.004296"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:52.376985" elapsed="0.004606"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.376967" elapsed="0.004651"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:52.382453" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.382149" elapsed="0.000330"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:50:52.382527" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:50:52.382699" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.381825" elapsed="0.000898"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.382895" elapsed="0.000415"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.383614" level="INFO">index=146
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:52.383482" elapsed="0.000259"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.383892" elapsed="0.002269"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.386601" level="INFO">Logging into '10.30.170.169:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:50:52.388610" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</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="FAIL" start="2026-04-10T00:50:52.386328" elapsed="0.002657">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.405313" elapsed="0.000455"/>
</kw>
<msg time="2026-04-10T00:50:52.405865" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:52.403853" elapsed="0.002174"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.406189" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.406353" elapsed="0.000023"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.389932" elapsed="0.016508"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:52.389264" elapsed="0.017222"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.374053" elapsed="0.032527">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.406932" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.407051" 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="FAIL" start="2026-04-10T00:50:52.360739" elapsed="0.046421">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<msg time="2026-04-10T00:50:52.407269" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:50:52.407312" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.355896" elapsed="0.051439"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.407946" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.407415" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.407396" elapsed="0.000630"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:50:52.355752" elapsed="0.052298"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.414002" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.413893" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.413873" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.415243" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.415136" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.415118" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:52.415932" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.415455" elapsed="0.000504"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.416345" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.416118" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.454868" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:52.416882" elapsed="0.038104"/>
</kw>
<msg time="2026-04-10T00:50:52.455159" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:50:52.455205" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.416530" elapsed="0.038712"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.542598" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:50:52.455790" elapsed="0.086954"/>
</kw>
<msg time="2026-04-10T00:50:52.542925" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:50:52.542983" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.455416" elapsed="0.087616"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.543371" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.543127" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.543104" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.543942" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.543624" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.544322" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.544103" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.544086" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:50:52.544432" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.547218" elapsed="0.000152"/>
</kw>
<msg time="2026-04-10T00:50:52.547433" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:52.546015" elapsed="0.001578"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.547887" elapsed="0.000084"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.548247" elapsed="0.000082"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.545335" elapsed="0.003111"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:52.544736" elapsed="0.003778"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:50:52.414831" elapsed="0.133812"/>
</kw>
<msg time="2026-04-10T00:50:52.548738" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:52.548781" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.414226" elapsed="0.134592"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:50:52.549003" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:52.548896" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.548878" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.549488" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.549842" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.549919" elapsed="0.000020"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:50:52.413527" elapsed="0.136531"/>
</kw>
<msg time="2026-04-10T00:50:52.550160" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:52.550204" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.408324" elapsed="0.141925"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.550664" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.550333" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.550315" elapsed="0.000429"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:52.408180" elapsed="0.142588"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:52.232895" elapsed="0.317906"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:50:52.230486" elapsed="0.320377"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:50:52.225328" elapsed="0.325596"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.224894" elapsed="0.326078"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:50:52.221816" elapsed="0.329215"/>
</kw>
<kw name="Verify Aggregate Flow From Mininet Session" owner="MininetKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.553192" elapsed="0.000177"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:52.552775" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.552757" elapsed="0.000675"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.553919" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:52.553619" elapsed="0.000327"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.554845" elapsed="0.000144"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:52.554626" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.554609" elapsed="0.000440"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.558391" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:52.555230" elapsed="0.003222"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.591049" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<msg time="2026-04-10T00:50:52.591153" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:50:52.558644" elapsed="0.032536"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:50:52.591229" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:52.591387" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 143 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:50:52.554271" elapsed="0.037142"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:50:52.591847" level="INFO">${flows} = ['10000']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:50:52.591597" elapsed="0.000275"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.592409" level="INFO">${total_flows} = 10000</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:50:52.592034" elapsed="0.000400"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.592921" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-04-10T00:50:52.592636" elapsed="0.000343"/>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="PASS" start="2026-04-10T00:50:52.552433" elapsed="0.040604"/>
</kw>
<arg>${time_out}</arg>
<arg>2s</arg>
<arg>MininetKeywords.Check Flows In Mininet</arg>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:50:52.551813" elapsed="0.041271"/>
</kw>
<arg>${mininet_conn_id}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${operation_timeout}</arg>
<doc>Verify flow count per switch</doc>
<status status="PASS" start="2026-04-10T00:50:52.551298" elapsed="0.041843"/>
</kw>
<doc>Verify flows are installed in switch before cluster restart.</doc>
<status status="PASS" start="2026-04-10T00:50:52.221228" elapsed="0.372029"/>
</test>
<test id="s1-s2-t10" name="Restart Pre Leader From Cluster Node" line="111">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:50:52.596619" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:50:52.596327" elapsed="0.000557"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.597881" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.597772" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.597754" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.603050" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.602946" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.602927" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.604112" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:52.603735" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.604619" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:52.604301" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:52.604689" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:52.604841" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:52.603344" elapsed="0.001521"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.612258" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.612151" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.612132" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.613482" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.613377" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.613360" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:52.614075" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.613738" elapsed="0.000365"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.614561" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.614301" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.646416" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:52.615134" elapsed="0.031484"/>
</kw>
<msg time="2026-04-10T00:50:52.646877" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:50:52.646945" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.614796" elapsed="0.032204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.716472" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "R "e "s "t "a "r "t "[C "[78CP "[A[78Cr
 "e "[C "L "e "a "d "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:50:52.647787" elapsed="0.068866"/>
</kw>
<msg time="2026-04-10T00:50:52.716838" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:50:52.716886" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.647255" elapsed="0.069668"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.717283" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.717018" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.716992" elapsed="0.000376"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.717877" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "R "e "s "t "a "r "t "[C "[78CP "[A[78Cr
 "e "[C "L "e "a "d "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.717514" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.718301" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.718069" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.718051" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:50:52.718415" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.721314" elapsed="0.000163"/>
</kw>
<msg time="2026-04-10T00:50:52.721573" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:52.720008" elapsed="0.001719"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.722059" elapsed="0.000086"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.722438" elapsed="0.000089"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.719312" elapsed="0.003363"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:52.718734" elapsed="0.004009"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:50:52.613077" elapsed="0.109765"/>
</kw>
<msg time="2026-04-10T00:50:52.722937" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:52.722981" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.612478" elapsed="0.110541"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:50:52.723208" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:50:52.723096" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.723078" elapsed="0.000221"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.723725" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.724065" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.724187" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:50:52.611810" elapsed="0.112503"/>
</kw>
<msg time="2026-04-10T00:50:52.724415" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:52.724458" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.605234" elapsed="0.119261"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.724845" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.724589" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.724570" elapsed="0.000355"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:52.605091" elapsed="0.119857"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.730937" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.730828" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.730809" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.732169" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.732059" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.732042" elapsed="0.000209"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:52.732796" level="INFO">${karaf_connection_index} = 146</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.732437" elapsed="0.000387"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.733214" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.732986" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.734058" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.733774" elapsed="0.001005">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:50:52.734975" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:50:52.735021" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.733411" elapsed="0.001633"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.735840" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.735587" elapsed="0.000934">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:50:52.736752" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:50:52.736797" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.735215" elapsed="0.001605"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.737822" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Restart Pre Leader From Cluster Node"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.737120" elapsed="0.000816">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Restart Pre Leader From Cluster Node"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:50:52.736897" elapsed="0.001129">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Restart Pre Leader From Cluster Node"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:50:52.736878" elapsed="0.001181">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Restart Pre Leader From Cluster Node"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.738229" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.738466" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.738317" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:52.738301" elapsed="0.000260"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.738597" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.741177" elapsed="0.000151"/>
</kw>
<msg time="2026-04-10T00:50:52.741423" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:52.740068" elapsed="0.001628"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.742100" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.742480" elapsed="0.000111"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.739395" elapsed="0.003340"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:52.738860" elapsed="0.003944"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.731754" elapsed="0.011140">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Restart Pre Leader From Cluster Node"</status>
</kw>
<msg time="2026-04-10T00:50:52.742997" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:50:52.743046" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Restart Pre Leader From Cluster Node"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.731159" elapsed="0.011912"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.743257" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.743149" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.743130" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.744338" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.744224" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.744204" elapsed="0.000204"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.744746" level="INFO">index=143
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:52.744604" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.745364" level="INFO">{1: 88, 2: 146, 3: 92}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.745045" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.745989" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.745692" elapsed="0.000365"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.746675" elapsed="0.000291"/>
</kw>
<msg time="2026-04-10T00:50:52.747072" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:52.747121" level="INFO">${old_connection_index} = 146</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.746234" elapsed="0.000911"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.748124" elapsed="0.000220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.749617" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.749090" elapsed="0.001586">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.748537" elapsed="0.002246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:52.751467" elapsed="0.000391"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.750960" elapsed="0.000990"/>
</kw>
<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="PASS" start="2026-04-10T00:50:52.747592" elapsed="0.004405"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:52.747228" elapsed="0.004820"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.747209" elapsed="0.004866"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:52.752983" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.752665" elapsed="0.000344"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:50:52.753059" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:50:52.753215" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.752297" elapsed="0.000942"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.753452" elapsed="0.000485"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.754238" level="INFO">index=147
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:52.754114" elapsed="0.000254"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.754522" elapsed="0.002485"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.757442" level="INFO">Logging into '10.30.170.169:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:50:52.758693" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</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="FAIL" start="2026-04-10T00:50:52.757179" elapsed="0.002436">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.782618" elapsed="0.000456"/>
</kw>
<msg time="2026-04-10T00:50:52.783198" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:52.780609" elapsed="0.002759"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.783537" elapsed="0.000047"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.783752" elapsed="0.000027"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.761531" elapsed="0.022318"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:52.760271" elapsed="0.023625"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.743752" elapsed="0.040230">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.784332" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.784413" 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="FAIL" start="2026-04-10T00:50:52.730398" elapsed="0.054125">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<msg time="2026-04-10T00:50:52.784667" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:50:52.784722" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.725227" elapsed="0.059525"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.785094" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.784833" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.784814" elapsed="0.000357"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:50:52.725082" elapsed="0.060114"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.791259" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.791147" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.791128" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.792504" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.792393" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.792375" elapsed="0.000229"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:52.793083" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.792752" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.793505" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.793273" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.826777" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:52.794233" elapsed="0.032656"/>
</kw>
<msg time="2026-04-10T00:50:52.827066" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:50:52.827113" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.793883" elapsed="0.033267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.894410" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "R "e "s "t "a "r "t "[C "[78CP "[A[78Cr
 "e "[C "L "e "a "d "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:50:52.827743" elapsed="0.066854"/>
</kw>
<msg time="2026-04-10T00:50:52.894790" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:50:52.894837" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.827354" elapsed="0.067521"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.895258" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.894978" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.894950" elapsed="0.000392"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.895877" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "R "e "s "t "a "r "t "[C "[78CP "[A[78Cr
 "e "[C "L "e "a "d "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.895497" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.896257" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.896038" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.896020" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:50:52.896371" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.899170" elapsed="0.000155"/>
</kw>
<msg time="2026-04-10T00:50:52.899389" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:52.898004" elapsed="0.001533"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.899871" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.900236" elapsed="0.000085"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.897268" elapsed="0.003172"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:52.896704" elapsed="0.003803"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:50:52.792086" elapsed="0.108548"/>
</kw>
<msg time="2026-04-10T00:50:52.900730" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:52.900774" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.791484" elapsed="0.109335"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:50:52.901003" elapsed="0.000279"/>
</return>
<status status="PASS" start="2026-04-10T00:50:52.900896" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.900878" elapsed="0.000466"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.901797" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.902137" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.902267" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:50:52.790773" elapsed="0.111610"/>
</kw>
<msg time="2026-04-10T00:50:52.902478" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:52.902522" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.785472" elapsed="0.117109"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.902914" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.902659" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.902642" elapsed="0.000348"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:52.785329" elapsed="0.117684"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:52.604919" elapsed="0.298130"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:50:52.602585" elapsed="0.300526"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:50:52.597462" elapsed="0.305706"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.597038" elapsed="0.306179"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:50:52.594096" elapsed="0.309175"/>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<kw name="ClusterManagement__Build_List" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.906795" level="INFO">${member_int} = 2</msg>
<var>${member_int}</var>
<arg>${member}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:50:52.906452" elapsed="0.000370"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.907284" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>${member_int}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:52.906980" elapsed="0.000334"/>
</kw>
<return>
<value>${index_list}</value>
<status status="PASS" start="2026-04-10T00:50:52.907360" elapsed="0.000099"/>
</return>
<msg time="2026-04-10T00:50:52.907625" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>${member}</arg>
<status status="PASS" start="2026-04-10T00:50:52.906114" elapsed="0.001537"/>
</kw>
<kw name="Return_Member_IP" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.908633" level="INFO">${member_int} = 2</msg>
<var>${member_int}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:50:52.908220" elapsed="0.000442"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:52.909091" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_int}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.908821" elapsed="0.000295"/>
</kw>
<return>
<value>${member_ip}</value>
<status status="PASS" start="2026-04-10T00:50:52.909164" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:52.909324" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>${member}</arg>
<doc>Return the IP address of the member given the member_index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.907873" elapsed="0.001477"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.911936" level="INFO">${msg} = Starting ODL2 10.30.170.169</msg>
<var>${msg}</var>
<arg>"${msg}" == "${EMPTY}"</arg>
<arg>Starting ODL${member} ${member_ip}</arg>
<arg>Starting ODL${member} ${member_ip}, ${msg}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:52.909583" elapsed="0.002381"/>
</kw>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.919016" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.918904" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.918886" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.920107" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:52.919724" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.920641" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:52.920296" elapsed="0.000372"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:52.920713" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:52.920868" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:52.919314" elapsed="0.001578"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.926848" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.926736" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.926716" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.928107" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.927998" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.927979" elapsed="0.000211"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:52.928591" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.928352" elapsed="0.000279"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.929015" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.928808" elapsed="0.000234"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.959667" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "2 "[C "1 "0 ". "3 "0 ". "1 "7 "0 ". "1 "6 "9 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:52.929604" elapsed="0.030205"/>
</kw>
<msg time="2026-04-10T00:50:52.959975" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:50:52.960039" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "2 "[C "1 "0 ". "3 "0 ". "1 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.929207" elapsed="0.030883"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.963009" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:50:52.960941" elapsed="0.002150"/>
</kw>
<msg time="2026-04-10T00:50:52.963223" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:50:52.963282" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.960374" elapsed="0.002945"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.963791" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.963441" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.963407" elapsed="0.000498"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.964471" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.964111" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.964956" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.964654" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.964629" elapsed="0.000435"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:50:52.965112" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.967315" elapsed="0.000220"/>
</kw>
<msg time="2026-04-10T00:50:52.967689" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:52.966751" elapsed="0.001010"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.967926" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.968094" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.966321" elapsed="0.001856"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:52.965590" elapsed="0.002635"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:50:52.927642" elapsed="0.040680"/>
</kw>
<msg time="2026-04-10T00:50:52.968417" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:52.968459" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.927077" elapsed="0.041409"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:50:52.968693" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:52.968582" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.968561" 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-04-10T00:50:52.969187" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.969624" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.969698" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:50:52.926341" elapsed="0.043468"/>
</kw>
<msg time="2026-04-10T00:50:52.969905" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:52.969949" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.921277" elapsed="0.048699"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.970307" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.970053" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.970036" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:50:52.921128" elapsed="0.049281"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.976362" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.976253" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.976235" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.977584" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.977460" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.977443" elapsed="0.000209"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:52.978020" level="INFO">${karaf_connection_index} = 147</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.977798" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.978381" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.978204" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.979114" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.978915" elapsed="0.000739">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:50:52.979765" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:50:52.979810" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.978580" elapsed="0.001252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.980516" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.980335" elapsed="0.000686">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:50:52.981128" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:50:52.981173" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.980001" elapsed="0.001195"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.981849" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL2 10.30.170.169"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.981511" elapsed="0.000400">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL2 10.30.170.169"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:50:52.981272" elapsed="0.000709">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL2 10.30.170.169"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:50:52.981254" elapsed="0.000758">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL2 10.30.170.169"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.982174" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.982400" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:52.982259" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:52.982243" elapsed="0.000233"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.982508" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.984164" elapsed="0.000214"/>
</kw>
<msg time="2026-04-10T00:50:52.984486" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:52.983662" elapsed="0.001048"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.984922" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:52.985088" elapsed="0.000020"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.983285" elapsed="0.001885"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:52.982784" elapsed="0.002433"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.977125" elapsed="0.008176">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL2 10.30.170.169"</status>
</kw>
<msg time="2026-04-10T00:50:52.985418" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:50:52.985462" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL2 10.30.170.169"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.976614" elapsed="0.008870"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.985693" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.985583" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.985563" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:52.986735" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:52.986629" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.986611" elapsed="0.000193"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.987096" level="INFO">index=143
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:52.986958" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.987655" level="INFO">{1: 88, 2: 147, 3: 92}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.987381" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:52.988098" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:52.987855" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.988690" elapsed="0.000186"/>
</kw>
<msg time="2026-04-10T00:50:52.988975" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:52.989021" level="INFO">${old_connection_index} = 147</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.988301" elapsed="0.000742"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:52.989965" elapsed="0.000148"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.990778" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.990627" elapsed="0.000585">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.990283" elapsed="0.000991"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:52.991948" elapsed="0.000101"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.991444" elapsed="0.000650"/>
</kw>
<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="PASS" start="2026-04-10T00:50:52.989388" elapsed="0.002751"/>
</kw>
<status status="PASS" start="2026-04-10T00:50:52.989120" elapsed="0.003068"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:52.989101" elapsed="0.003112"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:52.993034" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.992763" elapsed="0.000297"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:50:52.993108" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:50:52.993261" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:52.992419" elapsed="0.000866"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.993501" elapsed="0.000471"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.994268" level="INFO">index=148
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:52.994147" elapsed="0.000316"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:50:52.994633" elapsed="0.002353"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:50:52.997472" level="INFO">Logging into '10.30.170.169:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:50:52.998638" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</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="FAIL" start="2026-04-10T00:50:52.997156" elapsed="0.001940">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:53.003511" elapsed="0.000467"/>
</kw>
<msg time="2026-04-10T00:50:53.004038" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:53.002857" elapsed="0.001256"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.004291" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.004458" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:53.000068" elapsed="0.004509"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:52.999430" elapsed="0.005202"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.986145" elapsed="0.018581">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.005123" elapsed="0.000034"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:53.005217" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-10T00:50:52.975905" elapsed="0.029466">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<msg time="2026-04-10T00:50:53.005516" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:50:53.005602" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:52.970710" elapsed="0.034918"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.005999" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:53.005727" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:53.005705" elapsed="0.000374"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:50:52.970563" elapsed="0.035541"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:53.012344" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:53.012205" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:53.012184" elapsed="0.000245"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:50:53.013862" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:53.013750" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:53.013732" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:53.014342" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:53.014084" elapsed="0.000291"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:53.014757" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:53.014561" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:50:53.044477" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "2 "[C "1 "0 ". "3 "0 ". "1 "7 "0 ". "1 "6 "9 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:50:53.015291" elapsed="0.029429"/>
</kw>
<msg time="2026-04-10T00:50:53.045100" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:50:53.045170" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "2 "[C "1 "0 ". "3 "0 ". "1 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:53.014945" elapsed="0.030310"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:50:53.048736" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:50:53.046361" elapsed="0.002458"/>
</kw>
<msg time="2026-04-10T00:50:53.048955" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:50:53.049017" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:53.045711" elapsed="0.003344"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.049555" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:53.049239" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:53.049152" elapsed="0.000495"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.050062" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:53.049799" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.050396" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:53.050177" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:53.050159" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:50:53.050512" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:53.052607" elapsed="0.000226"/>
</kw>
<msg time="2026-04-10T00:50:53.052949" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:53.051843" elapsed="0.001179"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.053203" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.053369" elapsed="0.000291"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:53.051426" elapsed="0.002306"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:50:53.050872" elapsed="0.002907"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:50:53.013413" elapsed="0.040463"/>
</kw>
<msg time="2026-04-10T00:50:53.053969" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:53.054013" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:53.012636" elapsed="0.041404"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:50:53.054224" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:50:53.054117" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:53.054099" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.054739" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.055081" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:50:53.055153" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:50:53.011789" elapsed="0.043477"/>
</kw>
<msg time="2026-04-10T00:50:53.055362" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:50:53.055407" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:50:53.006414" elapsed="0.049023"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.055798" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:53.055510" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:53.055494" elapsed="0.000436"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:50:53.006260" elapsed="0.049695"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:52.920949" elapsed="0.135041"/>
</for>
<arg>${msg}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:50:52.916772" elapsed="0.139282"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.063086" level="INFO">${base_command} = /tmp/karaf-0.23.1/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:53.062705" elapsed="0.000409"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.063663" level="INFO">${command} = /tmp/karaf-0.23.1/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:53.063284" elapsed="0.000406"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-10T00:50:53.064131" level="INFO">${epoch} = 1775782253.064055</msg>
<var>${epoch}</var>
<arg>time_zone=UTC</arg>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-10T00:50:53.063853" elapsed="0.000305"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.064744" level="INFO">${gc_filepath} = /tmp/karaf-0.23.1/data/log/gc_1775782253.064055.log</msg>
<var>${gc_filepath}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/data/log/gc_${epoch}.log</arg>
<arg>${GC_LOG_PATH}/gc_${epoch}.log</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:53.064327" elapsed="0.000443"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.065347" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782253.064055.log</msg>
<var>${gc_options}</var>
<arg>"docker" not in """${node_start_command}"""</arg>
<arg>-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${gc_filepath}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:53.064940" elapsed="0.000439"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.066930" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:53.066558" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.067420" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:53.067116" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:53.067489" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:53.067660" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:53.066174" elapsed="0.001510"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:50:53.068947" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:50:53.068677" elapsed="0.000296"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:53.069776" level="INFO">index=143
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:53.069640" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.073377" elapsed="0.000087"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:53.072562" elapsed="0.001023"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:53.072527" elapsed="0.001087"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:53.073888" level="INFO">index=143
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:50:53.073768" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.075367" level="INFO">Attempting to execute command "/tmp/karaf-0.23.1/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782253.064055.log" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:53.074266" elapsed="0.001169"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:50:53.076516" level="INFO">${conn_id} = 149</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:50:53.075691" elapsed="0.000871"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.078271" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:50:53.078594" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:50:53.077674" elapsed="0.001036"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:53.079032" elapsed="0.000684"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:50:53.081445" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:50:53.792250" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:50:53 UTC 2026

  System load:  0.35               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.169
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:48 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:50:53.081125" elapsed="0.711299"/>
</kw>
<msg time="2026-04-10T00:50:53.792612" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:53.080239" elapsed="0.712507"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:50:53.076843" elapsed="0.716108"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:50:53.793686" level="INFO">Executing command '/tmp/karaf-0.23.1/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782253.064055.log'.</msg>
<msg time="2026-04-10T00:50:53.816802" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:50:53.817137" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:50:53.817238" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:50:53.793254" elapsed="0.024036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:50:53.817897" elapsed="0.000558"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.820417" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:53.818969" elapsed="0.001553"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:50:53.821214" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:53.820785" elapsed="0.000692"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:53.820730" elapsed="0.000807"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:50:53.822101" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-04-10T00:50:53.821699" elapsed="0.000691"/>
</branch>
<status status="PASS" start="2026-04-10T00:50:53.821661" elapsed="0.000791"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:50:53.822531" elapsed="0.000086"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:53.832961" elapsed="0.000160"/>
</kw>
<msg time="2026-04-10T00:50:53.833187" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:53.830820" elapsed="0.002490"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.833667" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.834060" elapsed="0.000052"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:53.823319" elapsed="0.010964"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:50:53.071938" elapsed="0.762441"/>
</kw>
<msg time="2026-04-10T00:50:53.834436" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:53.071099" elapsed="0.763389"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:50:53.070572" elapsed="0.764031"/>
</kw>
<msg time="2026-04-10T00:50:53.834707" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:53.070060" elapsed="0.764706"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:50:53.838301" elapsed="0.000158"/>
</kw>
<msg time="2026-04-10T00:50:53.838503" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:50:53.837787" elapsed="0.000868"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.838826" elapsed="0.000027"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.839000" elapsed="0.000020"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:50:53.835116" elapsed="0.003967"/>
</kw>
<msg time="2026-04-10T00:50:53.839176" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:50:53.069213" elapsed="0.769988"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.839698" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:53.839385" elapsed="0.000356"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:50:53.839785" elapsed="0.000031"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:50:53.068248" elapsed="0.771675"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:50:53.068067" elapsed="0.771894"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:50:53.067740" elapsed="0.772260"/>
</for>
<arg>command=${command} ${gc_options}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:50:53.065635" elapsed="0.774425"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.852014" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:50:53.851634" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.852514" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:50:53.852216" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:50:53.852602" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:53.852756" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:50:53.851218" elapsed="0.001561"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.854303" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:50:53.854005" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:50:53.854373" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:50:53.854525" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:50:53.853649" elapsed="0.000917"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.864103" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:53.863508" elapsed="0.000645"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:50:53.864892" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:50:53.864314" 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-04-10T00:50:53.872667" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.169', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.169', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-10T00:50:53.867338" elapsed="0.018172">ConnectionError: HTTPConnectionPool(host='10.30.170.169', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.169', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-10T00:50:53.865010" elapsed="0.021293">ConnectionError: HTTPConnectionPool(host='10.30.170.169', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.169', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.887126" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:53.886630" elapsed="0.001152"/>
</branch>
<status status="FAIL" start="2026-04-10T00:50:53.864991" elapsed="0.022841">ConnectionError: HTTPConnectionPool(host='10.30.170.169', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.169', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.888869" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:53.889145" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:53.889065" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:53.889028" elapsed="0.000269"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.889606" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:50:53.889724" elapsed="0.000025"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-10T00:50:53.858970" elapsed="0.030967">ConnectionError: HTTPConnectionPool(host='10.30.170.169', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.169', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-10T00:50:53.890058" elapsed="0.000026"/>
</return>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-04-10T00:50:53.854781" elapsed="0.035475">ConnectionError: HTTPConnectionPool(host='10.30.170.169', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.169', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.890863" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:50:53.891164" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:50:53.891081" elapsed="0.000246"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:53.891043" elapsed="0.000435"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.892089" elapsed="0.000060"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.892491" elapsed="0.000028"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-04-10T00:50:53.892600" elapsed="0.000018"/>
</return>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="FAIL" start="2026-04-10T00:50:53.853254" elapsed="0.039468">ConnectionError: HTTPConnectionPool(host='10.30.170.169', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.169', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-10T00:50:53.892894" elapsed="0.000039"/>
</continue>
<status status="NOT RUN" start="2026-04-10T00:50:53.892820" elapsed="0.000149"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:53.892799" elapsed="0.000193"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.893153" elapsed="0.000022"/>
</kw>
<var name="${index}">2</var>
<status status="FAIL" start="2026-04-10T00:50:53.853023" elapsed="0.040208">ConnectionError: HTTPConnectionPool(host='10.30.170.169', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.169', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:50:53.852834" elapsed="0.040517">ConnectionError: HTTPConnectionPool(host='10.30.170.169', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.169', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="FAIL" start="2026-04-10T00:50:53.850820" elapsed="0.042673">ConnectionError: HTTPConnectionPool(host='10.30.170.169', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.169', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-10T00:50:53.850481" elapsed="0.043126">ConnectionError: HTTPConnectionPool(host='10.30.170.169', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.169', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-04-10T00:50:53.850463" elapsed="0.043235">ConnectionError: HTTPConnectionPool(host='10.30.170.169', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.169', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<arg>${member_index_list}</arg>
<status status="NOT RUN" start="2026-04-10T00:50:53.894053" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:53.893788" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:53.893768" elapsed="0.000372"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:50:53.894502" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:50:53.894211" elapsed="0.000372"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:50:53.894192" elapsed="0.000416"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="FAIL" start="2026-04-10T00:50:53.850060" elapsed="0.044646">ConnectionError: HTTPConnectionPool(host='10.30.170.169', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.169', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:03.912999" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:03.912504" elapsed="0.000528"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:03.913518" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:03.913207" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:03.913613" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:51:03.913785" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:03.912080" elapsed="0.001731"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:03.915421" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:03.915058" elapsed="0.000391"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:03.915496" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:03.915665" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:03.914682" elapsed="0.001007"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:03.923620" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:03.923044" elapsed="0.000628"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:03.924352" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:03.923831" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:04.113884" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:04.114269" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 status=401, reason=Unauthorized 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '524'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 401 Unauthorized&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 401 Unauthorized&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;401&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Unauthorized&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;org.jolokia.osgi.servlet.JolokiaServlet&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-04-10T00:51:04.114904" level="FAIL">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-10T00:51:03.926676" elapsed="0.190408">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-04-10T00:51:03.924468" elapsed="0.193498">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:04.118524" elapsed="0.000118"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:04.118073" elapsed="0.001408"/>
</branch>
<status status="FAIL" start="2026-04-10T00:51:03.924449" elapsed="0.195267">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:04.120534" elapsed="0.000066"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:04.120778" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:04.120717" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:04.120688" elapsed="0.000186"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:04.121095" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:04.121200" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-10T00:51:03.918508" elapsed="0.202858">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:04.121468" elapsed="0.000023"/>
</return>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-04-10T00:51:03.915905" elapsed="0.205729">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:04.121960" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:51:04.122159" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:04.122107" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:04.122082" elapsed="0.000164"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:04.122538" elapsed="0.000071"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:04.122930" elapsed="0.000035"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-04-10T00:51:04.123042" elapsed="0.000030"/>
</return>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="FAIL" start="2026-04-10T00:51:03.914285" elapsed="0.208918">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-10T00:51:04.123392" elapsed="0.000031"/>
</continue>
<status status="NOT RUN" start="2026-04-10T00:51:04.123323" elapsed="0.000139"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:04.123297" elapsed="0.000195"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:04.123779" elapsed="0.000038"/>
</kw>
<var name="${index}">2</var>
<status status="FAIL" start="2026-04-10T00:51:03.914056" elapsed="0.209836">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:51:03.913870" elapsed="0.210111">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="FAIL" start="2026-04-10T00:51:03.911654" elapsed="0.212490">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-04-10T00:51:03.911223" elapsed="0.213009">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</branch>
<status status="FAIL" start="2026-04-10T00:51:03.911196" elapsed="0.213081">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<arg>${member_index_list}</arg>
<status status="NOT RUN" start="2026-04-10T00:51:04.124743" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:04.124425" elapsed="0.000398"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:04.124400" elapsed="0.000456"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:51:04.125258" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:04.124935" elapsed="0.000409"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:04.124912" elapsed="0.000465"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="FAIL" start="2026-04-10T00:51:03.910610" elapsed="0.214885">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.143033" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:14.142413" elapsed="0.000664"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.143588" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:14.143255" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:14.143667" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:51:14.143843" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:14.142000" elapsed="0.001867"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.145764" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:14.145437" elapsed="0.000447"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:14.145936" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:14.146091" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:14.145088" elapsed="0.001028"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.154343" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:14.153386" elapsed="0.001013"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.155201" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:14.154603" 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-04-10T00:51:14.472519" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:14.472958" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:14 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:14 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore","type":"read"},"value":{"LocalShards":["member-2-shard-default-config","member-2-shard-topology-config","member-2-shard-inventory-config","member-2-shard-toaster-config"],"SyncStatus":true,"MemberName":"member-2"},"timestamp":1775782274,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:14.473512" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:14.157644" elapsed="0.316129"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:14.155337" elapsed="0.319098"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.475098" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:14.474624" elapsed="0.001338"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.155315" elapsed="0.320711"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.485258" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore","type":"read"},"value":{"LocalShards":["member-2-shard-default-config","member-2-shard-topology-config","member-2-shard-inventory-config","member-2-shard-toaster-config"],"SyncStatus":true,"MemberName":"member-2"},"timestamp":1775782274,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:14.481138" elapsed="0.004380"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:14.479178" elapsed="0.006442"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.479147" elapsed="0.006533"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.490312" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:14.487669" elapsed="0.002755"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:14.485807" elapsed="0.004670"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.485780" elapsed="0.004739"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.492262" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:14.491275" elapsed="0.001032"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.493005" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:14.492464" elapsed="0.000634"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.494027" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:14.493451" elapsed="0.000626"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:14.493138" elapsed="0.000993"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.492443" elapsed="0.001725"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.495938" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:14.494779" elapsed="0.001222"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.497089" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:14.496213" elapsed="0.001004"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.498472" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:14.497724" elapsed="0.000819"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:14.497273" elapsed="0.001369"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.496186" elapsed="0.002508"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:14.499012" elapsed="0.001204"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:14.501784" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:14.500838" elapsed="0.001007"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:14.502231" elapsed="0.003297"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:14.477230" elapsed="0.028604"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:14.506062" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:14.505915" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.505894" elapsed="0.000243"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:14.509681" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782274,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:14.506298" elapsed="0.003414"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:14.509766" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:51:14.509935" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782274,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:14.148992" elapsed="0.360970"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:14.510020" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:14.510175" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782274,...</msg>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:14.146331" elapsed="0.363872"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.511127" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782274,
 "value": {
  "LocalShards": [
   "member-2-shard-default-config",
   "member-2-shard-inventory-config",
   "member-2-shard-toaster-config",
   "member-2-shard-topology-config"
  ],
  "MemberName": "member-2",
  "SyncStatus": true
 }
}
</msg>
<arg>${shard_manager_text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:14.510828" elapsed="0.000404"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.512632" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782274, 'value': {...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:14.511822" elapsed="0.000839"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:14.512711" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:14.512877" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782274, 'value': {...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:14.511451" elapsed="0.001453"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:14.513297" level="INFO">${value_object} = {'LocalShards': ['member-2-shard-default-config', 'member-2-shard-inventory-config', 'member-2-shard-toaster-config', 'member-2-shard-topology-config'], 'MemberName': 'member-2', 'SyncStatus': True}</msg>
<var>${value_object}</var>
<arg>dictionary=${manager_object}</arg>
<arg>key=value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:14.513064" elapsed="0.000261"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:14.513726" level="INFO">${sync_status} = True</msg>
<var>${sync_status}</var>
<arg>dictionary=${value_object}</arg>
<arg>key=SyncStatus</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:14.513483" elapsed="0.000269"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-04-10T00:51:14.513799" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:14.513953" level="INFO">${conf_status} = True</msg>
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="PASS" start="2026-04-10T00:51:14.510437" elapsed="0.003541"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:51:14.514157" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:14.514048" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.514030" elapsed="0.000192"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.522460" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:14.521744" elapsed="0.000767"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.523211" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:14.522689" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:14.532647" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:14.532796" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:14 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:14 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"LocalShards":["member-2-shard-default-operational","member-2-shard-topology-operational","member-2-shard-inventory-operational","member-2-shard-toaster-operational"],"SyncStatus":true,"MemberName":"member-2"},"timestamp":1775782274,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:14.532987" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:14.525590" elapsed="0.007486"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:14.523327" elapsed="0.010015"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.533534" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:14.533373" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.523309" elapsed="0.010603"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.540485" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"LocalShards":["member-2-shard-default-operational","member-2-shard-topology-operational","member-2-shard-inventory-operational","member-2-shard-toaster-operational"],"SyncStatus":true,"MemberName":"member-2"},"timestamp":1775782274,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:14.536796" elapsed="0.003872"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:14.535274" elapsed="0.005467"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.535254" elapsed="0.005544"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.545964" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:14.542916" elapsed="0.003157"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:14.540922" elapsed="0.005204"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.540896" elapsed="0.005271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.547892" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:14.546915" elapsed="0.001112"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.548674" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:14.548185" elapsed="0.000580"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.549681" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:14.549115" elapsed="0.000616"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:14.548806" elapsed="0.000977"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.548164" elapsed="0.001656"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.551484" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:14.550388" elapsed="0.001141"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.552170" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:14.551700" elapsed="0.000561"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.553184" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:14.552645" elapsed="0.000590"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:14.552302" elapsed="0.000984"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.551679" elapsed="0.001646"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:14.553542" elapsed="0.000880"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:14.555496" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:14.554814" elapsed="0.000726"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:14.555853" elapsed="0.002949"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:14.534386" elapsed="0.024564"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:14.559158" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:14.559025" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.559006" elapsed="0.000221"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:14.562838" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:14.559375" elapsed="0.003493"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:14.562919" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:51:14.563083" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:14.517239" elapsed="0.045870"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:14.563168" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:14.563321" level="INFO">${oper_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:14.514438" elapsed="0.048908"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.564216" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782274,
 "value": {
  "LocalShards": [
   "member-2-shard-default-operational",
   "member-2-shard-inventory-operational",
   "member-2-shard-toaster-operational",
   "member-2-shard-topology-operational"
  ],
  "MemberName": "member-2",
  "SyncStatus": true
 }
}
</msg>
<arg>${shard_manager_text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:14.563962" elapsed="0.000302"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.565757" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782274, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:14.564831" elapsed="0.000954"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:14.565834" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:14.566036" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782274, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:14.564472" elapsed="0.001591"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:14.566446" level="INFO">${value_object} = {'LocalShards': ['member-2-shard-default-operational', 'member-2-shard-inventory-operational', 'member-2-shard-toaster-operational', 'member-2-shard-topology-operational'], 'MemberName': 'member-2', '...</msg>
<var>${value_object}</var>
<arg>dictionary=${manager_object}</arg>
<arg>key=value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:14.566221" elapsed="0.000253"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:14.566947" level="INFO">${sync_status} = True</msg>
<var>${sync_status}</var>
<arg>dictionary=${value_object}</arg>
<arg>key=SyncStatus</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:14.566731" elapsed="0.000242"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-04-10T00:51:14.567020" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:14.567176" level="INFO">${oper_status} = True</msg>
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="PASS" start="2026-04-10T00:51:14.563602" elapsed="0.003600"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-04-10T00:51:14.567246" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:51:14.567397" level="INFO">${status} = True</msg>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="PASS" start="2026-04-10T00:51:14.144701" elapsed="0.422721"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-04-10T00:51:14.567662" elapsed="0.000036"/>
</continue>
<status status="PASS" start="2026-04-10T00:51:14.567493" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.567475" elapsed="0.000282"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.567908" elapsed="0.000022"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:51:14.144445" elapsed="0.423519"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:14.143927" elapsed="0.424075"/>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="PASS" start="2026-04-10T00:51:14.141573" elapsed="0.426489"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:14.141103" elapsed="0.426991"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.141075" elapsed="0.427044"/>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.569811" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:14.569225" elapsed="0.000627"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.570428" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:14.570091" elapsed="0.000363"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:14.570500" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:51:14.570781" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:14.568851" elapsed="0.001955"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.571900" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:14.571542" elapsed="0.000385"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:14.571971" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:14.572118" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:14.571188" elapsed="0.000954"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.626625" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:14.626122" elapsed="0.000565"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:14.627725" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:14.627372" elapsed="0.000432">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:14.627926" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:14.626971" elapsed="0.001009"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.628779" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:14.628256" elapsed="0.000671"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:14.629399" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:14.629612" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:14.629205" elapsed="0.000461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.630229" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:14.629935" 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-04-10T00:51:14.631546" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:14.631284" elapsed="0.000351"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.632074" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:14.631803" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.632458" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.632685" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.632865" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:14.632295" elapsed="0.000629"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:14.632153" elapsed="0.000802"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:14.633002" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:51:14.633171" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:14.630945" elapsed="0.002251"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:14.630493" elapsed="0.002758"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.633522" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:14.633301" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.630430" elapsed="0.003230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.634463" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:14.633947" elapsed="0.000571"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:14.634625" elapsed="0.000069"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:14.624721" elapsed="0.010157"/>
</kw>
<msg time="2026-04-10T00:51:14.634965" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:14.609981" elapsed="0.025053"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.661056" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.688009" elapsed="0.000076"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.714594" elapsed="0.000088"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.715060" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.715259" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.716707" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:14.715610" elapsed="0.001236"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:14.715590" elapsed="0.001313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.717119" elapsed="0.000077"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.717482" elapsed="0.000430"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.718176" elapsed="0.000074"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:14.715527" elapsed="0.002870"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:14.715354" elapsed="0.003088"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.718647" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:14.718737" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:51:14.718921" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:14.605692" elapsed="0.113258"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:14.721108" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:14.720525" elapsed="0.000799">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:14.721482" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:14.719849" elapsed="0.001660"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.722016" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:14.721659" elapsed="0.000570"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.723122" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:14.722456" elapsed="0.000756"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:14.722257" elapsed="0.001122"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.721638" elapsed="0.001765"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.737528" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:14.723662" elapsed="0.014261"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:14.737984" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:51:14.738154" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:14.719413" elapsed="0.018766"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:14.740042" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:14.739519" elapsed="0.000737">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:14.740386" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:14.738923" elapsed="0.001489"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:14.740684" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:51:14.740487" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.740468" elapsed="0.000303"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.741000" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:14.741178" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:14.741247" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:14.743784" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:14.738551" elapsed="0.005263"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.746097" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:14.745113" elapsed="0.001038"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:14.746890" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:14.746312" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:15.233438" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:15.235139" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:51:15 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:15.236216" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:14.749217" elapsed="0.487135"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:14.747012" elapsed="0.489786"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:15.237193" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:15.236870" elapsed="0.000825"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.746992" elapsed="0.490740"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:15.247302" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:15.242672" elapsed="0.005301"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:15.240250" elapsed="0.007813"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:15.240219" elapsed="0.007922"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:15.252882" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:15.249748" elapsed="0.003267"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:15.248256" elapsed="0.004832"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:15.248234" elapsed="0.004909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:15.254869" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:15.253815" elapsed="0.001128"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:15.255775" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:15.255136" elapsed="0.000737"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:15.256934" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:15.256233" elapsed="0.000755"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:15.255913" elapsed="0.001130"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:15.255112" elapsed="0.001969"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:15.258638" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:15.257685" elapsed="0.000999"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:15.259495" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:15.258854" elapsed="0.000775"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:15.260864" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:15.260108" elapsed="0.000808"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:15.259686" elapsed="0.001298"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:15.258833" elapsed="0.002192"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:15.261256" elapsed="0.000953"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:15.263456" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:15.262612" elapsed="0.000891"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:15.263824" elapsed="0.003210"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:15.238584" elapsed="0.028607"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:15.267453" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:15.267274" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:15.267253" elapsed="0.000276"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:15.277472" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:15.267701" elapsed="0.009817"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:15.277634" elapsed="0.000069"/>
</return>
<msg time="2026-04-10T00:51:15.277885" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:14.744242" elapsed="0.533679"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:15.278069" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:51:15.278245" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:14.582713" elapsed="0.695560"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:15.278782" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:15.278390" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:15.278369" elapsed="0.000603"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:15.279007" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:51:14.576538" elapsed="0.702603"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:51:14.571008" elapsed="0.708177"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:14.570864" elapsed="0.708358"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-10T00:51:14.568450" elapsed="0.710833"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:14.568177" elapsed="0.711138"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:14.568161" elapsed="0.711180"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:51:15.279891" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:15.279402" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:15.279384" elapsed="0.000599"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="PASS" start="2026-04-10T00:51:14.140467" elapsed="1.139570"/>
</kw>
<arg>${timeout}</arg>
<arg>10s</arg>
<arg>Verify_Members_Are_Ready</arg>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:50:53.840232" elapsed="21.439872"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement" type="TEARDOWN">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:15.283727" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:15.283193" elapsed="0.000564"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:15.284246" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:15.283927" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:15.284320" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:15.284482" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:15.282752" elapsed="0.001756"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:15.285638" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:15.285354" elapsed="0.000311"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:15.286508" level="INFO">index=143
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:51:15.286352" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:15.290176" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:15.289440" elapsed="0.000907"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:15.289421" elapsed="0.000955"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:15.290698" level="INFO">index=143
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:51:15.290530" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:15.292576" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:15.291105" elapsed="0.001528"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:15.293684" level="INFO">${conn_id} = 150</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:51:15.292880" elapsed="0.000831"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:51:15.295353" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:51:15.295693" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:51:15.294670" elapsed="0.001144"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:15.296207" elapsed="0.000833"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:51:15.298803" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:51:16.006317" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:51:15 UTC 2026

  System load:  0.96               Processes:             124
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:47 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:51:15.298414" elapsed="0.708208"/>
</kw>
<msg time="2026-04-10T00:51:16.006755" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:15.297436" elapsed="0.709572"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:51:15.293982" elapsed="0.713263"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:51:16.007882" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:51:16.020830" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:51:16.021426" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:51:16.021511" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:51:16.007512" elapsed="0.014091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:51:16.022042" elapsed="0.000561"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:16.023851" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:16.022978" elapsed="0.000960"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:51:16.024363" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:16.024101" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:16.024055" elapsed="0.000411"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:51:16.024742" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T00:51:16.024536" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:16.024515" elapsed="0.000349"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:51:16.024911" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:16.033521" elapsed="0.000294"/>
</kw>
<msg time="2026-04-10T00:51:16.033900" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:16.032105" elapsed="0.001932"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:16.034376" elapsed="0.000054"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:16.034985" elapsed="0.000058"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:16.025408" elapsed="0.009846"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:51:15.288782" elapsed="0.746582"/>
</kw>
<msg time="2026-04-10T00:51:16.035423" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:15.288045" elapsed="0.747445"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:51:15.287387" elapsed="0.748205"/>
</kw>
<msg time="2026-04-10T00:51:16.035637" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:15.286819" elapsed="0.748967"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:16.039898" elapsed="0.000188"/>
</kw>
<msg time="2026-04-10T00:51:16.040149" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:16.039120" elapsed="0.001130"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:16.040424" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:16.040631" elapsed="0.000024"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:16.036136" elapsed="0.004592"/>
</kw>
<msg time="2026-04-10T00:51:16.040829" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:51:15.285886" elapsed="0.754970"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:16.041352" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:16.041076" elapsed="0.000322"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:51:16.041449" elapsed="0.000040"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:51:15.284914" elapsed="0.756869"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:15.284731" elapsed="0.757092"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:16.042926" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:16.042641" elapsed="0.000313"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:16.043897" level="INFO">index=143
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:51:16.043709" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:16.047679" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:16.046864" elapsed="0.000986"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:16.046837" elapsed="0.001043"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:16.048181" level="INFO">index=143
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:51:16.048043" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:16.049458" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:16.048538" elapsed="0.000971"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:16.050462" level="INFO">${conn_id} = 151</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:51:16.049692" elapsed="0.000798"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:51:16.052572" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:51:16.052842" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:51:16.051861" elapsed="0.001097"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:16.053323" elapsed="0.000828"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:51:16.056026" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:51:16.377455" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:50:53 UTC 2026

  System load:  0.35               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.169
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:50:53 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:51:16.055503" elapsed="0.322353"/>
</kw>
<msg time="2026-04-10T00:51:16.377989" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:16.054515" elapsed="0.323674"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:51:16.050776" elapsed="0.327680"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:51:16.379090" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:51:16.391743" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:51:16.392295" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:51:16.392395" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:51:16.378743" elapsed="0.013704"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:51:16.393014" elapsed="0.000635"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:16.395167" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:16.394086" elapsed="0.001209"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:51:16.395879" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:16.395482" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:16.395430" elapsed="0.000616"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:51:16.396584" elapsed="0.000071"/>
</return>
<status status="PASS" start="2026-04-10T00:51:16.396164" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:16.396130" elapsed="0.000661"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:51:16.396901" elapsed="0.000048"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:16.402770" elapsed="0.000251"/>
</kw>
<msg time="2026-04-10T00:51:16.403091" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:16.401437" elapsed="0.001780"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:16.403569" elapsed="0.000055"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:16.403902" elapsed="0.000051"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:16.397721" elapsed="0.006389"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:51:16.046162" elapsed="0.358045"/>
</kw>
<msg time="2026-04-10T00:51:16.404263" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:16.045402" elapsed="0.358922"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:51:16.044808" elapsed="0.359593"/>
</kw>
<msg time="2026-04-10T00:51:16.404443" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:16.044231" elapsed="0.360270"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:16.408412" elapsed="0.000181"/>
</kw>
<msg time="2026-04-10T00:51:16.408643" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:16.407817" elapsed="0.000890"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:16.408893" elapsed="0.000029"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:16.409072" elapsed="0.000021"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:16.404824" elapsed="0.004331"/>
</kw>
<msg time="2026-04-10T00:51:16.409252" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:51:16.043177" elapsed="0.366100"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:16.409804" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:16.409481" elapsed="0.000365"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:51:16.409892" elapsed="0.000033"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:51:16.042140" elapsed="0.367960"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:51:16.041934" elapsed="0.368204"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:16.411297" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:16.410993" elapsed="0.000333"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:16.412275" level="INFO">index=143
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:51:16.412136" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:16.415906" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:16.415165" elapsed="0.000909"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:16.415142" elapsed="0.000961"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:16.416382" level="INFO">index=143
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:51:16.416257" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:16.417768" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:16.416800" elapsed="0.001034"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:16.418850" level="INFO">${conn_id} = 152</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:51:16.418033" elapsed="0.000845"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:51:16.420447" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:51:16.420980" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:51:16.419765" elapsed="0.001331"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:16.421450" elapsed="0.000879"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:51:16.424035" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:51:17.049205" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:51:16 UTC 2026

  System load:  0.75               Processes:             122
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:49:48 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:51:16.423668" elapsed="0.625851"/>
</kw>
<msg time="2026-04-10T00:51:17.049748" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:16.422766" elapsed="0.627282"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:51:16.419103" elapsed="0.631346"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:51:17.051290" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:51:17.064466" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:51:17.065127" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:51:17.065236" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:51:17.050831" elapsed="0.014478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:51:17.065888" elapsed="0.000599"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:17.067994" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:17.067017" elapsed="0.001229"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:51:17.068862" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:17.068434" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.068384" elapsed="0.000647"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:51:17.069473" elapsed="0.000076"/>
</return>
<status status="PASS" start="2026-04-10T00:51:17.069150" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.069115" elapsed="0.000600"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:51:17.069795" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:17.077872" elapsed="0.000392"/>
</kw>
<msg time="2026-04-10T00:51:17.078364" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:17.075909" elapsed="0.002684"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.079085" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.079611" elapsed="0.000077"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:17.070692" elapsed="0.009225"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:51:16.414378" elapsed="0.665732"/>
</kw>
<msg time="2026-04-10T00:51:17.080212" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:16.413688" elapsed="0.666624"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:51:16.413097" elapsed="0.667351"/>
</kw>
<msg time="2026-04-10T00:51:17.080514" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:16.412581" elapsed="0.668115"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:17.084688" elapsed="0.000188"/>
</kw>
<msg time="2026-04-10T00:51:17.084925" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:17.084059" elapsed="0.000928"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.085150" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.085319" elapsed="0.000021"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:17.081174" elapsed="0.004228"/>
</kw>
<msg time="2026-04-10T00:51:17.085495" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:51:16.411693" elapsed="0.673826"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:17.086032" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:17.085761" elapsed="0.000312"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:51:17.086122" elapsed="0.000034"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:51:16.410434" elapsed="0.675825"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:51:16.410241" elapsed="0.676056"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:15.284592" elapsed="1.801742"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:51:15.280390" elapsed="1.806006"/>
</kw>
<arg>${index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${timeout}</arg>
<arg>check_system_status=${check_system_status}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>service_list=${service_list}</arg>
<doc>If the list is empty, start all cluster members. Otherwise, start members based on present indices.
If True, wait for cluster sync on listed members.
Optionally karaf_home can be overriden. Optionally specific JAVA_HOME is used for starting.
Garbage collection is unconditionally logged to files. TODO: Make that reasonable conditional?</doc>
<status status="PASS" start="2026-04-10T00:50:53.056321" elapsed="24.030129"/>
</kw>
<arg>${Inventory_Leader}</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="PASS" start="2026-04-10T00:50:52.903512" elapsed="24.183012"/>
</kw>
<doc>Restart Leader Node.</doc>
<status status="PASS" start="2026-04-10T00:50:52.593578" elapsed="24.493098"/>
</test>
<test id="s1-s2-t11" name="Check Shards Status After Leader Restart" line="115">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:51:17.090923" elapsed="0.000291"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:51:17.090620" elapsed="0.000680"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:17.092466" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:17.092325" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.092301" elapsed="0.000247"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:17.098352" elapsed="0.000248"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:17.098170" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.098144" elapsed="0.000549"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:17.100009" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:17.099488" elapsed="0.000553"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:17.100529" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:17.100208" elapsed="0.000381"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:17.100667" elapsed="0.000086"/>
</return>
<msg time="2026-04-10T00:51:17.100900" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:17.099010" elapsed="0.001917"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:17.107187" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:17.107064" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.107043" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:17.108623" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:17.108467" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.108444" elapsed="0.000267"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:17.109288" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:17.108917" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:17.109771" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:17.109487" elapsed="0.000312"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:17.145768" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:17.110341" elapsed="0.035679"/>
</kw>
<msg time="2026-04-10T00:51:17.146261" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:17.146311" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:17.109986" elapsed="0.036363"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:17.227395" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:17.147093" elapsed="0.080630"/>
</kw>
<msg time="2026-04-10T00:51:17.227967" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:17.228018" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:17.146645" elapsed="0.081412"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.228521" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:17.228189" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.228149" elapsed="0.000493"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:17.229208" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:17.228794" elapsed="0.000609"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.229732" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:17.229478" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.229458" elapsed="0.000399"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:17.229898" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:17.232954" elapsed="0.000175"/>
</kw>
<msg time="2026-04-10T00:51:17.233201" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:17.231639" elapsed="0.001720"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.233681" elapsed="0.000172"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.234621" elapsed="0.000199"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:17.230856" elapsed="0.004252"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:17.230239" elapsed="0.005032"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:17.108139" elapsed="0.127383"/>
</kw>
<msg time="2026-04-10T00:51:17.235824" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:17.235924" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:17.107436" elapsed="0.128577"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:17.236474" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-04-10T00:51:17.236217" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.236172" elapsed="0.000654"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.238093" elapsed="0.000077"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.238702" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:17.238812" elapsed="0.000025"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:17.106682" elapsed="0.132300"/>
</kw>
<msg time="2026-04-10T00:51:17.239135" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:17.239211" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:17.101383" elapsed="0.137888"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.239823" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:17.239392" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.239366" elapsed="0.000573"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:17.101181" elapsed="0.138793"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:17.248211" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:17.248077" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.248055" elapsed="0.000235"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:17.249677" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:17.249525" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.249506" elapsed="0.000244"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:17.250296" level="INFO">${karaf_connection_index} = 148</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:17.249943" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:17.250776" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:17.250505" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:17.251689" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:51:17.251336" elapsed="0.001510">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:51:17.253054" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:51:17.253101" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:17.250976" elapsed="0.002149"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:17.254076" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:51:17.253733" elapsed="0.001057">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:51:17.254989" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:51:17.255035" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:17.253299" elapsed="0.001760"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:51:17.256064" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Leader Restart"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:51:17.255372" elapsed="0.000757">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Leader Restart"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:51:17.255140" elapsed="0.001061">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Leader Restart"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:51:17.255120" elapsed="0.001115">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Leader Restart"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.256404" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.256653" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:17.256493" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:17.256476" elapsed="0.000255"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:51:17.256764" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:17.259909" elapsed="0.000178"/>
</kw>
<msg time="2026-04-10T00:51:17.260158" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:17.258636" elapsed="0.001666"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.260629" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.261000" elapsed="0.000085"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:17.257670" elapsed="0.003547"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:17.257052" elapsed="0.004232"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:51:17.249204" elapsed="0.012167">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Leader Restart"</status>
</kw>
<msg time="2026-04-10T00:51:17.261474" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:51:17.261519" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Leader Restart"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:17.248479" elapsed="0.013067"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:17.261764" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:17.261653" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.261634" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:17.262808" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:17.262696" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.262675" elapsed="0.000201"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:17.263175" level="INFO">index=143
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:51:17.263032" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:17.263831" level="INFO">{1: 88, 2: 148, 3: 92}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:17.263523" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:17.264317" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:17.264039" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:17.264999" elapsed="0.000290"/>
</kw>
<msg time="2026-04-10T00:51:17.265390" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:17.265438" level="INFO">${old_connection_index} = 148</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:17.264580" elapsed="0.000898"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:17.266458" elapsed="0.000507"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:17.268455" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:51:17.267740" elapsed="0.001800">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:17.267185" elapsed="0.002498"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:51:17.270448" elapsed="0.000348"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:17.269866" elapsed="0.001022"/>
</kw>
<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="PASS" start="2026-04-10T00:51:17.265873" elapsed="0.005062"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:17.265615" elapsed="0.005368"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.265592" elapsed="0.005420"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:17.272008" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:17.271619" elapsed="0.000418"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:51:17.272111" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:51:17.272310" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:17.271250" elapsed="0.001085"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:51:17.272500" elapsed="0.000472"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:17.273309" level="INFO">index=153
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:51:17.276958" elapsed="0.542506"/>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:17.834787" elapsed="0.000424"/>
</kw>
<msg time="2026-04-10T00:51:17.835315" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:17.833270" elapsed="0.002209"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.835997" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:17.836165" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:17.820725" elapsed="0.015530"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:17.819957" elapsed="0.016347"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:51:17.262275" elapsed="0.574082"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:17.837231" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:17.837108" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:17.837083" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:17.837709" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:17.837458" elapsed="0.000278"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:17.838068" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:17.837890" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:17.926231" 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 "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:17.838672" elapsed="0.087770"/>
</kw>
<msg time="2026-04-10T00:51:17.926668" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:17.926720" 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 "t "e "s "t "[C "o "p "e "n "f "l "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:17.838254" elapsed="0.088507"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:18.085891" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:17.927570" elapsed="0.158539"/>
</kw>
<msg time="2026-04-10T00:51:18.086278" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:18.086328" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:17.927036" elapsed="0.159331"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.086896" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.086517" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.086482" elapsed="0.000507"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.087488" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.087140" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.087934" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.087704" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.087685" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:18.088056" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:18.091072" elapsed="0.000437"/>
</kw>
<msg time="2026-04-10T00:51:18.091624" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:18.089578" elapsed="0.002223"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.091977" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.092149" elapsed="0.000021"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:18.089039" elapsed="0.003294"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:18.088391" elapsed="0.003991"/>
</kw>
<msg time="2026-04-10T00:51:18.092518" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:17.836769" elapsed="0.255843"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:18.092668" 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-04-10T00:51:17.247627" elapsed="0.845186"/>
</kw>
<msg time="2026-04-10T00:51:18.092918" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:18.092964" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:17.240408" elapsed="0.852597"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.093359" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.093091" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.093072" elapsed="0.000366"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:51:17.240185" elapsed="0.853277"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.099832" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:18.099708" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.099686" elapsed="0.000231"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.101210" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:18.101099" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.101080" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:18.101791" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.101435" elapsed="0.000383"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:18.102225" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:18.101994" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:18.141701" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:18.102782" elapsed="0.039201"/>
</kw>
<msg time="2026-04-10T00:51:18.142227" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:18.142279" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:18.102413" elapsed="0.039907"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:18.212413" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:18.144007" elapsed="0.068737"/>
</kw>
<msg time="2026-04-10T00:51:18.212993" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:18.213047" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:18.142825" elapsed="0.070263"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.213697" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.213235" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.213182" elapsed="0.000611"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.214389" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.213965" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.214969" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.214719" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.214697" elapsed="0.000358"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:18.215096" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:18.218140" elapsed="0.000169"/>
</kw>
<msg time="2026-04-10T00:51:18.218392" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:18.216783" elapsed="0.001797"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.218932" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.219354" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:18.216080" elapsed="0.003666"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:18.215438" elapsed="0.004403"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:18.100773" elapsed="0.119177"/>
</kw>
<msg time="2026-04-10T00:51:18.220057" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:18.220103" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:18.100091" elapsed="0.120052"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:18.220351" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:51:18.220231" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.220210" elapsed="0.000233"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.220897" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.221253" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.221333" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:18.099284" elapsed="0.122163"/>
</kw>
<msg time="2026-04-10T00:51:18.221618" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:18.221665" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:18.093816" elapsed="0.127889"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.222044" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.221784" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.221767" elapsed="0.000356"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:51:18.093648" elapsed="0.128500"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:17.100992" elapsed="1.121192"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:51:17.097618" elapsed="1.124628"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:51:17.091988" elapsed="1.130322"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:17.091465" elapsed="1.130901"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:51:17.087731" elapsed="1.134695"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.245745" elapsed="0.000253"/>
</kw>
<msg time="2026-04-10T00:51:18.246056" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:18.244988" elapsed="0.001125"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:51:18.244453" elapsed="0.001825"/>
</kw>
<msg time="2026-04-10T00:51:18.246326" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:18.235493" elapsed="0.010877"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:51:18.235072" elapsed="0.011372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.246916" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.246653" elapsed="0.000308"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.252523" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:18.252011" elapsed="0.000573"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.253175" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:18.252800" elapsed="0.000413"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:18.253278" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:51:18.253504" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:18.251525" elapsed="0.002011"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:51:18.253807" elapsed="0.000180"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.254577" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:18.254183" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.255132" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:18.254830" elapsed="0.000338"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.255773" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:18.255329" elapsed="0.000470"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.259085" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.258468" elapsed="0.000646"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:18.259165" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:51:18.259324" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:18.258007" elapsed="0.001343"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.319563" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.319135" elapsed="0.000465"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:18.320441" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:18.320127" elapsed="0.000393">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:18.320635" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:18.319780" elapsed="0.000881"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.321223" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:18.320833" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:18.321580" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:18.321852" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:18.321416" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.322325" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.322041" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.325110" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.323133" elapsed="0.002025"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.325637" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.325335" 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-04-10T00:51:18.326011" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.326263" 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-04-10T00:51:18.326453" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:18.325868" elapsed="0.000644"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.325720" elapsed="0.000825"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:18.326612" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:51:18.326788" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:18.322803" elapsed="0.004011"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.322457" elapsed="0.004389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.327025" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.326873" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.322432" elapsed="0.004671"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.327735" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.327249" elapsed="0.000514"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:18.327812" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:18.318467" elapsed="0.009470"/>
</kw>
<msg time="2026-04-10T00:51:18.327991" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:18.305228" elapsed="0.022815"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.340702" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.353477" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.366112" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.366374" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.366744" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.367200" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.367044" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:18.367024" 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-04-10T00:51:18.367434" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.367624" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.367795" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:18.366981" elapsed="0.000868"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.366844" elapsed="0.001034"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.368029" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.368113" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:51:18.368496" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:18.300530" elapsed="0.068004"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:18.370467" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:18.370141" elapsed="0.000450">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:18.370690" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:18.369726" elapsed="0.000990"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.371065" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.370793" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.371652" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.371333" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.371146" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.370772" elapsed="0.000964"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.374396" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:18.371890" elapsed="0.002532"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:18.374476" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:51:18.374834" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:18.369219" elapsed="0.005650"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:18.376517" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:18.376269" elapsed="0.000331">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:18.376695" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:18.375924" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:18.376928" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:51:18.376792" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.376774" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.377164" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.377344" elapsed="0.000103"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.377497" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:18.380019" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:18.375463" elapsed="0.004595"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.382007" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.381669" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.382476" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.382222" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:18.398252" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:18.399444" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:18.400105" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:18.385018" elapsed="0.015168"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.382732" elapsed="0.017571"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.400832" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.400376" elapsed="0.000621"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.382711" elapsed="0.018339"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.409022" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.403856" elapsed="0.005596"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.403245" elapsed="0.006256"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.403184" elapsed="0.006350"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.412691" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.409936" elapsed="0.002803"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.409634" elapsed="0.003143"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.409608" elapsed="0.003193"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.413453" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.413014" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.413845" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.413591" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.414418" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.414102" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.413931" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.413568" elapsed="0.000939"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.415192" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.414707" elapsed="0.000513"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.415586" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.415295" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.416307" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.415852" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.415673" elapsed="0.000707"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.415275" elapsed="0.001129"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:18.416622" elapsed="0.000386"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:18.417505" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.417182" elapsed="0.000350"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.417720" elapsed="0.002743"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:18.402009" elapsed="0.018531"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.420773" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:18.420649" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.420623" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:18.430585" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:18.421004" elapsed="0.009630"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:18.430721" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:51:18.431244" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:18.380692" elapsed="0.050592"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:18.431382" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:51:18.431762" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:18.275206" elapsed="0.156599"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.433043" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.432054" elapsed="0.001241"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.432030" elapsed="0.001309"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:18.433430" elapsed="0.000031"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:51:18.263825" elapsed="0.169836"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.259428" elapsed="0.174281"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.259407" elapsed="0.174327"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.434522" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:18.434390" elapsed="0.000248"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:51:18.434788" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:51:18.434664" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.434372" elapsed="0.000553"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.435135" elapsed="0.000024"/>
</kw>
<msg time="2026-04-10T00:51:18.435262" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:18.434055" elapsed="0.001234"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.435983" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.435481" elapsed="0.000533"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.436792" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.436177" elapsed="0.000644"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.444685" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.443771" elapsed="0.001086"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.445891" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.445137" elapsed="0.000982"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:18.456073" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:18.456151" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":277,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":277,"Leader":"member-3-shard-inventory-operational","LastIndex":278,"RaftState":"Follower","LastApplied":278,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":278,"LastLeadershipChangeTime":"2026-04-10 00:49:55.691","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"316.1 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":278,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":26193384},"timestamp":1775782278,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:18.456460" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:18.448819" elapsed="0.007708"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.446259" elapsed="0.010396"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.457261" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.456747" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.446219" elapsed="0.011314"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.465385" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":277,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":277,"Leader":"member-3-shard-inventory-operational","LastIndex":278,"RaftState":"Follower","LastApplied":278,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":278,"LastLeadershipChangeTime":"2026-04-10 00:49:55.691","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"316.1 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":278,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":26193384},"timestamp":1775782278,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.461244" elapsed="0.004219"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.460748" elapsed="0.004758"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.460672" elapsed="0.004967"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.468847" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.466116" elapsed="0.002806"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.465827" elapsed="0.003132"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.465755" elapsed="0.003260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.470051" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.469360" elapsed="0.000745"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.470569" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.470284" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.471224" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.470889" elapsed="0.000421"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.470694" elapsed="0.000658"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.470235" elapsed="0.001180"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.472220" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.471742" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.472708" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.472427" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.473341" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.473011" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.472830" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.472380" elapsed="0.001273"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:18.473951" elapsed="0.000488"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:18.475144" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.474744" elapsed="0.000455"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.475703" elapsed="0.002730"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:18.458951" elapsed="0.019615"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.478998" elapsed="0.000067"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:18.478724" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.478691" elapsed="0.000482"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:18.483071" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:18.479494" elapsed="0.003677"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:18.483265" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:51:18.483624" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:18.437862" elapsed="0.045875"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:18.483802" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:18.483961" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:18.437049" elapsed="0.046939"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.485422" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.484694" elapsed="0.000757"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:18.485501" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:18.485700" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:18.484241" elapsed="0.001486"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:18.486115" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 278, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.485887" elapsed="0.000256"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:18.486539" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.486302" elapsed="0.000280"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:18.486631" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:18.486786" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:18.257321" elapsed="0.229489"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:18.486868" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:51:18.487016" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:18.256251" elapsed="0.230789"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.487383" elapsed="0.000213"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.487126" elapsed="0.000508"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.487806" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.487659" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.488026" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.487883" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.487108" elapsed="0.000991"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:18.256073" elapsed="0.232051"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.490790" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.490300" elapsed="0.000518"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:18.490863" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:18.491037" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:18.489927" elapsed="0.001135"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.551208" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.550793" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:18.552169" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:18.551798" elapsed="0.000552">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:18.552448" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:18.551425" elapsed="0.001048"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.553059" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:18.552664" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:18.553403" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:18.553597" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:18.553251" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.554043" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.553787" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.555112" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.554845" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.555627" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.555328" elapsed="0.000328"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.556031" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.556239" 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-04-10T00:51:18.556421" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:18.555887" elapsed="0.000594"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.555711" elapsed="0.000800"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:18.556580" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:51:18.556752" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:18.554488" elapsed="0.002292"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.554174" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.556991" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.556838" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.554149" elapsed="0.002919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.557681" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.557213" elapsed="0.000496"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:18.557758" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:18.550115" elapsed="0.007775"/>
</kw>
<msg time="2026-04-10T00:51:18.557946" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:18.537060" elapsed="0.020938"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.571036" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.583855" elapsed="0.000047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.596742" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.597039" 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-04-10T00:51:18.597236" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.597698" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.597521" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:18.597501" elapsed="0.000283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.597929" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.598100" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.598267" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:18.597455" elapsed="0.000865"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.597329" elapsed="0.001020"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.598498" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.598595" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:51:18.598970" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:18.532445" elapsed="0.066565"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:18.601122" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:18.600754" elapsed="0.000450">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:18.601302" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:18.600296" elapsed="0.001032"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.601730" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.601416" elapsed="0.000375"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.602305" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.602002" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.601817" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.601394" elapsed="0.001000"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.604895" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:18.602564" elapsed="0.002358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:18.604977" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:51:18.605292" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:18.599671" elapsed="0.005658"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:18.607027" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:18.606781" elapsed="0.000311">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:18.607242" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:18.606416" elapsed="0.000852"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:18.607478" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:51:18.607341" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.607323" 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-04-10T00:51:18.607734" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.607908" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.607974" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:18.610315" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:18.605957" elapsed="0.004396"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.612163" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.611897" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.612662" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.612401" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:18.640172" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:18.641273" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:18.641833" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:18.614888" elapsed="0.027020"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.612773" elapsed="0.029240"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.642497" elapsed="0.000084"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.642089" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.612755" elapsed="0.029986"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.650463" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.645304" elapsed="0.005500"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.644758" elapsed="0.006083"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.644713" elapsed="0.006152"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.653669" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.651149" elapsed="0.002566"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.650923" elapsed="0.002827"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.650906" elapsed="0.002867"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.654427" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.653965" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.654793" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.654537" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.655365" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.655040" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.654876" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.654518" elapsed="0.000930"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.655995" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.655623" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.656334" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.656092" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.656955" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.656646" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.656426" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.656074" elapsed="0.000964"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:18.657256" elapsed="0.000384"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:18.658135" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.657820" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.658327" elapsed="0.002739"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:18.643648" elapsed="0.017496"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.661335" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:18.661216" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.661197" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:18.670242" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:18.661601" elapsed="0.008671"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:18.670324" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:51:18.670757" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:18.610964" elapsed="0.059831"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:18.670899" elapsed="0.000075"/>
</return>
<msg time="2026-04-10T00:51:18.671255" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:18.507364" elapsed="0.163933"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.672297" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.671506" elapsed="0.000976"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.671487" elapsed="0.001036"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:18.672630" elapsed="0.000067"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:51:18.495621" elapsed="0.177249"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.491333" elapsed="0.181583"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.491113" elapsed="0.181828"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.673709" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:18.673567" elapsed="0.000237"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:51:18.673961" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:18.673840" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.673533" elapsed="0.000575"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.674269" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:51:18.674391" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:18.673246" elapsed="0.001171"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.675047" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.674615" elapsed="0.000458"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.675843" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.675242" elapsed="0.000631"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.683208" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.682486" elapsed="0.000891"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.684380" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.683701" elapsed="0.000840"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:18.702651" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:18.702795" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":277,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":277,"Leader":"member-3-shard-inventory-operational","LastIndex":278,"RaftState":"Follower","LastApplied":278,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational","LastLogIndex":278,"LastLeadershipChangeTime":"2026-04-10 00:51:03.934","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"3.986 ms","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-3-shard-inventory-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":278,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":5703943},"timestamp":1775782278,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:18.703273" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:18.687069" elapsed="0.016285"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.684688" elapsed="0.018798"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.704395" elapsed="0.000104"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.703675" elapsed="0.000990"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.684655" elapsed="0.020139"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.713676" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":277,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":277,"Leader":"member-3-shard-inventory-operational","LastIndex":278,"RaftState":"Follower","LastApplied":278,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational","LastLogIndex":278,"LastLeadershipChangeTime":"2026-04-10 00:51:03.934","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"3.986 ms","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-3-shard-inventory-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":278,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":5703943},"timestamp":1775782278,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.709784" elapsed="0.003980"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.709341" elapsed="0.004475"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.709271" elapsed="0.004610"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.717711" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.714399" elapsed="0.003360"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.714073" elapsed="0.003721"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.714010" elapsed="0.003829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.718635" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.718120" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.719092" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.718843" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.719724" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.719360" elapsed="0.000398"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.719192" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.718796" elapsed="0.001052"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.720682" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.720151" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.721239" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.720919" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.721834" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.721509" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.721343" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.720867" elapsed="0.001069"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:18.722190" elapsed="0.000461"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:18.723277" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.722913" elapsed="0.000415"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.723601" elapsed="0.002670"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:18.706822" elapsed="0.019571"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.726801" elapsed="0.000054"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:18.726537" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.726500" elapsed="0.000460"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:18.731010" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:18.727346" elapsed="0.003764"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:18.731209" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:51:18.731516" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:18.676877" elapsed="0.054671"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:18.731713" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:18.731872" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:18.676088" elapsed="0.055810"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.733478" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.732694" elapsed="0.000814"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:18.733578" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:18.733752" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:18.732174" elapsed="0.001605"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:18.734162" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 278, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.733938" elapsed="0.000251"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:18.734596" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.734345" elapsed="0.000279"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:18.734671" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:18.734828" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:18.489299" elapsed="0.245554"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:18.734912" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:51:18.735061" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:18.488481" elapsed="0.246605"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.735406" elapsed="0.000218"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.735178" elapsed="0.000483"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.735833" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.735685" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.736055" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.735911" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.735158" elapsed="0.000970"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:51:18.488307" elapsed="0.247845"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.738980" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.738486" elapsed="0.000521"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:18.739052" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:18.739201" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:18.738113" elapsed="0.001113"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.799633" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.799108" elapsed="0.000564"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:18.800536" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:18.800225" elapsed="0.000416">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:18.800867" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:18.799860" elapsed="0.001033"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.801490" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:18.801065" elapsed="0.000453"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:18.801914" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:18.802205" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:18.801759" elapsed="0.000472"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.802687" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.802400" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.803990" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.803713" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.804490" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.804207" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.804891" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.805112" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.805291" elapsed="0.000024"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:18.804748" elapsed="0.000606"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.804594" elapsed="0.000792"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:18.805439" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:51:18.805679" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:18.803258" elapsed="0.002447"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.802828" elapsed="0.002911"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.805952" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.805767" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.802799" elapsed="0.003239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.806689" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.806187" elapsed="0.000530"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:18.806768" elapsed="0.000032"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:18.798253" elapsed="0.008647"/>
</kw>
<msg time="2026-04-10T00:51:18.806958" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:18.784802" elapsed="0.022220"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.819905" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.834143" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.847146" elapsed="0.000076"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.847488" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.847703" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.848176" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.848019" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:18.847998" 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-04-10T00:51:18.848407" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.848596" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.848766" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:18.847953" elapsed="0.000866"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.847800" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.849000" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.849084" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:51:18.849475" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:18.780056" elapsed="0.069457"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:18.851622" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:18.851188" elapsed="0.000514">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:18.851799" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:18.850767" elapsed="0.001056"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.852170" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.851899" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.852757" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.852439" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.852250" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.851880" elapsed="0.000960"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.855349" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:18.852998" elapsed="0.002378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:18.855431" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:51:18.855783" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:18.850251" elapsed="0.005567"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:18.857569" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:18.857271" elapsed="0.000380">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:18.857844" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:18.856918" elapsed="0.000952"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:18.858151" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:51:18.857947" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.857928" elapsed="0.000312"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.858390" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.858619" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.858688" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:18.860972" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:18.856440" elapsed="0.004571"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.863010" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.862673" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.863463" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.863219" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:18.894814" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:18.895826" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:18.896384" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:18.865791" elapsed="0.030656"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.863598" elapsed="0.032994"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.897092" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.896669" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.863577" elapsed="0.033707"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.903983" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.899680" elapsed="0.004908"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.899287" elapsed="0.005357"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.899243" elapsed="0.005438"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.908562" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.905110" elapsed="0.003506"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.904768" elapsed="0.003884"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.904742" elapsed="0.003935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.909309" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.908888" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.909673" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.909412" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.910227" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.909923" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.909756" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.909393" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.910874" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.910492" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.911204" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.910971" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.911758" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.911445" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.911286" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.910952" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:18.912002" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:18.912869" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.912546" elapsed="0.000348"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:18.913050" elapsed="0.004271"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:18.898175" elapsed="0.019228"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.917655" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:18.917504" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.917477" elapsed="0.000261"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:18.926495" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:18.917910" elapsed="0.008633"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:18.926632" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:51:18.927122" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:18.861661" elapsed="0.065498"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:18.927254" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:51:18.927634" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:18.754818" elapsed="0.172859"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.928716" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.927887" elapsed="0.001047"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.927865" elapsed="0.001110"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:18.929065" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:51:18.743720" elapsed="0.185543"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.739490" elapsed="0.189818"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.739276" elapsed="0.190056"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:18.930121" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:18.929987" elapsed="0.000227"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:51:18.930364" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:51:18.930239" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.929970" elapsed="0.000636"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.930803" elapsed="0.000024"/>
</kw>
<msg time="2026-04-10T00:51:18.930930" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:18.929656" elapsed="0.001300"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.931669" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:18.931152" elapsed="0.000544"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.932414" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:18.931853" elapsed="0.000592"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.940116" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.939328" elapsed="0.000964"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:18.941303" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.940611" elapsed="0.000862"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:18.954490" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:18.954625" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":70,"SnapshotIndex":277,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":277,"Leader":"member-3-shard-inventory-operational","LastIndex":278,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-10 00:51:16.962","LastApplied":278,"LastLogIndex":278,"LastLeadershipChangeTime":"2026-04-10 00:49:55.689","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.357","active":true,"matchIndex":278,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":279},{"timeSinceLastActivity":"00:00:00.357","active":true,"matchIndex":278,"voting":true,"id":"member-2-shard-inventory-operational","nextIndex":279}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"795.6 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":52,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":278,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":18267258},"timestamp":1775782278,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:18.954996" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:18.944394" elapsed="0.010643"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.941625" elapsed="0.013492"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:18.955636" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:18.955192" elapsed="0.000648"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.941586" elapsed="0.014315"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.022577" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":70,"SnapshotIndex":277,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":277,"Leader":"member-3-shard-inventory-operational","LastIndex":278,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-10 00:51:16.962","LastApplied":278,"LastLogIndex":278,"LastLeadershipChangeTime":"2026-04-10 00:49:55.689","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.357","active":true,"matchIndex":278,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":279},{"timeSinceLastActivity":"00:00:00.357","active":true,"matchIndex":278,"voting":true,"id":"member-2-shard-inventory-operational","nextIndex":279}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"795.6 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":52,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":278,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":18267258},"timestamp":1775782278,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:18.958232" elapsed="0.064466"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:18.957971" elapsed="0.064798"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:18.957921" elapsed="0.064983"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.026138" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.023466" elapsed="0.002725"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.023095" elapsed="0.003133"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.023034" elapsed="0.003243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.027132" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.026600" elapsed="0.000628"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.027662" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.027390" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.028328" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.027941" elapsed="0.000424"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.027770" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.027341" elapsed="0.001109"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.029237" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.028748" elapsed="0.000545"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.029726" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.029453" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.030315" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.030000" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.029832" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.029404" elapsed="0.001015"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:19.030706" elapsed="0.000447"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:19.031834" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.031448" elapsed="0.000439"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.032147" elapsed="0.002762"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:18.956836" elapsed="0.078204"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.035535" elapsed="0.000072"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:19.035262" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.035155" elapsed="0.000563"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:19.039733" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:19.035994" elapsed="0.003842"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:19.040096" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:51:19.040413" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:18.933505" elapsed="0.106936"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.040504" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:19.040741" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:18.932710" elapsed="0.108058"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.042316" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.041500" elapsed="0.000846"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:19.042396" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:19.042602" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:19.041053" elapsed="0.001577"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:19.043032" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 278, 'CommittedTransactionsCount': 52, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.042795" elapsed="0.000265"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:19.043508" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.043217" elapsed="0.000316"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:19.043598" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:19.043758" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:18.737480" elapsed="0.306302"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:19.043842" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:51:19.043994" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:18.736513" elapsed="0.307505"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.044340" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.044111" elapsed="0.000285"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.044718" elapsed="0.000207"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.044421" elapsed="0.000542"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.045140" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.044988" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.044091" elapsed="0.001123"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:51:18.736335" elapsed="0.308904"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:18.255849" elapsed="0.789424"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:51:19.045319" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:51:19.045522" level="INFO">${leader_list} = [3]</msg>
<msg time="2026-04-10T00:51:19.045588" level="INFO">${follower_list} = [1, 2]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:51:18.250804" elapsed="0.794810"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.046105" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:51:19.046181" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:51:19.045805" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.046595" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.046273" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.046256" elapsed="0.000421"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.049276" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:51:19.046817" elapsed="0.002512"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:51:19.049730" level="INFO">${leader} = 3</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.049510" elapsed="0.000247"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:51:19.049808" elapsed="0.000034"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:51:18.248021" elapsed="0.801955"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:51:18.247784" elapsed="0.802241"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.054955" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:19.054502" elapsed="0.000482"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.055489" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:19.055148" elapsed="0.000367"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:19.055577" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:51:19.055743" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:19.054109" elapsed="0.001659"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:51:19.055925" elapsed="0.000163"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.056606" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:19.056249" elapsed="0.000384"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.057034" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:19.056792" elapsed="0.000268"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.057451" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:19.057210" elapsed="0.000267"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.060309" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.059818" elapsed="0.000524"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:19.060392" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:51:19.060572" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:19.059308" elapsed="0.001291"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.123191" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.122732" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.124303" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:19.123853" elapsed="0.000537">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:19.124520" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:19.123413" elapsed="0.001162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.125192" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:19.124781" elapsed="0.000439"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.125547" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:19.125861" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:19.125394" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.126372" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.126105" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.127640" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.127354" elapsed="0.000334"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.128189" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.127904" 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-04-10T00:51:19.128627" 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-04-10T00:51:19.128894" 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-04-10T00:51:19.129141" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:19.128430" elapsed="0.000781"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.128274" elapsed="0.000972"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:19.129298" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:51:19.129479" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:19.126994" elapsed="0.002514"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.126564" elapsed="0.003008"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.129793" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.129612" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.126513" elapsed="0.003363"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.130627" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.130044" elapsed="0.000622"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.130731" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:19.121919" elapsed="0.008963"/>
</kw>
<msg time="2026-04-10T00:51:19.130949" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:19.108213" elapsed="0.022808"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.144412" elapsed="0.000077"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.157762" elapsed="0.000073"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.171031" elapsed="0.000075"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.171486" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.171701" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.172256" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.172037" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:19.172017" elapsed="0.000331"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.172529" elapsed="0.000051"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.172778" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.172982" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:19.171969" elapsed="0.001076"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.171800" elapsed="0.001279"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.173263" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.173362" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:51:19.173790" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:19.103052" elapsed="0.070778"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.175783" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:19.175440" elapsed="0.000421">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:19.175957" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:19.175016" elapsed="0.000966"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.176378" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.176058" elapsed="0.000378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.176968" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.176663" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.176462" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.176037" elapsed="0.001013"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.179469" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:19.177200" elapsed="0.002296"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:19.179563" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:51:19.179898" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:19.174500" elapsed="0.005433"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.181687" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:19.181394" elapsed="0.000367">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:19.181854" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:19.181047" elapsed="0.000831"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:19.182094" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:19.181954" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.181934" elapsed="0.000245"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.182419" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.182698" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.182768" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:19.185158" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:19.180593" elapsed="0.004604"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.187105" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.186818" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.187645" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.187310" 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-04-10T00:51:19.200280" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:19.200780" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:19.201743" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:19.189894" elapsed="0.011879"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.187764" elapsed="0.014070"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.202098" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.201873" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.187744" elapsed="0.014446"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.207134" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.203576" elapsed="0.004095"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.203312" elapsed="0.004413"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.203290" elapsed="0.004472"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.211926" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.208200" elapsed="0.003802"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.207852" elapsed="0.004203"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.207826" elapsed="0.004265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.213106" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.212458" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.213534" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.213258" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.214138" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.213811" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.213641" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.213230" elapsed="0.000995"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.214789" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.214391" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.215147" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.214891" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.215885" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.215510" elapsed="0.000404"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.215331" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.214873" elapsed="0.001100"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:19.216172" elapsed="0.000442"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:19.217114" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.216786" elapsed="0.000355"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.217302" elapsed="0.002867"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:19.202803" elapsed="0.017453"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.220568" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:19.220410" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.220324" elapsed="0.000326"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:19.230003" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:19.220827" elapsed="0.009233"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:19.230161" elapsed="0.000070"/>
</return>
<msg time="2026-04-10T00:51:19.230734" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:19.185841" elapsed="0.044938"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.230883" elapsed="0.000078"/>
</return>
<msg time="2026-04-10T00:51:19.231257" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:19.076909" elapsed="0.154400"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.232615" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.231593" elapsed="0.001276"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.231538" elapsed="0.001375"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.233008" 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="PASS" start="2026-04-10T00:51:19.065107" elapsed="0.168111"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.060676" elapsed="0.172601"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.060655" elapsed="0.172660"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.234190" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:19.234044" elapsed="0.000244"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:51:19.234453" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:51:19.234314" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.234025" elapsed="0.000592"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.234808" elapsed="0.000024"/>
</kw>
<msg time="2026-04-10T00:51:19.234941" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:19.233685" elapsed="0.001284"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.235854" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.235212" elapsed="0.000672"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.236774" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.236060" elapsed="0.000746"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.244888" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.243980" elapsed="0.001093"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.246138" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.245401" elapsed="0.000898"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:19.256494" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:19.256681" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":1,"SnapshotIndex":45,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":45,"Leader":"member-1-shard-topology-operational","LastIndex":46,"RaftState":"Leader","LastApplied":46,"LastCommittedTransactionTime":"2026-04-10 00:50:24.913","LastLogIndex":46,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.318","active":true,"matchIndex":46,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":47},{"timeSinceLastActivity":"00:00:00.318","active":true,"matchIndex":46,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":47}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"482.0 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":46,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":749},"timestamp":1775782279,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:19.257072" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:19.248991" elapsed="0.008140"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.246439" elapsed="0.010791"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.257948" elapsed="0.000084"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.257331" elapsed="0.000789"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.246399" elapsed="0.011977"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.266420" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":1,"SnapshotIndex":45,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":45,"Leader":"member-1-shard-topology-operational","LastIndex":46,"RaftState":"Leader","LastApplied":46,"LastCommittedTransactionTime":"2026-04-10 00:50:24.913","LastLogIndex":46,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.318","active":true,"matchIndex":46,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":47},{"timeSinceLastActivity":"00:00:00.318","active":true,"matchIndex":46,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":47}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"482.0 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":46,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":749},"timestamp":1775782279,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.262040" elapsed="0.004489"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.261628" elapsed="0.005045"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.261515" elapsed="0.005239"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.270682" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.267347" elapsed="0.003386"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.266969" elapsed="0.003801"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.266899" elapsed="0.003918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.271642" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.271124" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.272103" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.271851" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.272809" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.272428" elapsed="0.000410"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.272210" elapsed="0.000668"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.271803" elapsed="0.001194"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.273733" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.273267" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.274185" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.273939" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.274827" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.274473" elapsed="0.000381"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.274286" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.273891" elapsed="0.001039"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:19.275188" elapsed="0.000478"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:19.276296" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.275928" elapsed="0.000420"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.276630" elapsed="0.002648"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:19.259752" elapsed="0.019648"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.279866" elapsed="0.000054"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:19.279626" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.279517" elapsed="0.000508"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:19.283978" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:19.280263" elapsed="0.003814"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:19.284255" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:51:19.284597" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:19.238108" elapsed="0.046521"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.284690" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:19.284899" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:19.237093" elapsed="0.047834"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.286512" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.285735" elapsed="0.000811"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:19.286613" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:51:19.286822" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:19.285195" elapsed="0.001654"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:19.287255" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 46, 'CommittedTransactionsCount': 1, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.287012" elapsed="0.000272"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:19.287750" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.287446" elapsed="0.000331"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:19.287826" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:19.287987" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:19.058695" elapsed="0.229317"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:19.288071" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:51:19.288223" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:19.057944" elapsed="0.230304"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.288595" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.288341" elapsed="0.000313"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.288940" elapsed="0.000204"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.288682" elapsed="0.000499"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.289359" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.289205" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.288321" elapsed="0.001119"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:19.057764" elapsed="0.231701"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.292276" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.291786" elapsed="0.000518"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:19.292351" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:19.292503" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:19.291274" elapsed="0.001256"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.353886" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.353439" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.354930" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:19.354639" elapsed="0.000370">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:19.355103" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:19.354257" elapsed="0.000872"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.355776" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:19.355297" elapsed="0.000507"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.356116" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:19.356291" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:19.355971" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.356750" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.356476" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.357880" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.357621" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.358354" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.358086" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.358734" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.358940" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.359116" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:19.358595" elapsed="0.000579"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.358433" elapsed="0.000773"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:19.359255" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:51:19.359426" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:19.357262" elapsed="0.002189"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.356881" elapsed="0.002602"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.359677" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.359508" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.356857" elapsed="0.002898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.360348" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.359900" elapsed="0.000476"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.360423" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:19.352641" elapsed="0.007925"/>
</kw>
<msg time="2026-04-10T00:51:19.360623" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:19.339771" elapsed="0.020909"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.373659" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.386495" elapsed="0.000072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.399281" elapsed="0.000074"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.399634" 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-04-10T00:51:19.399829" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.400305" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.400144" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:19.400123" elapsed="0.000266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.400537" 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-04-10T00:51:19.400732" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.400902" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:19.400076" elapsed="0.000880"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.399926" elapsed="0.001058"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.401153" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.401240" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:51:19.401738" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:19.334960" elapsed="0.066818"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.403778" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:19.403423" elapsed="0.000438">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:19.403961" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:19.402992" elapsed="0.000993"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.404351" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.404064" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.404954" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.404646" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.404435" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.404043" elapsed="0.000997"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.407589" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:19.405202" elapsed="0.002415"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:19.407672" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:51:19.408000" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:19.402469" elapsed="0.005568"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.410084" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:19.409818" elapsed="0.000333">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:19.410245" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:19.409221" elapsed="0.001048"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:19.410500" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:51:19.410359" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.410335" elapsed="0.000358"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.410845" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.411022" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.411091" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:51:19.413397" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:19.408770" elapsed="0.004668"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.415335" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.415061" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.415878" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.415625" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:19.442179" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:19.443224" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:19.443839" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:19.418132" elapsed="0.025772"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.415992" elapsed="0.028036"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.444537" elapsed="0.000093"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.444115" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.415973" elapsed="0.028806"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.452101" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.447441" elapsed="0.005009"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.446866" elapsed="0.005622"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.446819" elapsed="0.005694"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.455284" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.452820" elapsed="0.002512"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.452590" elapsed="0.002783"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.452571" elapsed="0.002827"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.456009" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.455599" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.456350" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.456107" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.456944" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.456631" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.456445" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.456089" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.457589" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.457189" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.457989" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.457689" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.458570" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.458242" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.458080" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.457670" elapsed="0.000986"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:19.458813" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:19.459751" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.459331" elapsed="0.000447"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.459937" elapsed="0.002670"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:19.445689" elapsed="0.016986"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.462860" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:19.462747" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.462728" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:19.471721" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:19.463079" elapsed="0.008685"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:19.471834" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:51:19.472259" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:19.414095" elapsed="0.058203"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.472397" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:51:19.472795" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:19.308818" elapsed="0.164022"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.473906" elapsed="0.000102"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.473054" elapsed="0.001101"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.473030" elapsed="0.001170"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.474293" elapsed="0.000031"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:51:19.297171" elapsed="0.177327"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.292916" elapsed="0.181633"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.292604" elapsed="0.181990"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.475381" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:19.475248" elapsed="0.000230"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:51:19.475647" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:19.475504" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.475230" elapsed="0.000563"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.475968" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:51:19.476091" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:19.474908" elapsed="0.001210"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.476780" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.476302" elapsed="0.000513"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.477612" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.476986" elapsed="0.000658"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.485073" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.484299" elapsed="0.000947"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.486293" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.485515" elapsed="0.000944"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:19.498226" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:19.498325" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":46,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":45,"Leader":"member-1-shard-topology-operational","LastIndex":46,"RaftState":"Follower","LastApplied":46,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:51:03.906","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"855.8 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":46,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782279,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:19.498944" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:19.489015" elapsed="0.010021"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.486610" elapsed="0.012581"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.500253" elapsed="0.000135"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.499372" elapsed="0.001156"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.486571" elapsed="0.014146"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.509693" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":46,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":45,"Leader":"member-1-shard-topology-operational","LastIndex":46,"RaftState":"Follower","LastApplied":46,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:51:03.906","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"855.8 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":46,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782279,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.505970" elapsed="0.003796"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.505313" elapsed="0.004493"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.505208" elapsed="0.004647"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.512739" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.510289" elapsed="0.002499"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.509997" elapsed="0.002826"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.509952" elapsed="0.002917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.513748" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.513165" elapsed="0.000637"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.514278" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.513961" elapsed="0.000384"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.514924" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.514584" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.514392" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.513912" elapsed="0.001117"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.515744" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.515283" elapsed="0.000516"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.516199" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.515953" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.516801" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.516465" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.516301" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.515906" elapsed="0.001000"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:19.517167" elapsed="0.000450"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:19.518296" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.517890" elapsed="0.000462"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.518659" elapsed="0.002583"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:19.502880" elapsed="0.018481"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.521748" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:19.521496" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.521462" elapsed="0.000455"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:19.525768" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:19.522152" elapsed="0.003711"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:19.525964" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:51:19.526259" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:19.478706" elapsed="0.047611"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.526470" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:19.526647" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:19.477875" elapsed="0.048800"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.528359" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.527378" elapsed="0.001011"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:19.528439" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:19.528643" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:19.526944" elapsed="0.001727"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:19.529076" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 46, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.528832" elapsed="0.000273"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:19.529698" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.529264" elapsed="0.000460"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:19.529773" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:19.529932" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:19.290652" elapsed="0.239304"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:19.530024" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:51:19.530189" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:19.289871" elapsed="0.240343"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.530629" elapsed="0.000201"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.530366" elapsed="0.000502"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.531047" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.530892" elapsed="0.000218"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.531281" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.531133" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.530289" elapsed="0.001065"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:51:19.289672" elapsed="0.241707"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.534135" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.533652" elapsed="0.000514"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:19.534211" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:19.536457" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:19.533256" elapsed="0.003228"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.598496" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.598015" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.599481" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:19.599159" elapsed="0.000436">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:19.599811" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:19.598776" elapsed="0.001061"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.600414" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:19.600009" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.600798" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:19.600983" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:19.600646" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.601427" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.601174" 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-04-10T00:51:19.602624" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.602333" elapsed="0.000338"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.603166" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.602886" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.603542" elapsed="0.000046"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.603786" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.603969" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:19.603400" elapsed="0.000630"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.603248" elapsed="0.000813"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:19.604111" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:51:19.604288" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:19.601982" elapsed="0.002332"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.601600" elapsed="0.002748"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.604528" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.604374" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.601546" elapsed="0.003094"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.605391" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.604840" elapsed="0.000582"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.605481" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:19.597159" elapsed="0.008495"/>
</kw>
<msg time="2026-04-10T00:51:19.605726" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:19.583662" elapsed="0.022128"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.619252" elapsed="0.000072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.632591" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.646069" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.646321" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.646512" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.647195" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.646972" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:19.646949" elapsed="0.000343"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.647442" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.647659" 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-04-10T00:51:19.647863" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:19.646897" elapsed="0.001030"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.646738" elapsed="0.001220"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.648113" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.648196" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:51:19.648616" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:19.578842" elapsed="0.069835"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.650761" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:19.650379" elapsed="0.000480">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:19.650978" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:19.649925" elapsed="0.001079"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.651402" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.651124" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.652036" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.651690" elapsed="0.000374"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.651487" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.651102" elapsed="0.001021"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.654590" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:19.652279" elapsed="0.002340"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:19.654672" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:51:19.655042" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:19.649355" elapsed="0.005759"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.656891" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:19.656610" elapsed="0.000355">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:19.657158" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:19.656246" elapsed="0.000938"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:19.657397" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:19.657259" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.657240" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.657713" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.657918" elapsed="0.000028"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.658000" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:19.660424" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:19.655738" elapsed="0.004724"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.662429" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.662148" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.662958" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.662708" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:19.685435" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:19.685961" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:19.686260" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:19.665284" elapsed="0.021005"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.663116" elapsed="0.023225"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.686634" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.686377" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.663086" elapsed="0.023648"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.691042" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.687996" elapsed="0.003448"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.687750" elapsed="0.003733"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.687727" elapsed="0.003781"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.694292" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.691837" elapsed="0.002506"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.691588" elapsed="0.002795"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.691568" elapsed="0.002841"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.695137" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.694640" elapsed="0.000524"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.695587" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.695237" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.696204" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.695887" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.695673" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.695217" elapsed="0.001071"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.696891" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.696450" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.697225" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.696991" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.698154" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.697465" elapsed="0.000716"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.697307" elapsed="0.000912"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.696972" elapsed="0.001268"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:19.698401" elapsed="0.000406"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:19.699311" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.699003" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.699569" elapsed="0.002532"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:19.687141" elapsed="0.015034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.702366" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:19.702251" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.702231" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:19.711304" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:19.702609" elapsed="0.008730"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:19.711401" elapsed="0.000095"/>
</return>
<msg time="2026-04-10T00:51:19.711875" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:19.661140" elapsed="0.050773"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.712007" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:51:19.712346" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:19.552477" elapsed="0.159910"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.713407" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.712614" elapsed="0.001021"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.712592" elapsed="0.001085"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.713765" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:51:19.540865" elapsed="0.173096"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.536584" elapsed="0.177424"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.536540" elapsed="0.177494"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.714799" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:19.714670" elapsed="0.000222"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:51:19.715035" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:51:19.714917" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.714652" elapsed="0.000517"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.715338" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:51:19.715483" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:19.714334" elapsed="0.001175"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.716156" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.715708" elapsed="0.000475"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.716919" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.716340" elapsed="0.000608"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.724093" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.723362" elapsed="0.000894"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.725210" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.724516" elapsed="0.000857"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:19.734679" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:19.734826" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":45,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":45,"Leader":"member-1-shard-topology-operational","LastIndex":46,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":46,"LastLogIndex":46,"LastLeadershipChangeTime":"2026-04-10 00:49:56.054","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"175.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":46,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":10877},"timestamp":1775782279,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:19.735315" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:19.727933" elapsed="0.007462"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.725491" elapsed="0.010036"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.736453" elapsed="0.000135"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.735729" elapsed="0.000990"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.725458" elapsed="0.011383"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.745697" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":45,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":45,"Leader":"member-1-shard-topology-operational","LastIndex":46,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":46,"LastLogIndex":46,"LastLeadershipChangeTime":"2026-04-10 00:49:56.054","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"175.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":46,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":10877},"timestamp":1775782279,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.741506" elapsed="0.004290"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.740972" elapsed="0.004880"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.740902" elapsed="0.005018"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.749566" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.746471" elapsed="0.003146"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.746123" elapsed="0.003530"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.746056" elapsed="0.003644"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.750470" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.749991" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.751003" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.750752" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.751616" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.751273" elapsed="0.000371"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.751105" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.750705" elapsed="0.001038"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.752590" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.752130" elapsed="0.000513"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.753044" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.752799" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.753640" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.753312" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.753144" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.752753" elapsed="0.000991"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:19.754000" elapsed="0.000443"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:19.755100" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.754737" elapsed="0.000413"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.755408" elapsed="0.002863"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:19.738899" elapsed="0.019498"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.758840" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:19.758584" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.758512" elapsed="0.000486"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:19.762908" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:19.759267" elapsed="0.003738"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:19.763098" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:51:19.763397" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:19.717987" elapsed="0.045438"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.763595" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:19.763803" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:19.717165" elapsed="0.046668"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.765381" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.764586" elapsed="0.000824"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:19.765460" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:19.765657" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:19.764118" elapsed="0.001567"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:19.766079" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 46, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.765848" elapsed="0.000259"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:19.766504" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.766266" elapsed="0.000264"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:19.766657" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:19.766817" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:19.532629" elapsed="0.234213"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:19.766902" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:51:19.767054" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:19.531825" elapsed="0.235255"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.767397" elapsed="0.000219"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.767169" elapsed="0.000484"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.767845" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.767677" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.768071" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.767924" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.767150" elapsed="0.000994"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:51:19.531641" elapsed="0.236528"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:19.057530" elapsed="0.710675"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:51:19.768252" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:19.768493" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:51:19.768541" level="INFO">${follower_list} = [2, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:51:19.053360" elapsed="0.715263"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.769139" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:51:19.769219" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:51:19.768808" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.769571" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.769319" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.769300" elapsed="0.000351"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.772198" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:51:19.769792" elapsed="0.002455"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:51:19.772847" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.772645" elapsed="0.000228"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:51:19.772921" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:51:19.050399" elapsed="0.722684"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:51:19.050127" elapsed="0.723005"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.777951" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:19.777499" elapsed="0.000481"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.778458" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:19.778145" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:19.778530" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:51:19.778711" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:19.777106" elapsed="0.001630"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:51:19.778895" elapsed="0.000165"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.779578" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:19.779221" elapsed="0.000384"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.780183" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:19.779765" elapsed="0.000444"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.780626" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:19.780360" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.783381" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.782904" elapsed="0.000505"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:19.783456" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:51:19.783641" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:19.782457" elapsed="0.001210"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.849473" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.848878" elapsed="0.000642"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.850529" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:19.850167" elapsed="0.000474">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:19.850742" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:19.849767" elapsed="0.001000"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.851429" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:19.850957" elapsed="0.000509"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.851905" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:19.852139" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:19.851708" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.852927" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.852614" 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-04-10T00:51:19.854371" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.854057" elapsed="0.000370"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.855019" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.854662" 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-04-10T00:51:19.855518" elapsed="0.000046"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.855805" elapsed="0.000029"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.856035" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:19.855316" elapsed="0.000797"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.855124" elapsed="0.001029"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:19.856218" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:51:19.856496" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:19.853622" elapsed="0.002905"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.853108" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.856829" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.856624" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.853069" elapsed="0.003864"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.857792" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.857138" elapsed="0.000690"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.857894" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:19.847812" elapsed="0.010254"/>
</kw>
<msg time="2026-04-10T00:51:19.858143" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:19.830948" elapsed="0.027277"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.875017" elapsed="0.000090"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.891302" elapsed="0.000103"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.907605" elapsed="0.000091"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.908025" elapsed="0.000034"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.908277" 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-04-10T00:51:19.909080" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.908864" elapsed="0.000292"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:19.908836" elapsed="0.000355"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.909384" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.909636" elapsed="0.000030"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.909864" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:19.908777" elapsed="0.001162"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.908530" elapsed="0.001448"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.910183" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.910297" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:19.910806" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:19.825810" elapsed="0.085045"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.913248" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:19.912867" elapsed="0.000474">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:19.913459" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:19.912274" elapsed="0.001214"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.913955" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.913608" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.914677" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.914290" elapsed="0.000419"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.914057" elapsed="0.000692"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.913582" elapsed="0.001192"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.918055" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:19.914971" elapsed="0.003122"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:19.918166" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:51:19.918615" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:19.911673" elapsed="0.006984"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:19.921109" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:19.920661" elapsed="0.000535">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:19.921297" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:19.920149" elapsed="0.001173"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:19.921598" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:51:19.921412" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.921389" elapsed="0.000303"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.921852" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.922064" elapsed="0.000029"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.922151" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:51:19.925475" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:19.919412" elapsed="0.006125"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.928033" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.927688" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.928510" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.928260" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:19.940744" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:19.941482" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:19.941970" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:19.931006" elapsed="0.011017"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.928660" elapsed="0.013462"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.942485" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.942188" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.928635" elapsed="0.014029"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.949869" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.944395" elapsed="0.006112"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.944049" elapsed="0.006550"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.944017" elapsed="0.006628"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.955199" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.951176" elapsed="0.004095"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.950757" elapsed="0.004566"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.950723" elapsed="0.004634"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.956262" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.955683" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.956771" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.956408" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.957531" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.957142" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.956879" elapsed="0.000845"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.956380" elapsed="0.001381"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.958470" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.957991" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.958942" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.958630" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.959705" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.959277" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.959055" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.958605" elapsed="0.001215"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:19.960054" elapsed="0.000470"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:19.961260" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.960778" elapsed="0.000518"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:19.961515" elapsed="0.003491"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:19.943331" elapsed="0.021804"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.965369" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:19.965222" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.965197" elapsed="0.000261"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:19.975376" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:19.965645" elapsed="0.009781"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:19.975510" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:51:19.976000" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:19.926468" elapsed="0.049576"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.976148" elapsed="0.000085"/>
</return>
<msg time="2026-04-10T00:51:19.976630" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:19.799593" elapsed="0.177081"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.977914" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:19.976904" elapsed="0.001262"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.976874" elapsed="0.001341"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:19.978308" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:51:19.788461" elapsed="0.190053"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.783751" elapsed="0.194831"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.783728" elapsed="0.194882"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:19.979427" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:19.979286" elapsed="0.000237"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:51:19.979695" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:19.979567" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.979268" elapsed="0.000571"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:19.980065" elapsed="0.000026"/>
</kw>
<msg time="2026-04-10T00:51:19.980194" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:19.978932" elapsed="0.001289"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.980978" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:19.980449" elapsed="0.000558"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.981849" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:19.981203" elapsed="0.000686"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.991941" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.990776" elapsed="0.001400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:19.994062" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:19.992770" elapsed="0.001493"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:20.005700" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:20.005822" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":33,"SnapshotIndex":227,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":227,"Leader":"member-1-shard-default-operational","LastIndex":228,"RaftState":"Leader","LastApplied":228,"LastCommittedTransactionTime":"2026-04-10 00:51:05.746","LastLogIndex":228,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.023","active":true,"matchIndex":228,"voting":true,"id":"member-3-shard-default-operational","nextIndex":229},{"timeSinceLastActivity":"00:00:00.022","active":true,"matchIndex":228,"voting":true,"id":"member-2-shard-default-operational","nextIndex":229}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"567.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":3,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":228,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":27,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":6184},"timestamp":1775782280,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:20.006159" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:19.998182" elapsed="0.008025"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:19.994455" elapsed="0.011844"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.006886" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.006389" elapsed="0.000634"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:19.994398" elapsed="0.012783"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.014269" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":33,"SnapshotIndex":227,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":227,"Leader":"member-1-shard-default-operational","LastIndex":228,"RaftState":"Leader","LastApplied":228,"LastCommittedTransactionTime":"2026-04-10 00:51:05.746","LastLogIndex":228,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.023","active":true,"matchIndex":228,"voting":true,"id":"member-3-shard-default-operational","nextIndex":229},{"timeSinceLastActivity":"00:00:00.022","active":true,"matchIndex":228,"voting":true,"id":"member-2-shard-default-operational","nextIndex":229}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"567.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":3,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":228,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":27,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":6184},"timestamp":1775782280,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.010274" elapsed="0.004111"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.009895" elapsed="0.004577"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.009827" elapsed="0.005018"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.019824" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.015696" elapsed="0.004189"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.015149" elapsed="0.004789"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.015053" elapsed="0.004953"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.020903" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.020341" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.021448" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.021125" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.022104" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.021752" elapsed="0.000380"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.021576" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.021075" elapsed="0.001136"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.022973" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.022478" elapsed="0.000549"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.023429" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.023183" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.024095" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.023742" elapsed="0.000387"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.023529" elapsed="0.000647"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.023135" elapsed="0.001094"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:20.024525" elapsed="0.000588"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:20.025941" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.025486" elapsed="0.000517"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.026317" elapsed="0.002725"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:20.008316" elapsed="0.020854"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.029660" elapsed="0.000054"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:20.029326" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.029285" elapsed="0.000537"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:20.033971" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:20.030090" elapsed="0.003982"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:20.034272" elapsed="0.000059"/>
</return>
<msg time="2026-04-10T00:51:20.034709" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:19.983012" elapsed="0.051726"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.034801" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:20.034974" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:19.982150" elapsed="0.052852"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.036631" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578228...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.035766" elapsed="0.000897"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:20.036715" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:51:20.036921" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578228...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:20.035289" elapsed="0.001664"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:20.037372" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 228, 'CommittedTransactionsCount': 3, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.037126" elapsed="0.000277"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:20.037934" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.037655" elapsed="0.000315"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:20.038031" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:51:20.038198" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:19.781842" elapsed="0.256382"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:20.038284" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:20.038448" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:19.781096" elapsed="0.257384"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.039006" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.038712" elapsed="0.000367"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.039374" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.039110" elapsed="0.000596"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.039948" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.039739" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.038682" elapsed="0.001372"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:19.780922" elapsed="0.259166"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.043339" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.042795" elapsed="0.000574"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:20.043421" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:51:20.043633" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:20.042369" elapsed="0.001297"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.114031" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.113343" elapsed="0.000737"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.115138" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:20.114823" elapsed="0.000399">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:20.115318" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:20.114421" elapsed="0.000922"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.115938" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:20.115520" elapsed="0.000445"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.116281" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:20.116467" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:20.116131" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.116937" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.116676" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.118206" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.117869" elapsed="0.000383"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.118722" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.118423" elapsed="0.000325"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.119100" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.119327" elapsed="0.000031"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.119526" elapsed="0.000042"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:20.118957" elapsed="0.000652"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.118806" elapsed="0.000836"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:20.119697" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:51:20.119886" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:20.117477" elapsed="0.002441"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.117078" elapsed="0.002882"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.120183" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.119996" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.117047" elapsed="0.003218"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.120935" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.120413" elapsed="0.000550"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.121012" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:20.112191" elapsed="0.008949"/>
</kw>
<msg time="2026-04-10T00:51:20.121198" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:20.097413" elapsed="0.023852"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.136368" elapsed="0.000082"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.150052" elapsed="0.000138"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.163594" elapsed="0.000085"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.164007" elapsed="0.000032"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.164248" 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-04-10T00:51:20.164767" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.164606" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:20.164585" elapsed="0.000291"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.165055" 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-04-10T00:51:20.165240" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.165413" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:20.164521" elapsed="0.000947"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.164369" elapsed="0.001128"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.165669" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.165754" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:51:20.166273" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:20.092201" elapsed="0.074116"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.168429" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:20.168081" elapsed="0.000431">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:20.168633" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:20.167621" elapsed="0.001038"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.169035" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.168736" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.169692" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.169321" elapsed="0.000400"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.169128" elapsed="0.000629"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.168716" elapsed="0.001063"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.172498" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:20.169937" elapsed="0.002588"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:20.172602" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:51:20.172940" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:20.167091" elapsed="0.005886"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.175181" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:20.174835" elapsed="0.000433">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:20.175369" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:20.174444" elapsed="0.000951"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:20.175698" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:51:20.175476" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.175453" elapsed="0.000342"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.175953" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.176153" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.176252" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:51:20.178918" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:20.173836" elapsed="0.005130"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.181382" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.180998" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.181904" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.181644" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:20.205683" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:20.206806" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:20.207509" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:20.184507" elapsed="0.023108"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.182037" elapsed="0.025697"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.208247" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.207808" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.182011" elapsed="0.026439"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.216631" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.211107" elapsed="0.005951"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.210515" elapsed="0.006599"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.210467" elapsed="0.006682"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.220402" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.217593" elapsed="0.002868"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.217247" elapsed="0.003258"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.217216" elapsed="0.003317"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.221254" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.220792" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.221656" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.221379" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.222225" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.221910" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.221741" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.221353" elapsed="0.000955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.222937" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.222540" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.223276" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.223039" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.223853" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.223532" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.223363" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.223019" elapsed="0.000917"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:20.224107" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:20.224976" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.224663" elapsed="0.000338"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.225159" elapsed="0.002782"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:20.209375" elapsed="0.018648"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.228234" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:20.228111" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.228087" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:20.238214" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:20.228482" elapsed="0.009785"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:20.238358" elapsed="0.000060"/>
</return>
<msg time="2026-04-10T00:51:20.238915" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:20.179752" elapsed="0.059204"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.239055" elapsed="0.000077"/>
</return>
<msg time="2026-04-10T00:51:20.239409" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:20.063536" elapsed="0.175917"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.240612" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.239706" elapsed="0.001158"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.239680" elapsed="0.001229"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.241003" 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="PASS" start="2026-04-10T00:51:20.049959" elapsed="0.191263"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.043758" elapsed="0.197512"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.043733" elapsed="0.197563"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.242172" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:20.242024" elapsed="0.000246"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:51:20.242418" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:20.242296" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.242004" elapsed="0.000780"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.242989" elapsed="0.000025"/>
</kw>
<msg time="2026-04-10T00:51:20.243123" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:20.241654" elapsed="0.001496"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.243905" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.243353" elapsed="0.000581"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.244709" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.244105" elapsed="0.000632"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.252475" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.251683" elapsed="0.000985"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.253678" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.252943" elapsed="0.000935"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:20.275055" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:20.275201" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":227,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":227,"Leader":"member-1-shard-default-operational","LastIndex":228,"RaftState":"Follower","LastApplied":228,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":228,"LastLeadershipChangeTime":"2026-04-10 00:51:03.908","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"744.3 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":228,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":2125},"timestamp":1775782280,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:20.275748" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:20.259977" elapsed="0.015857"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.254251" elapsed="0.021727"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.276891" elapsed="0.000107"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.276120" elapsed="0.001008"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.253979" elapsed="0.023274"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.285157" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":227,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":227,"Leader":"member-1-shard-default-operational","LastIndex":228,"RaftState":"Follower","LastApplied":228,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":228,"LastLeadershipChangeTime":"2026-04-10 00:51:03.908","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"744.3 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":228,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":2125},"timestamp":1775782280,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.281168" elapsed="0.004075"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.280832" elapsed="0.004462"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.280765" elapsed="0.004591"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.288951" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.285899" elapsed="0.003100"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.285570" elapsed="0.003465"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.285485" elapsed="0.003594"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.289868" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.289361" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.290319" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.290069" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.290945" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.290608" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.290421" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.290024" elapsed="0.001025"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.291854" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.291304" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.292309" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.292065" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.292897" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.292591" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.292408" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.292020" elapsed="0.000979"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:20.293253" elapsed="0.000469"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:20.294341" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.293983" elapsed="0.000408"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.294661" elapsed="0.002546"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:20.279255" elapsed="0.018063"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.297702" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:20.297451" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.297417" elapsed="0.000442"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:20.301541" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:20.298090" elapsed="0.003666"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:20.301850" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:51:20.302139" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:20.245850" elapsed="0.056317"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.302273" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:20.302430" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:20.244994" elapsed="0.057462"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.303845" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578228...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.303125" elapsed="0.000750"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:20.303925" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:20.304102" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578228...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:20.302727" elapsed="0.001401"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:20.304516" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 228, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.304289" elapsed="0.000258"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:20.304960" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.304721" elapsed="0.000265"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:20.305033" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:20.305189" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:20.041719" elapsed="0.263494"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:20.305271" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:51:20.305422" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:20.040700" elapsed="0.264746"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.305819" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.305529" elapsed="0.000521"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.306223" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.306074" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.306442" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.306300" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.305511" elapsed="0.001003"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:51:20.040322" elapsed="0.266216"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.309234" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.308766" elapsed="0.000496"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:20.309307" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:20.309456" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:20.308379" elapsed="0.001101"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.368469" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.368078" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.369382" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:20.369086" elapsed="0.000376">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:20.369642" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:20.368692" elapsed="0.000975"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.370224" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:20.369838" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.370583" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:20.370761" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:20.370417" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.371195" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.370947" 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-04-10T00:51:20.372250" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.371995" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.372752" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.372463" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.373118" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.373325" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.373505" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:20.372978" elapsed="0.000604"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.372833" elapsed="0.000782"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:20.373663" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:51:20.373830" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:20.371666" elapsed="0.002189"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.371340" elapsed="0.002548"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.374062" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.373913" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.371316" elapsed="0.002825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.374746" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.374288" elapsed="0.000486"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.374825" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:20.367443" elapsed="0.007507"/>
</kw>
<msg time="2026-04-10T00:51:20.375004" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:20.354439" elapsed="0.020618"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.388047" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.400821" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.413683" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.413898" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.414080" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.414478" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.414330" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:20.414313" elapsed="0.000264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.414721" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.414890" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.415057" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:20.414278" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.414165" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.415288" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.415366" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:51:20.415728" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:20.349976" elapsed="0.065789"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.417523" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:20.417239" elapsed="0.000380">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:20.417714" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:20.416864" elapsed="0.000874"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.418063" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.417810" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.418637" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.418324" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.418144" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.417792" elapsed="0.000928"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.421091" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:20.418871" elapsed="0.002246"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:20.421169" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:20.421477" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:20.416381" elapsed="0.005132"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.423159" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:20.422914" elapsed="0.000308">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:20.423360" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:20.422573" elapsed="0.000812"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:20.423633" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:20.423458" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.423441" elapsed="0.000279"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.423868" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.424043" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.424111" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:20.426400" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:20.422122" elapsed="0.004315"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.428303" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.428035" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.428782" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.428506" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:20.452519" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:20.452982" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:20.453196" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:20.430960" elapsed="0.022262"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.428893" elapsed="0.024373"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.453452" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.453294" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.428875" elapsed="0.024662"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.457353" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.454598" elapsed="0.003094"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.454356" elapsed="0.003373"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.454337" elapsed="0.003416"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.460453" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.458038" elapsed="0.002462"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.457811" elapsed="0.002725"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.457793" elapsed="0.002784"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.461149" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.460754" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.461484" elapsed="0.000204"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.461247" elapsed="0.000480"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.462221" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.461917" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.461751" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.461228" elapsed="0.001077"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.462847" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.462464" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.463180" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.462945" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.463737" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.463425" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.463260" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.462927" elapsed="0.000913"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:20.463994" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:20.464831" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.464507" elapsed="0.000349"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.465012" elapsed="0.002520"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:20.453926" elapsed="0.013689"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.467792" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:20.467685" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.467667" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:20.476596" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:20.468046" elapsed="0.008581"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:20.476680" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:51:20.477020" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:20.427050" elapsed="0.050008"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.477165" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:51:20.477505" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:20.324883" elapsed="0.152685"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.478498" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.477765" elapsed="0.000921"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.477746" elapsed="0.000981"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.478815" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:51:20.314012" elapsed="0.165007"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.309621" elapsed="0.169444"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.309531" elapsed="0.169559"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.479924" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:20.479718" elapsed="0.000303"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:51:20.480167" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:20.480047" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.479700" elapsed="0.000603"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.480458" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:51:20.480596" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:20.479400" elapsed="0.001223"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.481210" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.480796" elapsed="0.000441"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.481995" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.481396" elapsed="0.000629"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.489431" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.488677" elapsed="0.000957"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.490871" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.489905" elapsed="0.001173"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:20.503423" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:20.503536" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":228,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":228,"Leader":"member-1-shard-default-operational","LastIndex":230,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":230,"LastLogIndex":230,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"283.8 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":230,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":98854},"timestamp":1775782280,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:20.503927" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:20.494336" elapsed="0.009649"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.491219" elapsed="0.012908"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.504794" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.504233" elapsed="0.000719"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.491179" elapsed="0.013860"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.513084" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":228,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":228,"Leader":"member-1-shard-default-operational","LastIndex":230,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":230,"LastLogIndex":230,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"283.8 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":230,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":98854},"timestamp":1775782280,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.508652" elapsed="0.004573"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.507989" elapsed="0.005310"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.507917" elapsed="0.005484"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.518010" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.514154" elapsed="0.003911"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.513724" elapsed="0.004496"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.513616" elapsed="0.004665"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.519323" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.518694" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.519889" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.519589" elapsed="0.000371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.520580" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.520230" elapsed="0.000380"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.520005" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.519515" elapsed="0.001174"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.521380" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.520949" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.521853" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.521605" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.522428" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.522123" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.521955" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.521539" elapsed="0.000994"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:20.522822" elapsed="0.000439"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:20.523911" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.523530" elapsed="0.000432"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.524285" elapsed="0.002517"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:20.506344" elapsed="0.020579"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.527288" elapsed="0.000056"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:20.527058" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.527024" elapsed="0.000426"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:20.531184" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:20.527706" elapsed="0.003577"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:20.531372" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:51:20.531690" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:20.483069" elapsed="0.048650"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.531849" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:20.532010" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:20.482245" elapsed="0.049791"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.533473" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578228...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.532762" elapsed="0.000741"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:20.533570" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:20.533756" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578228...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:20.532341" elapsed="0.001443"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:20.534180" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 230, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.533948" elapsed="0.000260"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:20.534677" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.534371" elapsed="0.000333"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:20.534754" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:20.534913" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:20.307773" elapsed="0.227165"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:20.534997" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:20.535155" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:20.306921" elapsed="0.228259"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.535484" elapsed="0.000211"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.535264" elapsed="0.000469"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.535906" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.535758" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.536237" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.536013" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.535246" elapsed="0.001094"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:51:20.306747" elapsed="0.229626"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:19.780707" elapsed="0.755711"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:51:20.536478" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:51:20.536772" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:51:20.536834" level="INFO">${follower_list} = [2, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:51:19.776288" elapsed="0.760578"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.537500" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:51:20.537629" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:51:20.537120" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.538067" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.537760" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.537736" elapsed="0.000432"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.540792" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:51:20.538341" elapsed="0.002500"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:51:20.541339" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.541098" elapsed="0.000273"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:51:20.541431" elapsed="0.000041"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:51:19.773522" elapsed="0.768115"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:51:19.773239" elapsed="0.768449"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:51:18.247644" elapsed="2.294080"/>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:51:18.247199" elapsed="2.294586"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.547339" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:20.546898" elapsed="0.000469"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.547884" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:20.547541" elapsed="0.000370"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:20.547960" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:20.548124" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:20.546411" elapsed="0.001738"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:51:20.548356" elapsed="0.000176"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.549075" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:20.548721" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.549523" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:20.549271" elapsed="0.000303"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.550072" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:20.549738" elapsed="0.000362"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.553051" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.552493" elapsed="0.000586"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:20.553130" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:20.553289" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:20.552023" elapsed="0.001291"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.612382" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.611995" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.613262" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:20.612969" elapsed="0.000373">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:20.613437" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:20.612604" elapsed="0.000858"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.614027" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:20.613644" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.614359" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:20.614705" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:20.614215" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.615142" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.614892" 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-04-10T00:51:20.616164" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.615909" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.616685" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.616371" 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-04-10T00:51:20.617048" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.617256" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.617433" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:20.616912" elapsed="0.000579"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.616767" elapsed="0.000757"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:20.617590" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:51:20.617759" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:20.615584" elapsed="0.002201"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.615264" elapsed="0.002553"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.617992" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.617844" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.615242" elapsed="0.002828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.618700" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.618214" elapsed="0.000515"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.618778" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:20.611365" elapsed="0.007536"/>
</kw>
<msg time="2026-04-10T00:51:20.618956" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:20.598511" elapsed="0.020496"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.631895" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.644370" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.656827" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.657173" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.657358" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.657795" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.657640" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:20.657621" 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-04-10T00:51:20.658023" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.658191" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.658358" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:20.657579" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.657448" elapsed="0.000998"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.658613" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.658696" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:51:20.659031" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:20.593925" elapsed="0.065144"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.660917" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:20.660594" elapsed="0.000402">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:20.661090" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:20.660177" elapsed="0.000938"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.661444" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.661186" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.662022" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.661728" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.661526" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.661168" elapsed="0.000935"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.664424" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:20.662254" elapsed="0.002197"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:20.664502" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:20.664862" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:20.659711" elapsed="0.005187"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.666567" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:20.666310" elapsed="0.000322">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:20.666726" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:20.665971" elapsed="0.000779"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:20.666954" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:51:20.666820" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.666802" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.667223" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.667398" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.667464" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:20.671289" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:20.665525" elapsed="0.005801"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.673180" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.672880" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.673864" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.673384" elapsed="0.000524"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:20.685999" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:20.686618" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:20.686915" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:20.676183" elapsed="0.010770"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.673977" elapsed="0.013037"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.687268" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.687052" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.673958" elapsed="0.013436"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.693050" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.688837" elapsed="0.004772"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.688503" elapsed="0.005159"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.688476" elapsed="0.005221"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.697490" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.694099" elapsed="0.003438"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.693778" elapsed="0.003810"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.693753" elapsed="0.003860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.698179" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.697787" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.698514" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.698277" elapsed="0.000395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.699172" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.698868" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.698698" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.698259" elapsed="0.000996"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.699802" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.699421" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.700131" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.699900" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.700687" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.700373" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.700212" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.699882" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:20.700922" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:20.701777" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.701458" elapsed="0.000345"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.701960" elapsed="0.002396"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:20.687913" elapsed="0.016507"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.704615" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:20.704490" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.704472" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:20.713292" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:20.704831" elapsed="0.008491"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:20.713375" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:51:20.713732" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:20.671934" elapsed="0.041835"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.713859" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:51:20.714198" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:20.568643" elapsed="0.145597"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.715190" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.714430" elapsed="0.000931"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.714411" elapsed="0.000990"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.715489" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:51:20.557799" elapsed="0.157904"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.553394" elapsed="0.162355"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.553372" elapsed="0.162401"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:51:20.716480" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:20.716354" elapsed="0.000254"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.716674" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:20.716635" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.716336" elapsed="0.000448"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.716938" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:51:20.717058" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:20.716061" elapsed="0.001024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.717705" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.717277" elapsed="0.000456"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.718454" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.717892" elapsed="0.000590"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.725653" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.724923" elapsed="0.000894"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.726811" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.726078" elapsed="0.000892"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:20.735459" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:20.735519" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":10001,"SnapshotIndex":60033,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":60033,"Leader":"member-1-shard-inventory-config","LastIndex":60034,"RaftState":"Leader","LastApplied":60034,"LastCommittedTransactionTime":"2026-04-10 00:50:25.437","LastLogIndex":60034,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.907","active":true,"matchIndex":60034,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":60035},{"timeSinceLastActivity":"00:00:00.419","active":true,"matchIndex":60034,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":60035}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"443.6 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":60034,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":2,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":97888},"timestamp":1775782280,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:20.735749" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:20.729645" elapsed="0.006141"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.727086" elapsed="0.008757"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.736221" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.735903" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.727054" elapsed="0.009364"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.742445" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":10001,"SnapshotIndex":60033,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":60033,"Leader":"member-1-shard-inventory-config","LastIndex":60034,"RaftState":"Leader","LastApplied":60034,"LastCommittedTransactionTime":"2026-04-10 00:50:25.437","LastLogIndex":60034,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.907","active":true,"matchIndex":60034,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":60035},{"timeSinceLastActivity":"00:00:00.419","active":true,"matchIndex":60034,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":60035}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"443.6 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":60034,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":2,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":97888},"timestamp":1775782280,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.738745" elapsed="0.003792"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.738328" elapsed="0.004281"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.738282" elapsed="0.004392"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.746706" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.743188" elapsed="0.003564"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.742866" elapsed="0.003921"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.742803" elapsed="0.004029"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.747539" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.747095" elapsed="0.000514"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.748008" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.747764" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.748613" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.748274" elapsed="0.000366"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.748108" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.747717" elapsed="0.000999"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.749419" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.748966" elapsed="0.000505"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.749882" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.749642" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.750448" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.750143" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.749980" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.749594" elapsed="0.000970"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:20.750817" elapsed="0.000458"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:20.751909" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.751537" elapsed="0.000421"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.752204" elapsed="0.002564"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:20.737241" elapsed="0.017662"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.755258" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:20.755037" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.755004" elapsed="0.000403"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:20.759202" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:20.755657" elapsed="0.003639"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:20.759436" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:51:20.759745" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:20.719484" elapsed="0.040289"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.759833" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:51:20.759985" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:20.718723" elapsed="0.041289"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.761528" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782280, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.760788" elapsed="0.000812"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:20.761651" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:20.761834" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782280, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:20.760386" elapsed="0.001475"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:20.762250" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 60034, 'CommittedTransactionsCount': 1, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True,...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.762019" elapsed="0.000258"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:20.762696" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.762433" elapsed="0.000289"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:20.762769" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:20.762921" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:20.551354" elapsed="0.211591"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:20.763003" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:51:20.763149" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:20.550559" elapsed="0.212614"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.763470" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.763253" elapsed="0.000273"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.763785" elapsed="0.000188"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.763574" elapsed="0.000435"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.764181" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.764033" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.763236" elapsed="0.001019"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:20.550362" elapsed="0.213916"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.766896" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.766415" elapsed="0.000509"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:20.766969" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:20.767116" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:20.766047" elapsed="0.001094"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.826259" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.825728" elapsed="0.000565"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.827230" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:20.826945" elapsed="0.000366">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:20.827406" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:20.826593" elapsed="0.000838"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.828040" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:20.827618" elapsed="0.000458"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.828404" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:20.828604" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:20.828255" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.829039" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.828789" 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-04-10T00:51:20.830136" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.829875" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.830708" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.830410" elapsed="0.000325"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.831082" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.831292" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.831471" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:20.830940" elapsed="0.000590"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.830791" elapsed="0.000788"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:20.831633" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:51:20.831805" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:20.829506" elapsed="0.002324"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.829168" elapsed="0.002695"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.832040" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.831890" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.829144" elapsed="0.002973"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.832724" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.832263" elapsed="0.000490"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.832801" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:20.825021" elapsed="0.007906"/>
</kw>
<msg time="2026-04-10T00:51:20.832985" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:20.812175" elapsed="0.020866"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.846211" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.858914" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.871460" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.871709" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.871896" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.872326" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.872170" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:20.872149" 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-04-10T00:51:20.872571" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.872742" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.872910" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:20.872107" elapsed="0.000857"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.871988" elapsed="0.001006"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.873145" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.873226" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:51:20.873629" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:20.807700" elapsed="0.065968"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.875537" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:20.875222" elapsed="0.000412">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:20.875729" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:20.874811" elapsed="0.000943"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.876091" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.875825" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.876672" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.876355" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.876172" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.875807" elapsed="0.000949"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.879136" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:20.876909" elapsed="0.002254"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:20.879213" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:51:20.879519" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:20.874316" elapsed="0.005255"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:20.881261" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:20.881017" elapsed="0.000308">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:20.881418" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:20.880677" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:20.881666" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:20.881513" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.881495" elapsed="0.000257"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.881902" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.882075" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.882182" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:51:20.884465" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:20.880228" elapsed="0.004273"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.886331" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.886030" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.886807" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.886532" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:20.912403" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:20.913364" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:20.913928" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:20.888995" elapsed="0.024997"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.886918" elapsed="0.027176"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.914585" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.914156" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.886899" elapsed="0.027892"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.923459" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.917145" elapsed="0.006659"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.916638" elapsed="0.007203"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.916593" elapsed="0.007274"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.926599" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.924159" elapsed="0.002488"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.923926" elapsed="0.002756"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.923908" elapsed="0.002799"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.927281" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.926882" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.927641" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.927380" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.928199" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.927890" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.927725" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.927361" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.928834" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.928446" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.929171" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.928933" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.929731" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.929415" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.929254" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.928915" elapsed="0.000899"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:20.929969" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:20.930835" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.930515" elapsed="0.000346"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.931019" elapsed="0.002608"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:20.915646" elapsed="0.018047"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.933871" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:20.933764" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.933745" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:20.942289" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:20.934088" elapsed="0.008231"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:20.942372" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:51:20.942791" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:20.885093" elapsed="0.057735"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.942920" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:51:20.943262" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:20.782670" elapsed="0.160633"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.944259" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.943494" elapsed="0.000938"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.943475" elapsed="0.000997"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.944585" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:51:20.771571" elapsed="0.173212"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.767208" elapsed="0.177621"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.767191" elapsed="0.177663"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:51:20.945598" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:20.945451" elapsed="0.000260"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.945776" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:20.945738" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.945433" elapsed="0.000457"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.946043" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:51:20.946164" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:20.945151" elapsed="0.001038"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.946819" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.946362" elapsed="0.000484"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.947593" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.947007" elapsed="0.000616"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.954711" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.953980" elapsed="0.000899"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.955869" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.955140" 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-04-10T00:51:20.968264" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:20.968394" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":60033,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":60033,"Leader":"member-1-shard-inventory-config","LastIndex":60034,"RaftState":"Follower","LastApplied":60034,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":60034,"LastLeadershipChangeTime":"2026-04-10 00:51:04.372","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"732.3 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":60034,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":97888},"timestamp":1775782280,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:20.968901" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:20.958498" elapsed="0.010483"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.956144" elapsed="0.012961"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.969966" elapsed="0.000100"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.969236" elapsed="0.000955"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.956112" elapsed="0.014201"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.977884" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":60033,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":60033,"Leader":"member-1-shard-inventory-config","LastIndex":60034,"RaftState":"Follower","LastApplied":60034,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":60034,"LastLeadershipChangeTime":"2026-04-10 00:51:04.372","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"732.3 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":60034,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":97888},"timestamp":1775782280,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.975061" elapsed="0.002933"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.974433" elapsed="0.003598"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.974334" elapsed="0.003742"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.980917" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:20.978443" elapsed="0.002523"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.978210" elapsed="0.002792"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.978166" elapsed="0.002880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.981874" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.981315" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.982330" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.982081" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.982995" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.982636" elapsed="0.000388"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.982432" elapsed="0.000629"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.982035" elapsed="0.001067"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.983858" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.983363" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:20.984495" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:20.984167" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:20.985158" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:20.984841" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:20.984662" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.984106" elapsed="0.001155"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:20.985603" elapsed="0.000542"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:20.986984" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:20.986473" elapsed="0.000572"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:20.987360" elapsed="0.003693"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:20.972188" elapsed="0.019084"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:20.991948" elapsed="0.000063"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:20.991498" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:20.991433" elapsed="0.000708"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:20.997865" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:20.992517" elapsed="0.005488"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:20.998154" elapsed="0.000077"/>
</return>
<msg time="2026-04-10T00:51:20.998590" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:20.948623" elapsed="0.050005"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:20.998888" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:51:20.999098" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:20.947842" elapsed="0.051291"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.001291" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782280, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.000213" elapsed="0.001121"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:21.001412" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:51:21.001692" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782280, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:20.999541" elapsed="0.002187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:21.002288" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 60034, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInit...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.001976" elapsed="0.000348"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:21.002883" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.002535" elapsed="0.000381"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:21.002978" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:51:21.003187" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:20.765347" elapsed="0.237874"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:21.003297" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:51:21.003490" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:20.764636" elapsed="0.238886"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.004096" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.003766" elapsed="0.000751"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.004774" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.004572" elapsed="0.000275"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.005080" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.004879" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.003735" elapsed="0.001441"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:51:20.764446" elapsed="0.240765"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.009004" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.008313" elapsed="0.000736"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:21.009123" elapsed="0.000060"/>
</return>
<msg time="2026-04-10T00:51:21.009343" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:21.007770" elapsed="0.001604"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.086735" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.086289" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.087631" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:21.087323" elapsed="0.000386">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:21.087943" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:21.086949" elapsed="0.001020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.088531" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:21.088139" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.088890" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:21.089061" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:21.088744" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.089498" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.089248" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.090592" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.090319" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.091069" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.090801" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.091476" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.091700" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.091881" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:21.091328" elapsed="0.000612"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.091148" elapsed="0.000822"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:21.092017" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:51:21.092187" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:21.089990" elapsed="0.002223"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.089646" elapsed="0.002599"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.092419" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.092270" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.089621" elapsed="0.002875"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.093103" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.092658" elapsed="0.000473"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.093180" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:21.085565" elapsed="0.007740"/>
</kw>
<msg time="2026-04-10T00:51:21.093360" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:21.072602" elapsed="0.020817"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.106829" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.119651" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.132175" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.132378" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.132570" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.132948" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.132798" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:21.132783" 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-04-10T00:51:21.133166" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.133331" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.133498" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:21.132753" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.132651" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.133745" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.133822" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:21.134130" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:21.067792" elapsed="0.066375"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.135893" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:21.135637" elapsed="0.000324">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:21.136052" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:21.135250" elapsed="0.000826"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.136396" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.136147" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.136972" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.136678" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.136476" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.136129" elapsed="0.000926"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.139387" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:21.137206" elapsed="0.002207"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:21.139501" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:51:21.139861" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:21.134811" elapsed="0.005086"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.141523" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:21.141267" elapsed="0.000338">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:21.141744" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:21.140931" elapsed="0.000838"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:21.141975" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:51:21.141841" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.141822" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.142204" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.142377" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.142443" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:21.144731" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:21.140478" elapsed="0.004290"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.146575" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.146304" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.147155" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.146779" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:21.166906" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:21.167939" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:21.168408" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:21.149402" elapsed="0.019067"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.147267" elapsed="0.021334"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.169020" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.168663" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.147249" elapsed="0.021978"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.177028" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.171529" elapsed="0.005820"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.171029" elapsed="0.006356"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.170986" elapsed="0.006424"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.180131" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.177713" elapsed="0.002465"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.177467" elapsed="0.002746"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.177450" elapsed="0.002787"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.180829" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.180407" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.181165" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.180927" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.181733" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.181408" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.181246" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.180909" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.182354" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.181978" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.182709" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.182456" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.183245" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.182950" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.182790" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.182436" elapsed="0.000891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:21.183475" elapsed="0.000443"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:21.184389" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.184089" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.184591" elapsed="0.002482"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:21.170047" elapsed="0.017090"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.187313" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:21.187208" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.187189" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:21.195576" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:21.187525" elapsed="0.008082"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:21.195659" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:21.196015" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:21.145365" elapsed="0.050688"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.196143" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:51:21.196476" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:21.030995" elapsed="0.165523"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.197456" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.196732" elapsed="0.000901"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.196712" elapsed="0.000962"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.197762" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:51:21.015927" elapsed="0.182030"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.009483" elapsed="0.188519"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.009453" elapsed="0.188574"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:51:21.198749" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:21.198622" elapsed="0.000238"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.198925" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:21.198886" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.198604" elapsed="0.000432"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.199186" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:51:21.199307" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:21.198315" elapsed="0.001018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.199959" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.199509" elapsed="0.000477"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.200768" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.200146" elapsed="0.000651"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.207992" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.207249" elapsed="0.000908"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.209143" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.208428" elapsed="0.000876"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:21.218510" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:21.218612" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:21 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":60033,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":60033,"Leader":"member-1-shard-inventory-config","LastIndex":60034,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":60034,"LastLogIndex":60034,"LastLeadershipChangeTime":"2026-04-10 00:50:15.798","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"264.5 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":60034,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":362748},"timestamp":1775782281,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:21.218824" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:21.211801" elapsed="0.007059"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.209421" elapsed="0.009496"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.219296" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.218979" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.209389" elapsed="0.010070"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.225608" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":60033,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":60033,"Leader":"member-1-shard-inventory-config","LastIndex":60034,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":60034,"LastLogIndex":60034,"LastLeadershipChangeTime":"2026-04-10 00:50:15.798","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"264.5 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":60034,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":362748},"timestamp":1775782281,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.221581" elapsed="0.004138"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.221337" elapsed="0.004419"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.221291" elapsed="0.004510"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.228716" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.226173" elapsed="0.002592"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.225939" elapsed="0.002863"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.225894" elapsed="0.002953"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.229568" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.229112" elapsed="0.000509"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.230015" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.229772" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.230611" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.230283" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.230115" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.229726" elapsed="0.000989"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.231498" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.231066" elapsed="0.000502"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.231993" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.231725" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.232601" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.232268" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.232097" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.231678" elapsed="0.001029"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:21.232958" elapsed="0.000435"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:21.234032" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.233690" elapsed="0.000392"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.234333" elapsed="0.002534"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:21.220323" elapsed="0.016656"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.237329" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:21.237108" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.237075" elapsed="0.000406"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:21.241223" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:21.237732" elapsed="0.003586"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:21.241405" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:51:21.241702" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:21.201794" elapsed="0.039937"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.241827" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:21.241981" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:21.201016" elapsed="0.040991"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.243336" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782281, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.242640" elapsed="0.000725"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:21.243414" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:21.243609" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782281, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:21.242235" elapsed="0.001402"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:21.244097" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 60034, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInit...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.243797" elapsed="0.000334"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:21.244540" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.244296" elapsed="0.000288"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:21.244633" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:21.244786" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:21.006971" elapsed="0.237839"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:21.244867" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:51:21.245015" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:21.005763" elapsed="0.239276"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.245337" elapsed="0.000191"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.245117" elapsed="0.000466"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.245755" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.245608" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.245974" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.245833" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.245100" elapsed="0.000947"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:51:21.005465" elapsed="0.240606"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:20.550152" elapsed="0.695951"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:51:21.246145" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:51:21.246346" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:51:21.246392" level="INFO">${follower_list} = [2, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:51:20.545638" elapsed="0.700778"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.246921" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:51:21.246996" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:51:21.246650" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.247301" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.247088" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.247070" elapsed="0.000308"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.249696" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:51:21.247513" elapsed="0.002231"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:51:21.250144" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.249955" elapsed="0.000215"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:51:21.250216" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:51:20.542956" elapsed="0.707414"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:51:20.542710" elapsed="0.707705"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.255275" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:21.254889" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.255792" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:21.255464" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:21.255863" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:21.256019" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:21.254493" elapsed="0.001592"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:51:21.256243" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.256909" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:21.256577" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.257330" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:21.257095" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.257765" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:21.257510" elapsed="0.000280"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.260412" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.259923" elapsed="0.000516"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:21.260484" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:21.260657" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:21.259536" elapsed="0.001146"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.319664" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.319226" elapsed="0.000473"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.320572" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:21.320223" elapsed="0.000434">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:21.320754" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:21.319877" elapsed="0.000901"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.321346" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:21.320950" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.321719" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:21.321901" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:21.321567" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.322348" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.322092" 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-04-10T00:51:21.323504" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.323231" elapsed="0.000337"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.324012" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.323738" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.324423" 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-04-10T00:51:21.324669" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.324853" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:21.324236" elapsed="0.000677"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.324092" elapsed="0.000852"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:21.324992" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:51:21.325163" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:21.322899" elapsed="0.002290"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.322576" elapsed="0.002646"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.325399" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.325246" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.322535" elapsed="0.002960"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.326116" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.325662" elapsed="0.000482"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.326193" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:21.318516" elapsed="0.007805"/>
</kw>
<msg time="2026-04-10T00:51:21.326375" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:21.305433" elapsed="0.020994"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.339428" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.352183" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.367747" elapsed="0.000072"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.368110" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.368311" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.369377" elapsed="0.000269"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.368912" elapsed="0.000853"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:21.368858" elapsed="0.000981"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.370276" elapsed="0.000060"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.370829" elapsed="0.000061"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.371333" elapsed="0.000059"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:21.368716" elapsed="0.002775"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.368412" elapsed="0.003208"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.372083" elapsed="0.000060"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.372312" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:51:21.373305" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:21.300885" elapsed="0.072511"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.377056" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:21.376408" elapsed="0.000793">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:21.377394" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:21.375637" elapsed="0.001804"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.378373" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.377844" elapsed="0.000640"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.379776" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.379124" elapsed="0.000705"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.378746" elapsed="0.001150"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.377603" elapsed="0.002337"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.383991" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:21.380250" elapsed="0.003796"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:21.384151" elapsed="0.000064"/>
</return>
<msg time="2026-04-10T00:51:21.384740" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:21.374684" elapsed="0.010105"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.387352" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:21.386951" elapsed="0.000504">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:21.387610" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:21.386386" elapsed="0.001257"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:21.387966" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-10T00:51:21.387760" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.387728" elapsed="0.000363"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.388293" 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-04-10T00:51:21.388527" elapsed="0.000047"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.388635" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:51:21.392177" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:21.385723" elapsed="0.006601"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.395088" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.394670" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.395723" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.395383" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:21.409153" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:21.410240" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:21.410848" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:21.399063" elapsed="0.011852"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.395889" elapsed="0.015141"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.411530" elapsed="0.000088"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.411106" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.395857" elapsed="0.015908"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.421794" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.414670" elapsed="0.007585"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.414064" elapsed="0.008249"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.414005" elapsed="0.008346"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.425831" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.422815" elapsed="0.003086"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.422450" elapsed="0.003503"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.422419" elapsed="0.003571"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.426850" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.426304" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.427261" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.426968" elapsed="0.000380"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.427905" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.427569" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.427373" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.426945" elapsed="0.001048"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.428657" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.428166" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.429087" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.428767" elapsed="0.000384"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.429723" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.429379" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.429177" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.428745" elapsed="0.001065"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:21.429986" elapsed="0.000414"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:21.430920" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.430603" elapsed="0.000345"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.431108" elapsed="0.003242"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:21.412695" elapsed="0.021780"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.434743" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:21.434607" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.434578" elapsed="0.000241"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:21.444163" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:21.435010" elapsed="0.009212"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:21.444347" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:51:21.444917" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:21.393262" elapsed="0.051746"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.445119" elapsed="0.000078"/>
</return>
<msg time="2026-04-10T00:51:21.445484" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:21.275816" elapsed="0.169711"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.446767" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.445825" elapsed="0.001193"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.445798" elapsed="0.001266"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.447161" 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="PASS" start="2026-04-10T00:51:21.265040" elapsed="0.182343"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.260752" elapsed="0.186680"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.260734" elapsed="0.186725"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:51:21.448375" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:51:21.448223" elapsed="0.000269"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.448583" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:21.448520" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.448201" elapsed="0.000537"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.448955" elapsed="0.000051"/>
</kw>
<msg time="2026-04-10T00:51:21.449118" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:21.447857" elapsed="0.001291"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.449937" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.449354" elapsed="0.000614"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.450783" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.450136" elapsed="0.000684"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.458859" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.457980" elapsed="0.001068"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.460079" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.459337" elapsed="0.000945"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:21.471701" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:21.471840" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:21 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:49:55.684","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"194.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":0},"timestamp":1775782281,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:21.472258" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:21.464409" elapsed="0.007906"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.460436" elapsed="0.011986"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.473161" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.472526" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.460392" elapsed="0.013020"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.481897" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:49:55.684","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"194.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":0},"timestamp":1775782281,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.477089" elapsed="0.005061"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.476671" elapsed="0.005554"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.476588" elapsed="0.005766"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.486931" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.483234" elapsed="0.003782"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.482777" elapsed="0.004300"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.482521" elapsed="0.004673"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.488230" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.487616" elapsed="0.000667"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.488781" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.488470" elapsed="0.000387"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.489480" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.489083" elapsed="0.000425"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.488905" elapsed="0.000640"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.488412" elapsed="0.001195"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.490357" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.489887" elapsed="0.000521"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.490875" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.490613" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.491490" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.491163" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.490991" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.490523" elapsed="0.001096"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:21.491898" elapsed="0.000469"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:21.493056" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.492662" elapsed="0.000447"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.493463" elapsed="0.003033"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:21.474915" elapsed="0.021757"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.497118" elapsed="0.000058"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:21.496854" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.496806" elapsed="0.000540"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:21.501931" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:21.497691" elapsed="0.004356"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:21.502175" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T00:51:21.502670" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:21.451975" elapsed="0.050728"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.502772" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:51:21.502972" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:21.451071" elapsed="0.051933"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.504824" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782281, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.503903" elapsed="0.000954"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:21.505028" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:51:21.505232" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782281, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:21.503346" elapsed="0.001958"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:21.505926" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.505517" elapsed="0.000439"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:21.506431" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.506123" elapsed="0.000344"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:21.506525" elapsed="0.000066"/>
</return>
<msg time="2026-04-10T00:51:21.506757" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:21.258936" elapsed="0.247848"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:21.506846" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:21.507006" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:21.258210" elapsed="0.248822"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.507400" elapsed="0.000251"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.507138" elapsed="0.000554"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.507871" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.507718" elapsed="0.000209"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.508103" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.507953" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.507113" elapsed="0.001066"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:21.258042" elapsed="0.250163"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.511330" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.510786" elapsed="0.000580"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:21.511425" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:51:21.511616" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:21.510317" elapsed="0.001326"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.578227" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.577753" elapsed="0.000513"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.579711" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:21.578842" elapsed="0.000952">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:21.579896" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:21.578455" elapsed="0.001466"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.580526" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:21.580102" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.580896" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:21.581088" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:21.580744" elapsed="0.000469"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.581698" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.581392" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.582885" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.582617" elapsed="0.000314"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.583380" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.583100" elapsed="0.000312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.583782" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.583997" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.584179" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:21.583639" elapsed="0.000600"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.583470" elapsed="0.000800"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:21.584321" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:51:21.584508" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:21.582223" elapsed="0.002312"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.581839" elapsed="0.002748"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.584773" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.584616" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.581812" elapsed="0.003042"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.585495" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.585004" elapsed="0.000520"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.585594" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:21.576827" elapsed="0.008944"/>
</kw>
<msg time="2026-04-10T00:51:21.585831" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:21.563106" elapsed="0.022787"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.599108" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.612121" elapsed="0.000072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.625026" elapsed="0.000072"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.625366" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.625577" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.626336" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.626167" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:21.626147" elapsed="0.000280"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.626605" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.626779" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.626948" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:21.626103" elapsed="0.000898"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.625955" elapsed="0.001075"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.627183" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.627276" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:51:21.627693" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:21.558072" elapsed="0.069663"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.629709" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:21.629365" elapsed="0.000422">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:21.629918" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:21.628940" elapsed="0.001007"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.630322" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.630032" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.630919" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.630615" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.630406" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.630009" elapsed="0.000995"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.633447" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:21.631159" elapsed="0.002316"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:21.633530" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:51:21.633885" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:21.628420" elapsed="0.005558"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.635764" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:21.635467" elapsed="0.000368">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:21.635931" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:21.635101" elapsed="0.000855"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:21.636172" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:51:21.636031" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.636012" elapsed="0.000246"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.636415" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.636693" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.636854" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:21.639224" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:21.634636" elapsed="0.004626"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.641294" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.641009" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.641778" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.641505" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:21.662543" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:21.663810" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:21.664388" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:21.644066" elapsed="0.020387"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.641894" elapsed="0.022713"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.665123" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.664684" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.641875" elapsed="0.023449"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.672369" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.667917" elapsed="0.004919"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.667355" elapsed="0.005528"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.667309" elapsed="0.005604"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.675818" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.673252" elapsed="0.002620"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.672986" elapsed="0.002925"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.672963" elapsed="0.002974"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.676606" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.676159" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.676962" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.676714" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.677520" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.677212" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.677045" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.676693" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.678196" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.677785" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.678536" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.678295" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.679094" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.678799" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.678635" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.678276" elapsed="0.000983"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:21.679428" elapsed="0.000377"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:21.680268" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.679971" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.680450" elapsed="0.002771"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:21.666281" elapsed="0.017012"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.683492" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:21.683373" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.683352" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:21.692355" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:21.683739" elapsed="0.008667"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:21.692490" elapsed="0.000075"/>
</return>
<msg time="2026-04-10T00:51:21.692948" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:21.639916" elapsed="0.053070"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.693082" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:51:21.693424" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:21.530907" elapsed="0.162559"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.694619" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.693713" elapsed="0.001127"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.693689" elapsed="0.001192"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.694970" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:51:21.516449" elapsed="0.178718"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.511726" elapsed="0.183487"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.511705" elapsed="0.183533"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:51:21.696023" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:21.695894" elapsed="0.000238"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.696197" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:21.696158" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.695876" elapsed="0.000434"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.696489" elapsed="0.000024"/>
</kw>
<msg time="2026-04-10T00:51:21.696632" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:21.695537" elapsed="0.001121"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.697320" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.696850" elapsed="0.000498"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.698109" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.697513" elapsed="0.000625"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.706227" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.705378" elapsed="0.001055"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.707416" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.706734" elapsed="0.000869"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:21.718106" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:21.718212" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:21 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:51:03.905","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"790.0 μs","CurrentTerm":3,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782281,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:21.718602" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:21.710250" elapsed="0.008395"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.707743" elapsed="0.010981"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.719200" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.718799" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.707704" elapsed="0.011660"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.726875" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:51:03.905","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"790.0 μs","CurrentTerm":3,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782281,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.722532" elapsed="0.004671"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.722128" elapsed="0.005140"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.722061" elapsed="0.005285"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.730743" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.727825" elapsed="0.002970"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.727529" elapsed="0.003305"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.727477" elapsed="0.003406"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.731736" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.731201" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.732211" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.731953" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.733081" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.732484" elapsed="0.000634"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.732314" elapsed="0.000850"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.731904" elapsed="0.001310"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.734192" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.733506" elapsed="0.000739"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.734746" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.734464" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.735331" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.735020" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.734852" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.734355" elapsed="0.001080"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:21.735749" elapsed="0.000446"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:21.736882" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.736467" elapsed="0.000467"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.737190" elapsed="0.002784"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:21.720624" elapsed="0.019480"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.740509" elapsed="0.000118"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:21.740261" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.740220" elapsed="0.000530"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:21.744885" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:21.741014" elapsed="0.003975"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:21.745091" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:51:21.745413" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:21.699260" elapsed="0.046181"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.745504" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:51:21.745681" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:21.698387" elapsed="0.047321"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.747401" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782281, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.746577" elapsed="0.000854"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:21.747670" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:51:21.747866" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782281, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:21.746030" elapsed="0.001866"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:21.748301" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.748060" elapsed="0.000269"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:21.748828" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.748490" elapsed="0.000371"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:21.748920" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:21.749082" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:21.509686" elapsed="0.239421"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:21.749166" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:51:21.749322" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:21.508647" elapsed="0.240701"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.749716" elapsed="0.000230"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.749453" elapsed="0.000532"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.750161" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.750012" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.750382" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.750238" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.749429" elapsed="0.001026"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:51:21.508398" elapsed="0.242138"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.753385" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.752850" elapsed="0.000565"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:21.753463" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:51:21.753643" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:21.752422" elapsed="0.001249"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.817904" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.817368" elapsed="0.000575"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.818896" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:21.818507" elapsed="0.000479">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:21.819082" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:21.818139" elapsed="0.000968"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.819691" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:21.819279" elapsed="0.000440"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.820033" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:21.820229" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:21.819884" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.820791" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.820517" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.821940" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.821681" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.822427" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.822150" elapsed="0.000304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.822856" 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-04-10T00:51:21.823084" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.823269" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:21.822685" elapsed="0.000643"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.822514" elapsed="0.000848"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:21.823420" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:51:21.823635" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:21.821323" elapsed="0.002338"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.820933" elapsed="0.002762"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.823876" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.823722" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.820904" elapsed="0.003051"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.824611" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.824114" elapsed="0.000525"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.824689" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:21.816505" elapsed="0.008311"/>
</kw>
<msg time="2026-04-10T00:51:21.824873" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:21.803376" elapsed="0.021557"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.838193" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.850886" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.866762" elapsed="0.000054"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.867104" 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-04-10T00:51:21.867306" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.867939" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.867774" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:21.867752" elapsed="0.000274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.868176" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.868346" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.868515" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:21.867704" elapsed="0.000881"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.867532" elapsed="0.001084"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.868772" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.868857" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:51:21.869245" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:21.798437" elapsed="0.070848"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.871347" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:21.870947" elapsed="0.000489">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:21.871535" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:21.870487" elapsed="0.001092"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.871933" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.871654" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.872515" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.872204" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.872015" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.871635" elapsed="0.000983"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.875151" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:21.872773" elapsed="0.002413"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:21.875244" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:51:21.875611" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:21.869977" elapsed="0.005684"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:21.877363" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:21.877103" elapsed="0.000329">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:21.877530" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:21.876752" elapsed="0.000821"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:21.877788" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:51:21.877649" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.877629" elapsed="0.000245"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.878074" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.878255" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.878439" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:51:21.880865" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:21.876273" elapsed="0.004631"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.882826" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.882513" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.883351" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.883033" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:21.903726" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:21.904815" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:21.905393" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:21.885720" elapsed="0.019752"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.883482" elapsed="0.022154"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.906157" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.905713" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.883463" elapsed="0.022919"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.913863" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.909006" elapsed="0.005213"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.908448" elapsed="0.005808"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.908403" elapsed="0.005879"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.917110" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.914601" elapsed="0.002557"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.914342" elapsed="0.002851"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.914324" elapsed="0.002893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.917919" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.917450" elapsed="0.000496"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.918262" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.918019" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.918845" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.918515" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.918346" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.917999" elapsed="0.000929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.919508" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.919094" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.919860" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.919623" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.920398" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.920103" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.919941" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.919605" elapsed="0.000874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:21.920657" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:21.921489" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.921176" elapsed="0.000338"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.921690" elapsed="0.002486"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:21.907355" elapsed="0.016897"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.924446" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:21.924329" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.924309" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:21.933427" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:21.924696" elapsed="0.008767"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:21.933527" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:51:21.933969" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:21.881529" elapsed="0.052477"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.934101" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:51:21.934446" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:21.772064" elapsed="0.162426"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.935682" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.934736" elapsed="0.001318"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.934714" elapsed="0.001389"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.936200" elapsed="0.000031"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:51:21.760299" elapsed="0.176108"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.753767" elapsed="0.182688"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.753739" elapsed="0.182741"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:51:21.937285" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:21.937153" elapsed="0.000244"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.937463" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:21.937424" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.937134" elapsed="0.000461"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.937775" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:51:21.937899" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:21.936813" elapsed="0.001111"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.938618" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.938119" elapsed="0.000527"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.939385" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.938805" elapsed="0.000662"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.949002" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.948111" elapsed="0.001057"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.950134" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.949428" elapsed="0.000866"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:21.960828" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:21.960898" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:21 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:49:55.680","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.484","active":true,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.485","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"712.1 μs","Voting":true,"CurrentTerm":3,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782281,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:21.961125" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:21.952928" elapsed="0.008234"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.950418" elapsed="0.010805"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.961642" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.961290" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.950383" elapsed="0.011419"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.968142" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-3-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:49:55.680","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.484","active":true,"matchIndex":-1,"voting":true,"id":"member-2-shard-topology-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.485","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"712.1 μs","Voting":true,"CurrentTerm":3,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782281,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.964135" elapsed="0.004101"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.963894" elapsed="0.004396"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.963848" elapsed="0.004510"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.972687" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:21.969064" elapsed="0.003670"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.968713" elapsed="0.004057"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.968493" elapsed="0.004322"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.973619" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.973105" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.974070" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.973820" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.974672" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.974342" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.974170" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.973775" elapsed="0.000999"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.975504" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.975025" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.976004" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.975758" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.976617" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:21.976269" elapsed="0.000379"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.976104" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.975712" elapsed="0.001012"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:21.976981" elapsed="0.000437"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:21.978073" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.977700" elapsed="0.000422"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.978374" elapsed="0.002678"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:21.962764" elapsed="0.018404"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:21.981532" elapsed="0.000072"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:21.981303" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.981269" elapsed="0.000441"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:21.985717" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:21.981946" elapsed="0.003865"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:21.985901" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:51:21.986291" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:21.940540" elapsed="0.045780"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:21.986381" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:21.986539" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:21.939758" elapsed="0.046824"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.988125" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782281, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:21.987298" elapsed="0.000857"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:21.988204" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:21.988389" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782281, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:21.986875" elapsed="0.001541"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:21.988883" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.988644" elapsed="0.000267"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:21.989310" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.989071" elapsed="0.000265"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:21.989383" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:21.989562" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:21.751800" elapsed="0.237790"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:21.989650" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:51:21.989804" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:21.750989" elapsed="0.238841"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.990145" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.989918" 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="PASS" start="2026-04-10T00:51:21.990435" elapsed="0.000212"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:21.990225" elapsed="0.000460"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.990859" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.990709" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.989899" elapsed="0.001034"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:51:21.750772" elapsed="0.240187"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:21.257841" elapsed="0.733153"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:51:21.991042" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:21.991249" level="INFO">${leader_list} = [3]</msg>
<msg time="2026-04-10T00:51:21.991295" level="INFO">${follower_list} = [1, 2]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:51:21.253777" elapsed="0.737542"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.991840" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:51:21.991918" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:51:21.991501" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:21.992231" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:21.992013" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:21.991995" elapsed="0.000365"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:51:21.994741" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:51:21.992512" elapsed="0.002277"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:51:21.995148" level="INFO">${leader} = 3</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:21.994958" elapsed="0.000215"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:51:21.995220" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:51:21.250812" elapsed="0.744565"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:51:21.250506" elapsed="0.744920"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.001674" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:22.001207" elapsed="0.000496"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.002180" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:22.001868" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:22.002252" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:22.002413" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:22.000814" elapsed="0.001623"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:51:22.002613" elapsed="0.000165"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.003279" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:22.002941" elapsed="0.000365"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.003810" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:22.003473" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.004236" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:22.003994" elapsed="0.000268"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.007404" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.006900" elapsed="0.000531"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:22.007478" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:22.007665" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:22.006302" elapsed="0.001389"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.072456" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.071872" elapsed="0.000621"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:22.073407" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:22.073058" elapsed="0.000429">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:22.073606" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:22.072696" elapsed="0.000938"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.074186" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:22.073803" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:22.074521" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:22.074875" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:22.074376" elapsed="0.000526"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.075315" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.075061" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.076529" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.076269" elapsed="0.000325"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.077032" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.076761" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.077428" 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-04-10T00:51:22.077662" 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-04-10T00:51:22.077855" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:22.077281" elapsed="0.000634"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.077124" elapsed="0.000824"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:22.078002" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:51:22.078180" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:22.075908" elapsed="0.002297"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.075456" elapsed="0.002782"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.078441" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.078264" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.075429" elapsed="0.003093"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.079140" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.078691" elapsed="0.000476"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:22.079216" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:22.070990" elapsed="0.008350"/>
</kw>
<msg time="2026-04-10T00:51:22.079394" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:22.057713" elapsed="0.021733"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.092444" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.105216" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.117865" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.118083" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.118356" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.118802" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.118646" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:22.118627" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.119029" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.119200" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.119367" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:22.118585" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.118451" elapsed="0.000997"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.119644" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.119734" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:51:22.120088" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:22.051882" elapsed="0.068244"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:22.122302" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:22.121887" elapsed="0.000522">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:22.122570" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:22.121323" elapsed="0.001285"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.123092" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.122715" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.123933" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.123472" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.123210" elapsed="0.000813"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.122687" elapsed="0.001367"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.126919" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:22.124336" elapsed="0.002609"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:22.126997" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:51:22.127300" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:22.120838" elapsed="0.006496"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:22.129020" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:22.128774" elapsed="0.000310">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:22.129179" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:22.128418" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:22.129411" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:22.129275" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.129257" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.129863" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.130039" elapsed="0.000063"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.130152" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:51:22.132421" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:22.127937" elapsed="0.004522"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.134272" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.134010" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.134789" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.134472" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:22.144502" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:22.145185" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:22.145521" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:22.136984" elapsed="0.008600"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.134899" elapsed="0.010757"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.145962" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.145701" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.134881" elapsed="0.011211"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.152032" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.147704" elapsed="0.004870"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.147339" elapsed="0.005290"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.147310" elapsed="0.005356"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.156731" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.153086" elapsed="0.003714"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.152751" elapsed="0.004099"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.152725" elapsed="0.004160"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.157691" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.157150" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.158030" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.157789" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.158625" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.158294" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.158120" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.157771" elapsed="0.000938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.159256" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.158872" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.159614" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.159357" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.160156" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.159859" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.159698" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.159338" elapsed="0.000900"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:22.160430" elapsed="0.000376"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:22.161288" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.160975" elapsed="0.000339"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.161482" elapsed="0.002634"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:22.146673" elapsed="0.017515"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.164373" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:22.164260" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.164242" elapsed="0.000252"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:22.173143" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:22.164659" elapsed="0.008514"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:22.173227" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:51:22.173659" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:22.133066" elapsed="0.040633"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:22.173792" elapsed="0.000075"/>
</return>
<msg time="2026-04-10T00:51:22.174133" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:22.023365" elapsed="0.150809"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.175122" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.174365" elapsed="0.000939"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.174346" elapsed="0.000998"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:22.175436" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:51:22.012190" elapsed="0.163459"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.007797" elapsed="0.167900"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.007774" elapsed="0.167948"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:51:22.176450" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-04-10T00:51:22.176324" elapsed="0.000279"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.176671" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:22.176631" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.176307" elapsed="0.000475"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.176935" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:51:22.177055" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:22.176019" elapsed="0.001061"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.177676" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.177248" elapsed="0.000455"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.178419" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.177862" elapsed="0.000587"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.185520" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.184845" elapsed="0.000854"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.186667" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.185955" elapsed="0.000868"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:22.196297" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:22.196359" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:22 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:22 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":2,"SnapshotIndex":95,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":95,"Leader":"member-1-shard-default-config","LastIndex":96,"RaftState":"Leader","LastApplied":96,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":96,"LastLeadershipChangeTime":"2026-04-10 00:49:56.029","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.138","active":true,"matchIndex":96,"voting":true,"id":"member-3-shard-default-config","nextIndex":97},{"timeSinceLastActivity":"00:00:00.138","active":true,"matchIndex":96,"voting":true,"id":"member-2-shard-default-config","nextIndex":97}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"729.4 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":96,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":9,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":11483},"timestamp":1775782282,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:22.196695" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:22.189353" elapsed="0.007381"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.186939" elapsed="0.009851"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.197164" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.196851" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.186907" elapsed="0.010413"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.204288" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":2,"SnapshotIndex":95,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":95,"Leader":"member-1-shard-default-config","LastIndex":96,"RaftState":"Leader","LastApplied":96,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":96,"LastLeadershipChangeTime":"2026-04-10 00:49:56.029","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.138","active":true,"matchIndex":96,"voting":true,"id":"member-3-shard-default-config","nextIndex":97},{"timeSinceLastActivity":"00:00:00.138","active":true,"matchIndex":96,"voting":true,"id":"member-2-shard-default-config","nextIndex":97}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"729.4 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":96,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":9,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":11483},"timestamp":1775782282,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.200407" elapsed="0.003973"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.200072" elapsed="0.004360"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.200006" elapsed="0.004492"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.207692" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.205102" elapsed="0.002637"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.204764" elapsed="0.003010"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.204696" elapsed="0.003122"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.208654" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.208076" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.209106" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.208859" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.209705" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.209373" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.209206" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.208814" elapsed="0.000993"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.210481" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.210059" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.210954" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.210714" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.211515" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.211217" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.211053" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.210670" elapsed="0.000965"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:22.211882" elapsed="0.000425"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:22.212957" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.212585" elapsed="0.000422"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.213257" elapsed="0.002495"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:22.198592" elapsed="0.017267"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.216222" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:22.215989" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.215957" elapsed="0.000413"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:22.220218" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757822...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:22.216619" elapsed="0.003691"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:22.220397" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:51:22.220785" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757822...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:22.179454" elapsed="0.041359"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:22.220873" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:22.221024" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757822...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:22.178698" elapsed="0.042352"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.222373" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782282, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.221661" elapsed="0.000741"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:22.222456" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:22.222696" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782282, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:22.221277" elapsed="0.001446"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:22.223113" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 96, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.222883" elapsed="0.000258"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:22.223530" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.223297" elapsed="0.000276"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:22.223621" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:22.223780" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:22.005503" elapsed="0.218302"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:22.223863" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:51:22.224014" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:22.004769" elapsed="0.219270"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.224342" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.224122" elapsed="0.000276"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.224645" elapsed="0.000207"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.224421" elapsed="0.000468"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.225061" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.224913" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.224105" elapsed="0.001030"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:22.004571" elapsed="0.220588"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.227751" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.227272" elapsed="0.000506"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:22.227822" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:22.227970" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:22.226908" elapsed="0.001086"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.287374" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.286973" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:22.288341" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:22.288047" elapsed="0.000381">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:22.288523" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:22.287605" elapsed="0.000960"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.289138" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:22.288735" elapsed="0.000431"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:22.289483" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:22.289686" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:22.289330" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.290119" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.289872" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.291166" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.290910" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.291698" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.291411" 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-04-10T00:51:22.292073" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.292280" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.292459" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:22.291934" elapsed="0.000583"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.291783" elapsed="0.000783"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:22.292623" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:51:22.292797" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:22.290586" elapsed="0.002236"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.290249" elapsed="0.002606"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.293063" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.292882" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.290223" elapsed="0.002918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.293760" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.293289" elapsed="0.000499"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:22.293835" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:22.286340" elapsed="0.007619"/>
</kw>
<msg time="2026-04-10T00:51:22.294013" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:22.273643" elapsed="0.020423"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.308641" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.321319" elapsed="0.000149"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.333923" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.334149" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.334334" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.334783" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.334626" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:22.334606" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.335014" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.335184" elapsed="0.000048"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.335380" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:22.334563" elapsed="0.000871"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.334425" elapsed="0.001038"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.335631" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.335713" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:51:22.336070" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:22.269088" elapsed="0.067020"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:22.338352" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:22.338047" elapsed="0.000386">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:22.338529" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:22.337262" elapsed="0.001312"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.338914" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.338647" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.339480" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.339181" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.338995" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.338628" elapsed="0.000952"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.341990" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:22.339733" elapsed="0.002284"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:22.342067" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:51:22.342373" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:22.336756" elapsed="0.005653"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:22.344109" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:22.343866" elapsed="0.000306">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:22.344265" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:22.343505" elapsed="0.000785"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:22.344496" elapsed="0.000222"/>
</return>
<status status="PASS" start="2026-04-10T00:51:22.344361" elapsed="0.000393"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.344342" elapsed="0.000437"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.344928" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.345101" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.345166" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:22.347651" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:22.343065" elapsed="0.004623"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.349540" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.349270" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.350019" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.349775" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:22.371353" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:22.372355" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:22.373039" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:22.352281" elapsed="0.020822"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.350128" elapsed="0.023088"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.373784" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.373288" elapsed="0.000667"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.350110" elapsed="0.023894"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.382867" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.376475" elapsed="0.006778"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.375961" elapsed="0.007330"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.375916" elapsed="0.007402"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.386078" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.383647" elapsed="0.002478"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.383380" elapsed="0.002780"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.383362" elapsed="0.002822"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.386832" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.386397" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.387168" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.386929" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.387741" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.387418" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.387251" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.386911" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.388341" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.387983" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.388688" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.388437" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.389223" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.388929" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.388770" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.388419" elapsed="0.000885"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:22.389491" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:22.390329" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.390026" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.390508" elapsed="0.002454"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:22.374889" elapsed="0.018147"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.393225" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:22.393111" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.393092" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:22.402159" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:22.393471" elapsed="0.008719"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:22.402244" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:51:22.402655" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:22.348283" elapsed="0.054410"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:22.402785" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:51:22.403122" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:22.244202" elapsed="0.158962"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.404118" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.403352" elapsed="0.000944"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.403333" elapsed="0.001002"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:22.404422" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:51:22.232409" elapsed="0.172223"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.228061" elapsed="0.176616"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.228044" elapsed="0.176658"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:51:22.405423" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:22.405297" elapsed="0.000292"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.405657" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:22.405618" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.405279" elapsed="0.000491"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.405921" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:51:22.406042" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:22.404995" elapsed="0.001073"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.406672" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.406238" elapsed="0.000461"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.407425" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.406859" elapsed="0.000595"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.414630" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.413892" elapsed="0.000906"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.415784" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.415062" elapsed="0.000883"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:22.427220" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:22.427395" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:22 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:22 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":95,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":95,"Leader":"member-1-shard-default-config","LastIndex":96,"RaftState":"Follower","LastApplied":96,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":96,"LastLeadershipChangeTime":"2026-04-10 00:51:04.137","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"566.0 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":96,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":11483},"timestamp":1775782282,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:22.428016" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:22.418509" elapsed="0.009597"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.416069" elapsed="0.012192"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.429272" elapsed="0.000111"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.428415" elapsed="0.001098"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.416034" elapsed="0.013726"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.444311" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":95,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":95,"Leader":"member-1-shard-default-config","LastIndex":96,"RaftState":"Follower","LastApplied":96,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":96,"LastLeadershipChangeTime":"2026-04-10 00:51:04.137","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"566.0 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":96,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":11483},"timestamp":1775782282,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.433379" elapsed="0.011654"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.433005" elapsed="0.012093"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.432929" elapsed="0.012287"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.449084" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.446390" elapsed="0.002744"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.445973" elapsed="0.003197"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.445903" elapsed="0.003313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.450074" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.449521" elapsed="0.000606"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.450533" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.450281" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.451149" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.450830" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.450659" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.450235" elapsed="0.001018"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.451960" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.451512" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.452404" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.452162" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.452997" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.452688" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.452506" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.452116" elapsed="0.000984"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:22.453354" elapsed="0.000476"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:22.454486" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.454098" elapsed="0.000439"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.454810" elapsed="0.002523"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:22.431318" elapsed="0.026296"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.458114" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:22.457867" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.457822" elapsed="0.000455"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:22.462280" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757822...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:22.458533" elapsed="0.003848"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:22.462479" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:51:22.462881" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757822...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:22.408466" elapsed="0.054444"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:22.462972" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:22.463131" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757822...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:22.407700" elapsed="0.055459"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.464864" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782282, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.463896" elapsed="0.000998"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:22.465040" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:22.465224" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782282, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:22.463435" elapsed="0.001816"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:22.465667" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 96, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.465414" elapsed="0.000282"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:22.466221" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.465968" elapsed="0.000281"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:22.466298" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:22.466455" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:22.226242" elapsed="0.240239"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:22.466749" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:51:22.467083" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:22.225507" elapsed="0.241632"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.468049" elapsed="0.000441"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.467328" elapsed="0.001323"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.469078" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.468735" elapsed="0.000468"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.469622" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.469255" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.467285" elapsed="0.002578"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:51:22.225332" elapsed="0.244584"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.474584" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.473685" elapsed="0.000934"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:22.474676" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:51:22.474881" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:22.473027" elapsed="0.001882"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.542387" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.541818" elapsed="0.000609"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:22.543289" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:22.542984" elapsed="0.000390">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:22.543471" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:22.542629" elapsed="0.000867"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.544090" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:22.543688" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:51:22.544440" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:51:22.544639" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:51:22.544290" elapsed="0.000461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.545188" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.544917" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.546365" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.545992" elapsed="0.000421"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.546868" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.546596" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.547249" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.547459" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.547656" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:51:22.547107" elapsed="0.000609"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.546953" elapsed="0.000795"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:51:22.547798" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:51:22.547972" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:51:22.545660" elapsed="0.002337"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.545320" elapsed="0.002710"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.548214" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.548056" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.545295" elapsed="0.003001"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.549090" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.548536" elapsed="0.000588"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:51:22.549175" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:51:22.541166" elapsed="0.008135"/>
</kw>
<msg time="2026-04-10T00:51:22.549357" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:22.528062" elapsed="0.021346"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.564240" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.579278" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.591921" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.592126" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.592304" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.592756" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.592605" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:51:22.592589" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.592977" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.593146" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.593312" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:51:22.592540" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.592432" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.593540" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.593634" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:22.593915" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:51:22.522809" elapsed="0.071143"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:22.595710" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:22.595433" elapsed="0.000348">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:22.595874" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:22.595081" elapsed="0.000817"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.596214" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.595968" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.596796" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.596475" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.596294" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.595950" elapsed="0.000928"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.599241" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:22.597028" elapsed="0.002240"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:51:22.599320" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:22.599682" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:22.594634" elapsed="0.005084"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:51:22.601326" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:51:22.601082" elapsed="0.000307">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:51:22.601484" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:51:22.600742" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:51:22.601733" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:51:22.601597" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.601578" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.601964" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.602136" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.602255" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:51:22.604559" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:51:22.600295" elapsed="0.004303"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.606409" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.606120" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.606870" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.606625" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:22.626066" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:22.627088" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:51:22.627583" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:22.609084" elapsed="0.018563"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.606980" elapsed="0.020768"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.628158" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.627807" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.606962" elapsed="0.021404"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.636254" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.630922" elapsed="0.005684"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.630342" elapsed="0.006301"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.630295" elapsed="0.006374"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.639431" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.636960" elapsed="0.002519"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.636727" elapsed="0.002786"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.636709" elapsed="0.002828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.640166" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.639741" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.640505" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.640265" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.641072" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.640771" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.640606" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.640246" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.641697" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.641317" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.642028" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.641794" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.642629" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.642271" elapsed="0.000385"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.642109" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.641776" elapsed="0.000937"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:22.642868" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:22.643709" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.643384" elapsed="0.000351"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.643892" elapsed="0.002520"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:22.629198" elapsed="0.017279"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.646691" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:22.646582" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.646561" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:22.659532" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:22.646907" elapsed="0.012693"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:22.659682" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:51:22.660181" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:22.605187" elapsed="0.055046"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:22.660365" elapsed="0.000102"/>
</return>
<msg time="2026-04-10T00:51:22.660888" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:51:22.491489" elapsed="0.169464"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.662313" elapsed="0.000087"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.661230" elapsed="0.001350"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.661202" elapsed="0.001507"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:22.662840" 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="PASS" start="2026-04-10T00:51:22.479703" elapsed="0.183495"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.474990" elapsed="0.188275"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.474968" elapsed="0.188332"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:51:22.664129" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:51:22.663995" elapsed="0.000250"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.664311" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:22.664272" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.663976" elapsed="0.000453"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.664607" elapsed="0.000024"/>
</kw>
<msg time="2026-04-10T00:51:22.664734" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:51:22.663672" elapsed="0.001088"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.665389" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.664946" elapsed="0.000471"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.666205" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.665614" elapsed="0.000621"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.673998" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.673174" elapsed="0.000986"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.675177" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.674418" elapsed="0.000920"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:22.684368" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:22.684444" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:22 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:22 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":95,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":95,"Leader":"member-1-shard-default-config","LastIndex":96,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":96,"LastLogIndex":96,"LastLeadershipChangeTime":"2026-04-10 00:49:56.029","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"228.9 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":96,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":11483},"timestamp":1775782282,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:22.684836" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:22.677866" elapsed="0.007009"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.675456" elapsed="0.009482"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.685361" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.685007" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.675423" elapsed="0.010104"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.691844" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":95,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":95,"Leader":"member-1-shard-default-config","LastIndex":96,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":96,"LastLogIndex":96,"LastLeadershipChangeTime":"2026-04-10 00:49:56.029","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"228.9 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":96,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":11483},"timestamp":1775782282,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.687970" elapsed="0.004035"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.687626" elapsed="0.004429"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.687523" elapsed="0.004594"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.695914" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.692663" elapsed="0.003298"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.692306" elapsed="0.003691"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.692244" elapsed="0.003797"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.696876" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.696314" elapsed="0.000613"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.697320" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.697074" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.697916" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.697607" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.697420" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.697029" elapsed="0.000989"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.698710" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.698269" elapsed="0.000518"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.699187" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.698946" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.699771" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:22.699450" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.699286" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.698901" elapsed="0.000970"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:22.700117" elapsed="0.000422"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:22.701175" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.700828" elapsed="0.000396"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.701471" elapsed="0.002578"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:22.686412" elapsed="0.017746"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.704511" elapsed="0.000075"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:22.704287" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.704255" elapsed="0.000435"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:22.708332" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757822...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:22.704915" elapsed="0.003508"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:22.708513" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:51:22.708812" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757822...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:22.667296" elapsed="0.041544"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:22.708898" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:22.709049" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757822...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:51:22.666455" elapsed="0.042620"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.710372" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782282, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:22.709683" elapsed="0.000718"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:22.710488" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:22.710735" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782282, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:22.709301" elapsed="0.001462"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:22.711217" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 96, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.710989" elapsed="0.000256"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:22.711661" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.711403" elapsed="0.000284"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:51:22.711734" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:22.711889" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:22.471942" elapsed="0.239971"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:51:22.711971" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:51:22.712121" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:51:22.470722" elapsed="0.241424"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.712444" elapsed="0.000207"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:22.712227" elapsed="0.000462"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.712859" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.712713" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.713076" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.712935" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.712209" elapsed="0.000939"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:51:22.470294" elapsed="0.242878"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:22.004319" elapsed="0.708887"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:51:22.713251" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:51:22.713452" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:51:22.713498" level="INFO">${follower_list} = [2, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:51:22.000070" elapsed="0.713452"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.713984" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:51:22.714059" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:51:22.713718" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.714364" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.714151" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.714134" elapsed="0.000306"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.716790" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:51:22.714591" elapsed="0.002247"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:51:22.717188" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.717003" elapsed="0.000209"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:51:22.717258" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:51:21.996500" elapsed="0.720910"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:51:21.995529" elapsed="0.721931"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:51:20.542468" elapsed="2.175025"/>
</for>
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:51:20.542050" elapsed="2.175517"/>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:51:18.223289" elapsed="4.494381"/>
</kw>
<arg>${restart_timeout}</arg>
<arg>2s</arg>
<arg>ClusterOpenFlow.Check OpenFlow Shards Status</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:51:18.222668" elapsed="4.495048"/>
</kw>
<doc>Wait for node convergence and check status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:51:17.086982" elapsed="5.630859"/>
</test>
<test id="s1-s2-t12" name="Verify Data Recovery After Leader Restart" line="119">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:51:22.721423" elapsed="0.000253"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:51:22.721145" elapsed="0.000590"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.722793" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:22.722667" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.722647" 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-04-10T00:51:22.728023" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:22.727918" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.727900" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.729107" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:22.728721" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.729616" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:22.729295" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:22.729686" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:51:22.729846" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:22.728321" elapsed="0.001591"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.735596" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:22.735471" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.735452" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.736861" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:22.736754" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.736736" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:22.737375" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.737076" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:22.737815" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:22.737585" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:22.786263" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:22.738344" elapsed="0.048035"/>
</kw>
<msg time="2026-04-10T00:51:22.786573" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:22.786623" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:22.738003" elapsed="0.048658"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:22.879230" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:22.787243" elapsed="0.092680"/>
</kw>
<msg time="2026-04-10T00:51:22.880144" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:22.880195" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:22.786843" elapsed="0.093390"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.880685" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.880350" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.880319" elapsed="0.000564"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:22.881408" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:22.881036" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.881822" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.881595" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.881574" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:22.881941" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:22.885187" elapsed="0.000164"/>
</kw>
<msg time="2026-04-10T00:51:22.885415" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:22.884023" elapsed="0.001546"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.885852" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.886188" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:22.883319" elapsed="0.003054"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:22.882271" elapsed="0.004168"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:22.736425" elapsed="0.150143"/>
</kw>
<msg time="2026-04-10T00:51:22.886685" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:22.886733" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:22.735818" elapsed="0.150954"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:22.886964" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:22.886855" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.886836" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.887467" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.887917" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.887993" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:22.735130" elapsed="0.152979"/>
</kw>
<msg time="2026-04-10T00:51:22.888209" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:22.888252" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:22.730296" elapsed="0.157996"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:22.888664" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:22.888381" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.888363" elapsed="0.000380"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:22.730149" elapsed="0.158618"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.894501" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:22.894388" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.894369" elapsed="0.000219"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:22.895770" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:22.895661" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:22.895642" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:22.896291" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:22.895988" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:22.896821" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:22.896536" elapsed="0.000312"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:22.955168" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:22.897353" elapsed="0.057931"/>
</kw>
<msg time="2026-04-10T00:51:22.955481" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:22.955529" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:22.897012" elapsed="0.058584"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:23.062024" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:22.956197" elapsed="0.106013"/>
</kw>
<msg time="2026-04-10T00:51:23.062389" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:23.062436" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:22.955788" elapsed="0.106685"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.062876" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:23.062600" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.062570" elapsed="0.000391"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.063445" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:23.063109" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.063850" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:23.063631" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.063613" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:23.063966" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:23.066670" elapsed="0.000162"/>
</kw>
<msg time="2026-04-10T00:51:23.066896" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:23.065587" elapsed="0.001445"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.067322" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.067705" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:23.064905" elapsed="0.002990"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:23.064277" elapsed="0.003687"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:22.895310" elapsed="0.172757"/>
</kw>
<msg time="2026-04-10T00:51:23.068168" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:23.068214" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:22.894743" elapsed="0.173512"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:23.068504" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:51:23.068385" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.068317" elapsed="0.000329"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.069097" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.069526" elapsed="0.000059"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:23.069654" 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-04-10T00:51:22.894039" elapsed="0.175756"/>
</kw>
<msg time="2026-04-10T00:51:23.069894" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:23.069940" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:22.889047" elapsed="0.180930"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.070315" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:23.070057" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.070039" elapsed="0.000355"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:51:22.888903" elapsed="0.181516"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:23.077901" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:23.077789" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.077770" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:23.079254" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:23.079125" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.079106" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:23.079833" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:23.079479" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:23.080272" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:23.080027" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:23.115295" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:23.080870" elapsed="0.034633"/>
</kw>
<msg time="2026-04-10T00:51:23.115768" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:23.115824" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:23.080501" elapsed="0.035370"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:23.185460" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:23.116685" elapsed="0.069114"/>
</kw>
<msg time="2026-04-10T00:51:23.186050" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:23.186102" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:23.116153" elapsed="0.069988"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.186682" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:23.186278" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.186236" elapsed="0.000541"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.187438" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:23.186984" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.187894" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:23.187660" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.187641" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:23.188013" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:23.190912" elapsed="0.000158"/>
</kw>
<msg time="2026-04-10T00:51:23.191133" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:23.189867" elapsed="0.001406"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.191584" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.191932" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:23.189177" elapsed="0.002945"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:23.188470" elapsed="0.003720"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:23.078810" elapsed="0.113482"/>
</kw>
<msg time="2026-04-10T00:51:23.192393" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:23.192439" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:23.078129" elapsed="0.114354"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:23.192798" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T00:51:23.192679" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.192655" 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-04-10T00:51:23.193325" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.193694" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:23.193769" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:23.077403" elapsed="0.116482"/>
</kw>
<msg time="2026-04-10T00:51:23.193985" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:23.194030" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:23.070739" elapsed="0.123332"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.194404" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:23.194148" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.194130" elapsed="0.000352"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:51:23.070586" elapsed="0.123920"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:22.729971" elapsed="0.464571"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:51:22.727556" elapsed="0.467067"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:51:22.722346" elapsed="0.472335"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:22.721893" elapsed="0.472835"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:51:22.718970" elapsed="0.475816"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.205723" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:23.205319" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.206218" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:23.205916" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:23.206290" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:23.206449" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:23.204926" elapsed="0.001547"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.217060" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:23.216727" elapsed="0.000361"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:23.217134" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:23.217285" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:23.216357" elapsed="0.000952"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.231114" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:23.230856" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.231582" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:23.231321" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.232031" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:23.231786" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.232468" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:23.232230" elapsed="0.000282"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:23.233363" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:51:23.233158" elapsed="0.000232"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:51:23.233751" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:51:23.233574" elapsed="0.000202"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:51:23.233928" elapsed="0.000202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.234537" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:23.234291" elapsed="0.000310"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:51:23.234644" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:23.234801" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:51:23.232734" elapsed="0.002092"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:23.245579" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:51:23.245630" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:23.245735" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:23.237317" elapsed="0.008444"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:23.234898" elapsed="0.010907"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.245988" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:23.245833" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.234880" elapsed="0.011195"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.249656" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:23.247119" elapsed="0.002582"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:23.246894" elapsed="0.002842"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.246876" elapsed="0.002885"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.252471" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:23.250042" elapsed="0.002477"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:23.249817" elapsed="0.002753"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.249800" elapsed="0.002797"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.253204" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:23.252773" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.253560" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:23.253304" elapsed="0.000371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.254178" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:23.253869" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:23.253701" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.253285" elapsed="0.000979"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.254824" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:23.254426" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.255157" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:23.254922" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.255722" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:23.255403" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:23.255241" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.254904" elapsed="0.000903"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:23.255962" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:23.256782" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:23.256475" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:23.256966" elapsed="0.002420"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:23.246434" elapsed="0.013016"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:23.259658" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:23.259526" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.259507" elapsed="0.000221"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:23.262415" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:23.259877" elapsed="0.002566"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:23.262493" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:51:23.262674" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:23.228089" elapsed="0.034610"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:23.262767" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:51:23.262919" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:51:23.225486" elapsed="0.037457"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:23.262995" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:51:23.263140" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:23.215903" elapsed="0.047261"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:51:23.211371" elapsed="0.051855"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:23.206728" elapsed="0.056533"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:23.206586" elapsed="0.056710"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.276266" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:23.275906" elapsed="0.000393"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:23.276358" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:51:23.276563" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:23.275501" elapsed="0.001090"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.293329" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:23.292906" elapsed="0.000486"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.293912" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:23.293663" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:23.301339" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:23.301429" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:23 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:23 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782283,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:23.301659" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:23.296656" elapsed="0.005060"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:23.294043" elapsed="0.007779"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.302242" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:23.301885" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.294017" elapsed="0.008385"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.308823" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782283,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:23.304427" elapsed="0.004482"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:23.304005" elapsed="0.004964"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.303976" elapsed="0.005033"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.312572" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:23.309601" elapsed="0.003027"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:23.309104" elapsed="0.003565"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.309075" elapsed="0.003622"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.313368" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:23.312918" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.313740" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:23.313475" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.314411" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:23.313990" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:23.313824" elapsed="0.000650"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.313455" elapsed="0.001040"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.315043" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:23.314675" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.315374" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:23.315140" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.316050" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:23.315637" elapsed="0.000440"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:23.315457" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.315123" elapsed="0.001011"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:23.316301" elapsed="0.000520"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:23.317485" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:23.316990" elapsed="0.000522"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:23.317688" elapsed="0.008996"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:23.303278" elapsed="0.023507"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:23.327179" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-10T00:51:23.327024" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:23.326992" elapsed="0.000295"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:23.327495" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:23.327591" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:51:23.330401" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782283,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:23.277084" elapsed="0.053366"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:23.330534" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:51:23.330726" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782283,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:23.274950" elapsed="0.055802"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.331942" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782283, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:23.331443" elapsed="0.000528"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:23.332021" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:23.332177" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782283, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:23.331026" elapsed="0.001178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:23.332643" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:23.332385" elapsed="0.000285"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.333166" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:23.332852" elapsed="0.000340"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.333760" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:23.333424" elapsed="0.000361"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:23.334361" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:23.333962" elapsed="0.000473">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:23.269659" elapsed="0.065126">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:24.351659" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:24.351249" elapsed="0.000444"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:24.351756" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:51:24.351929" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:24.350862" elapsed="0.001093"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:24.358957" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:24.358673" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:24.359421" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:24.359168" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:24.373740" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:24.373861" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:24 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:24 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782284,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:24.374179" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:24.361731" elapsed="0.012499"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:24.359596" elapsed="0.014712"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:24.374664" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:24.374356" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:24.359524" elapsed="0.015285"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:24.380573" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782284,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:24.376721" elapsed="0.003937"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:24.376364" elapsed="0.004348"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:24.376334" elapsed="0.004412"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:24.384769" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:24.381147" elapsed="0.003690"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:24.380827" elapsed="0.004059"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:24.380802" elapsed="0.004118"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:24.385823" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:24.385184" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:24.386298" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:24.385963" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:24.387053" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:24.386635" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:24.386415" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:24.385938" elapsed="0.001201"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:24.387685" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:24.387299" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:24.388015" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:24.387783" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:24.388681" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:24.388255" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:24.388096" elapsed="0.000649"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:24.387765" elapsed="0.001001"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:24.388926" elapsed="0.000525"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:24.390108" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:24.389640" elapsed="0.000495"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:24.390292" elapsed="0.008802"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:24.375685" elapsed="0.023492"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:24.399382" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:51:24.399262" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:24.399239" elapsed="0.000244"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:24.399668" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:24.399741" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:51:24.402150" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782284,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:24.352312" elapsed="0.049870"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:24.402238" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:24.402394" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782284,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:24.350231" elapsed="0.052271"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:24.403866" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782284, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:24.403421" elapsed="0.000474"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:24.403944" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:24.404101" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782284, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:24.403042" elapsed="0.001086"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:24.404492" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:24.404308" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:24.405022" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:24.404715" elapsed="0.000334"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:24.405521" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:24.405221" elapsed="0.000338"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:24.406090" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:24.405736" elapsed="0.000427">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:24.339838" elapsed="0.066436">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:25.418752" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:25.418200" elapsed="0.000599"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:25.418882" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T00:51:25.419122" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:25.417672" elapsed="0.001486"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:25.426637" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:25.426342" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:25.427109" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:25.426856" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:25.434746" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:25.434821" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:25 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:25 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782285,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:25.434921" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:25.429391" elapsed="0.005557"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:25.427230" elapsed="0.007763"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:25.435182" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:25.435023" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:25.427209" elapsed="0.008062"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:25.439906" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782285,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:25.436518" elapsed="0.003469"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:25.436288" elapsed="0.003752"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:25.436269" elapsed="0.003808"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:25.444408" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:25.440499" elapsed="0.003978"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:25.440164" elapsed="0.004362"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:25.440138" elapsed="0.004451"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:25.445588" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:25.445008" elapsed="0.000610"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:25.445938" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:25.445692" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:25.446646" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:25.446199" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:25.446030" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:25.445673" elapsed="0.001061"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:25.447303" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:25.446897" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:25.447677" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:25.447405" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:25.448366" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:25.447925" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:25.447762" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:25.447387" elapsed="0.001065"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:25.448650" elapsed="0.000735"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:25.450028" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:25.449586" elapsed="0.000469"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:25.450225" elapsed="0.008709"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:25.435847" elapsed="0.023160"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:25.459193" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:51:25.459080" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:25.459060" elapsed="0.000238"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:25.459451" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:25.459524" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:25.462180" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782285,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:25.419693" elapsed="0.042519"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:25.462264" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:51:25.462437" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782285,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:25.416809" elapsed="0.045655"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:25.463496" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782285, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:25.463075" elapsed="0.000451"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:25.463599" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:25.463760" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782285, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:25.462719" elapsed="0.001067"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:25.464152" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:25.463967" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:25.464700" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:25.464363" elapsed="0.000364"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:25.465307" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:25.465015" elapsed="0.000319"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:25.466059" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:25.465518" elapsed="0.000617">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:25.407240" elapsed="0.059009">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:26.478830" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:26.478426" elapsed="0.000438"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:26.478927" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:51:26.479125" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:26.478030" elapsed="0.001122"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:26.486444" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:26.486157" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:26.486935" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:26.486678" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:26.495332" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:26.495416" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:26 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:26 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782286,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:26.495528" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:26.489281" elapsed="0.006298"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:26.487060" elapsed="0.008574"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:26.495835" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:26.495664" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:26.487038" elapsed="0.008917"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:26.500040" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782286,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:26.497254" elapsed="0.002843"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:26.497014" elapsed="0.003123"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:26.496995" elapsed="0.003170"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:26.504407" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:26.500477" elapsed="0.004007"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:26.500226" elapsed="0.004342"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:26.500208" elapsed="0.004405"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:26.505645" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:26.504942" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:26.506290" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:26.505830" elapsed="0.000552"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:26.507474" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:26.506752" elapsed="0.000764"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:26.506418" elapsed="0.001182"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:26.505792" elapsed="0.001842"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:26.508484" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:26.507878" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:26.508871" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:26.508631" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:26.509690" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:26.509216" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:26.509048" elapsed="0.000711"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:26.508612" elapsed="0.001170"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:26.509943" elapsed="0.000509"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:26.511101" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:26.510659" elapsed="0.000470"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:26.511291" elapsed="0.008879"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:26.496537" elapsed="0.023711"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:26.520451" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:51:26.520330" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:26.520309" elapsed="0.000257"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:26.520740" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:26.520814" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:26.523463" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782286,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:26.479575" elapsed="0.043919"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:26.523566" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:26.523725" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782286,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:26.477484" elapsed="0.046268"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:26.524885" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782286, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:26.524432" elapsed="0.000483"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:26.524964" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:26.525121" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782286, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:26.524035" elapsed="0.001113"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:26.525521" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:26.525329" elapsed="0.000242"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:26.526104" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:26.525773" elapsed="0.000361"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:26.526817" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:26.526311" elapsed="0.000534"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:26.527386" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:26.527022" elapsed="0.000445">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:26.467277" elapsed="0.060324">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:27.540854" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:27.540460" elapsed="0.000427"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:27.540947" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:51:27.541118" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:27.540093" elapsed="0.001051"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:27.547985" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:27.547626" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:27.548445" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:27.548196" 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-04-10T00:51:27.556009" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:27.556091" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:27 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782287,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:27.556221" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:27.550681" elapsed="0.005576"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:27.548584" elapsed="0.007735"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:27.556602" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:27.556357" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:27.548562" elapsed="0.008165"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:27.561993" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782287,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:27.558352" elapsed="0.003711"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:27.558042" elapsed="0.004070"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:27.558017" elapsed="0.004129"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:27.565791" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:27.562608" elapsed="0.003231"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:27.562225" elapsed="0.003650"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:27.562201" elapsed="0.003698"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:27.566476" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:27.566079" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:27.566859" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:27.566593" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:27.567518" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:27.567104" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:27.566941" elapsed="0.000659"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:27.566574" elapsed="0.001048"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:27.568148" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:27.567782" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:27.568476" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:27.568244" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:27.569153" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:27.568749" elapsed="0.000430"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:27.568582" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:27.568226" elapsed="0.001009"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:27.569389" elapsed="0.000503"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:27.570489" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:27.570061" elapsed="0.000454"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:27.570690" elapsed="0.008517"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:27.557424" elapsed="0.021849"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:27.579501" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:51:27.579394" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:27.579375" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:27.579759" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:27.579830" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:51:27.582124" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782287,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:27.541499" elapsed="0.040654"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:27.582205" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:27.582355" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782287,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:27.539590" elapsed="0.042790"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:27.583524" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782287, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:27.583124" elapsed="0.000444"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:27.583623" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:27.583779" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782287, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:27.582754" elapsed="0.001051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:27.584167" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:27.583985" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:27.584692" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:27.584370" elapsed="0.000347"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:27.585150" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:27.584889" elapsed="0.000285"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:27.585708" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:27.585345" elapsed="0.000434">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:27.528508" elapsed="0.057380">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:28.598457" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:28.597861" elapsed="0.000642"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:28.598615" elapsed="0.000064"/>
</return>
<msg time="2026-04-10T00:51:28.598857" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:28.597129" elapsed="0.001762"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:28.606652" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:28.606371" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:28.607110" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:28.606865" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:28.615082" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:28.615167" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:28 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782288,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:28.615299" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:28.609309" elapsed="0.006027"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:28.607229" elapsed="0.008251"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:28.615767" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:28.615520" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:28.607208" elapsed="0.008682"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:28.621217" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782288,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:28.617636" elapsed="0.003703"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:28.617269" elapsed="0.004120"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:28.617242" elapsed="0.004182"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:28.624419" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:28.621803" elapsed="0.002663"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:28.621501" elapsed="0.003000"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:28.621478" elapsed="0.003047"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:28.625123" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:28.624728" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:28.625481" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:28.625220" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:28.626160" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:28.625748" elapsed="0.000439"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:28.625579" elapsed="0.000644"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:28.625202" elapsed="0.001043"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:28.626795" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:28.626402" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:28.627123" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:28.626892" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:28.627783" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:28.627360" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:28.627202" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:28.626874" elapsed="0.000992"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:28.628019" elapsed="0.000484"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:28.629119" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:28.628687" elapsed="0.000458"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:28.629336" elapsed="0.008315"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:28.616629" elapsed="0.021089"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:28.637900" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:51:28.637791" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:28.637772" elapsed="0.000221"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:28.638143" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:28.638213" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:51:28.640936" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782288,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:28.599387" elapsed="0.041577"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:28.641015" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:28.641165" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782288,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:28.596227" elapsed="0.044964"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:28.642257" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782288, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:28.641861" elapsed="0.000425"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:28.642334" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:28.642489" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782288, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:28.641492" elapsed="0.001023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:28.643093" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:28.642911" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:28.643617" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:28.643296" elapsed="0.000349"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:28.644083" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:28.643819" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:28.644646" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:28.644280" elapsed="0.000440">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:28.586777" elapsed="0.058052">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:29.658689" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:29.658179" elapsed="0.000557"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:29.658814" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:51:29.659038" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:29.657683" elapsed="0.001390"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:29.666063" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:29.665796" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:29.666525" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:29.666273" elapsed="0.000341"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:29.674949" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:29.675011" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:29 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782289,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:29.675121" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:29.669668" elapsed="0.005480"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:29.666698" elapsed="0.008496"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:29.675381" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:29.675223" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:29.666676" elapsed="0.008848"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:29.681015" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782289,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:29.677240" elapsed="0.003845"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:29.676924" elapsed="0.004210"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:29.676898" elapsed="0.004271"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:29.684860" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:29.681649" elapsed="0.003261"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:29.681248" elapsed="0.003698"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:29.681224" elapsed="0.003746"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:29.685642" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:29.685149" elapsed="0.000521"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:29.685994" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:29.685754" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:29.686673" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:29.686240" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:29.686077" elapsed="0.000661"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:29.685734" elapsed="0.001026"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:29.687292" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:29.686921" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:29.687662" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:29.687391" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:29.688315" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:29.687907" elapsed="0.000436"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:29.687746" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:29.687373" elapsed="0.001027"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:29.688569" elapsed="0.000492"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:29.689682" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:29.689229" elapsed="0.000480"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:29.689864" elapsed="0.008489"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:29.676285" elapsed="0.022135"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:29.698665" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:51:29.698493" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:29.698474" 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-04-10T00:51:29.698956" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:29.699032" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:51:29.702055" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782289,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:29.659632" elapsed="0.042452"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:29.702137" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:29.702288" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782289,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:29.656992" elapsed="0.045322"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:29.703302" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782289, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:29.702906" elapsed="0.000424"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:29.703377" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:29.703569" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782289, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:29.702542" elapsed="0.001056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:29.703963" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:29.703783" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:29.704466" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:29.704163" elapsed="0.000330"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:29.704997" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:29.704685" elapsed="0.000339"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:29.705695" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:29.705198" elapsed="0.000570">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:29.645932" elapsed="0.059946">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:30.718164" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:30.717739" elapsed="0.000459"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:30.718260" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:51:30.718467" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:30.717176" elapsed="0.001318"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:30.729277" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:30.728977" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:30.729800" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:30.729533" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:30.737290" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:30.737351" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:30 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782290,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:30.737448" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:30.732023" elapsed="0.005451"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:30.729927" elapsed="0.007643"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:30.737785" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:30.737621" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:30.729903" elapsed="0.007969"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:30.742038" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782290,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:30.739318" elapsed="0.002789"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:30.739090" elapsed="0.003068"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:30.739072" elapsed="0.003120"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:30.746227" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:30.742624" elapsed="0.003670"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:30.742270" elapsed="0.004071"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:30.742247" elapsed="0.004128"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:30.747196" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:30.746647" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:30.747684" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:30.747332" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:30.748683" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:30.748038" elapsed="0.000683"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:30.747807" elapsed="0.000964"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:30.747307" elapsed="0.001495"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:30.749617" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:30.749027" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:30.749983" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:30.749748" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:30.750721" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:30.750291" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:30.750126" elapsed="0.000659"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:30.749730" elapsed="0.001077"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:30.750964" elapsed="0.000485"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:30.752062" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:30.751634" elapsed="0.000455"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:30.752246" elapsed="0.008534"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:30.738652" elapsed="0.022202"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:30.761046" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:51:30.760931" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:30.760911" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:30.761298" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:30.761372" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:51:30.763790" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782290,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:30.718947" elapsed="0.044873"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:30.763875" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:30.764029" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782290,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:30.716344" elapsed="0.047711"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:30.765342" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782290, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:30.764932" elapsed="0.000439"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:30.765419" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:30.765648" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782290, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:30.764288" elapsed="0.001388"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:30.766036" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:30.765856" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:30.766540" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:30.766237" elapsed="0.000347"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:30.767024" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:30.766761" elapsed="0.000288"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:30.767584" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:30.767219" elapsed="0.000437">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:30.706866" elapsed="0.060899">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:31.778752" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:31.778370" elapsed="0.000416"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:31.778843" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:51:31.779009" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:31.778009" elapsed="0.001026"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:31.785878" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:31.785615" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:31.786414" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:31.786169" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:31.793808" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:31.793869" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:31 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:31 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782291,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:31.793965" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:31.788669" elapsed="0.005321"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:31.786532" elapsed="0.007502"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:31.794220" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:31.794063" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:31.786512" elapsed="0.007796"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:31.799112" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782291,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:31.795577" elapsed="0.003604"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:31.795292" elapsed="0.003937"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:31.795274" elapsed="0.003989"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:31.803293" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:31.799727" elapsed="0.003678"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:31.799381" elapsed="0.004072"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:31.799349" elapsed="0.004139"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:31.804157" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:31.803756" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:31.804492" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:31.804254" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:31.805166" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:31.804755" elapsed="0.000438"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:31.804591" elapsed="0.000637"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:31.804236" elapsed="0.001014"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:31.805786" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:31.805408" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:31.806114" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:31.805882" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:31.806814" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:31.806375" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:31.806214" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:31.805865" elapsed="0.001032"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:31.807051" elapsed="0.000528"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:31.808177" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:31.807749" elapsed="0.000454"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:31.808359" elapsed="0.008614"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:31.794858" elapsed="0.022194"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:31.817317" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:51:31.817197" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:31.817173" elapsed="0.000244"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:31.817606" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:31.817682" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:51:31.820287" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782291,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:31.779397" elapsed="0.040920"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:31.820370" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:31.820524" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782291,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:31.777515" elapsed="0.043050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:31.821618" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782291, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:31.821180" elapsed="0.000467"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:31.821696" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:31.821852" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782291, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:31.820807" elapsed="0.001071"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:31.822239" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:31.822058" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:31.823022" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:31.822441" elapsed="0.000609"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:31.823510" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:31.823224" elapsed="0.000312"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:31.824073" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:31.823724" elapsed="0.000422">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:31.768695" elapsed="0.055563">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:32.836267" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:32.835687" elapsed="0.000642"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:32.836440" elapsed="0.000067"/>
</return>
<msg time="2026-04-10T00:51:32.836772" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:32.835141" elapsed="0.001680"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:32.846269" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:32.845961" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:32.846759" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:32.846488" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:32.854141" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:32.854202" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:32 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:32 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782292,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:32.854303" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:32.849036" elapsed="0.005294"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:32.846886" elapsed="0.007563"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:32.854664" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:32.854482" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:32.846863" elapsed="0.007895"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:32.858739" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782292,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:32.856045" elapsed="0.002747"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:32.855811" elapsed="0.003017"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:32.855788" elapsed="0.003064"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:32.861712" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:32.859137" elapsed="0.002623"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:32.858910" elapsed="0.002885"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:32.858893" elapsed="0.002926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:32.862413" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:32.862007" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:32.862779" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:32.862512" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:32.863445" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:32.863029" elapsed="0.000443"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:32.862862" elapsed="0.000647"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:32.862493" elapsed="0.001037"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:32.864079" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:32.863709" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:32.864411" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:32.864176" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:32.865125" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:32.864673" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:32.864493" elapsed="0.000695"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:32.864159" elapsed="0.001051"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:32.865368" elapsed="0.000505"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:32.866475" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:32.866042" elapsed="0.000459"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:32.866688" elapsed="0.008317"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:32.855325" elapsed="0.019750"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:32.875261" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:51:32.875149" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:32.875130" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:32.875509" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:32.875598" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:32.878182" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782292,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:32.837585" elapsed="0.040626"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:32.878265" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:32.878421" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782292,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:32.834418" elapsed="0.044029"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:32.879510" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782292, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:32.879108" elapsed="0.000431"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:32.879605" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:32.879763" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782292, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:32.878753" elapsed="0.001039"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:32.880158" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:32.879974" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:32.880788" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:32.880360" elapsed="0.000456"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:32.881297" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:32.880990" elapsed="0.000333"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:32.881869" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:32.881497" elapsed="0.000446">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:32.825405" elapsed="0.056652">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:33.893119" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:33.892518" elapsed="0.000646"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:33.893243" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:51:33.893475" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:33.892011" elapsed="0.001501"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:33.900724" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:33.900432" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:33.901180" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:33.900933" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:33.911117" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:33.911200" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:33 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:33 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782293,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:33.911333" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:33.903415" elapsed="0.007954"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:33.901300" elapsed="0.010130"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:33.911710" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:33.911469" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:33.901279" elapsed="0.010558"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:33.917360" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782293,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:33.913618" elapsed="0.003817"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:33.913262" elapsed="0.004223"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:33.913236" elapsed="0.004285"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:33.920935" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:33.917945" elapsed="0.003038"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:33.917623" elapsed="0.003396"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:33.917598" elapsed="0.003446"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:33.921663" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:33.921227" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:33.922082" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:33.921836" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:33.922806" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:33.922331" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:33.922166" elapsed="0.000705"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:33.921814" elapsed="0.001080"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:33.923431" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:33.923059" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:33.923785" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:33.923530" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:33.924438" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:33.924030" elapsed="0.000436"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:33.923869" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:33.923512" elapsed="0.001011"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:33.924705" elapsed="0.000492"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:33.925812" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:33.925364" elapsed="0.000475"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:33.925997" elapsed="0.008873"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:33.912632" elapsed="0.022325"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:33.935168" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:51:33.935049" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:33.935023" 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-04-10T00:51:33.935445" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:33.935519" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:33.938217" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782293,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:33.894029" elapsed="0.044219"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:33.938306" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:33.938466" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782293,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:33.891314" elapsed="0.047178"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:33.939880" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782293, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:33.939373" elapsed="0.000537"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:33.939959" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:33.940119" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782293, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:33.938818" elapsed="0.001328"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:33.940516" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:33.940328" elapsed="0.000505"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:33.941340" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:33.941023" elapsed="0.000343"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:33.941872" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:33.941556" elapsed="0.000343"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:33.942513" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:33.942147" elapsed="0.000511">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:33.883047" elapsed="0.059729">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:34.956101" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:34.955421" elapsed="0.000732"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:34.956242" elapsed="0.000068"/>
</return>
<msg time="2026-04-10T00:51:34.956508" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:34.954788" elapsed="0.001781"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:34.966821" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:34.966375" elapsed="0.000516"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:34.967347" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:34.967085" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:34.975905" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:34.976015" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782294,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:34.976177" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:34.969748" elapsed="0.006461"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:34.967523" elapsed="0.008746"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:34.976576" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:34.976313" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:34.967480" elapsed="0.009192"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:34.980923" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782294,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:34.978127" elapsed="0.002851"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:34.977862" elapsed="0.003153"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:34.977838" elapsed="0.003203"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:34.984040" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:34.981345" elapsed="0.002752"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:34.981102" elapsed="0.003034"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:34.981083" elapsed="0.003079"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:34.984848" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:34.984382" elapsed="0.000512"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:34.985370" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:34.985009" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:34.986429" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:34.985795" elapsed="0.000678"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:34.985494" elapsed="0.001036"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:34.984980" elapsed="0.001610"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:34.987396" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:34.986838" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:34.987965" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:34.987565" elapsed="0.000495"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:34.988980" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:34.988342" elapsed="0.000762"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:34.988100" elapsed="0.001058"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:34.987516" elapsed="0.001673"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:34.989421" elapsed="0.000740"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:34.991026" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:34.990398" elapsed="0.000666"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:34.991288" elapsed="0.011794"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:34.977314" elapsed="0.025886"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:35.003461" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-10T00:51:35.003321" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:35.003286" elapsed="0.000314"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:35.003830" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:35.003957" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:51:35.006370" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782294,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:34.957128" elapsed="0.049274"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:35.006456" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:35.006631" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782294,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:34.953683" elapsed="0.052975"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:35.007908" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782294, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:35.007358" elapsed="0.000601"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:35.008007" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:35.008166" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782294, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:35.006935" elapsed="0.001257"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:35.008575" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:35.008373" elapsed="0.000229"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:35.009096" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:35.008780" elapsed="0.000344"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:35.009575" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:35.009296" elapsed="0.000305"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:35.010131" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:35.009774" elapsed="0.000429">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:34.943757" elapsed="0.066561">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:36.021532" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:36.021108" elapsed="0.000476"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:36.021646" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:51:36.021823" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:36.020713" elapsed="0.001136"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:36.030420" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:36.030063" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:36.031070" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:36.030800" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:36.038719" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:36.038785" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:36 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:36 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782296,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:36.038894" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:36.033561" elapsed="0.005362"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:36.031203" elapsed="0.007769"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:36.039171" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:36.039005" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:36.031180" elapsed="0.008080"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:36.044034" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782296,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:36.040582" elapsed="0.003524"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:36.040328" elapsed="0.003828"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:36.040309" elapsed="0.003883"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:36.050049" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:36.044622" elapsed="0.005498"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:36.044273" elapsed="0.005896"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:36.044249" elapsed="0.005956"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:36.051089" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:36.050472" elapsed="0.000652"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:36.051635" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:36.051235" elapsed="0.000489"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:36.052833" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:36.052214" elapsed="0.000659"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:36.051763" elapsed="0.001167"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:36.051205" elapsed="0.001757"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:36.053789" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:36.053241" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:36.054273" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:36.053930" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:36.055213" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:36.054666" elapsed="0.000584"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:36.054393" elapsed="0.000908"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:36.053903" elapsed="0.001426"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:36.055582" elapsed="0.000672"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:36.057119" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:36.056492" elapsed="0.000665"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:36.057447" elapsed="0.012580"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:36.039864" elapsed="0.030274"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:36.070425" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-04-10T00:51:36.070260" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:36.070228" elapsed="0.000444"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:36.070922" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:36.071032" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:51:36.074992" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782296,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:36.022366" elapsed="0.052672"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:36.075123" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:51:36.075363" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782296,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:36.020015" elapsed="0.055390"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:36.077049" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782296, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:36.076366" elapsed="0.000722"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:36.077157" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:51:36.077416" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782296, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:36.075801" elapsed="0.001655"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:36.078013" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:36.077745" elapsed="0.000307"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:36.078837" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:36.078333" elapsed="0.000544"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:36.079543" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:36.079138" elapsed="0.000464"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:36.080283" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:36.079842" elapsed="0.000515">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:36.011658" elapsed="0.068814">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:37.093287" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:37.092752" elapsed="0.000582"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:37.093421" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T00:51:37.093692" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:37.092173" elapsed="0.001558"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:37.102498" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:37.101979" elapsed="0.000591"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:37.103076" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:37.102767" 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-04-10T00:51:37.112368" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:37.112487" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:37 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:37 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782297,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:37.112721" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:37.106066" elapsed="0.006712"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:37.103232" elapsed="0.009635"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:37.113406" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:37.113051" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:37.103204" elapsed="0.010419"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:37.119372" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782297,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:37.115811" elapsed="0.003623"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:37.115459" elapsed="0.004015"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:37.115431" elapsed="0.004071"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:37.123347" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:37.119931" elapsed="0.003482"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:37.119618" elapsed="0.003841"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:37.119590" elapsed="0.003903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:37.124339" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:37.123798" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:37.124767" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:37.124475" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:37.125489" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:37.125048" elapsed="0.000470"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:37.124865" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:37.124449" elapsed="0.001149"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:37.126223" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:37.125780" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:37.127010" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:37.126326" elapsed="0.000860"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:37.128648" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:37.127674" elapsed="0.001048"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:37.127247" elapsed="0.001558"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:37.126307" elapsed="0.002547"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:37.129205" elapsed="0.001128"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:37.131771" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:37.130793" elapsed="0.001039"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:37.132188" elapsed="0.010087"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:37.114802" elapsed="0.027551"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:37.142637" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:51:37.142495" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:37.142470" 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-04-10T00:51:37.142898" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:37.142971" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:51:37.145509" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782297,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:37.094310" elapsed="0.051228"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:37.145608" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:37.145766" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782297,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:37.091311" elapsed="0.054482"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:37.146985" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782297, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:37.146539" elapsed="0.000475"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:37.147064" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:37.147223" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782297, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:37.146040" elapsed="0.001210"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:37.147889" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:37.147430" elapsed="0.000485"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:37.148406" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:37.148093" elapsed="0.000340"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:37.148936" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:37.148633" elapsed="0.000329"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:37.149489" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:37.149136" elapsed="0.000442">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:37.081355" elapsed="0.068336">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:38.163053" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:38.162531" elapsed="0.000565"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:38.163170" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:51:38.163395" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:38.162028" elapsed="0.001445"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:38.172713" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:38.172434" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:38.173164" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:38.172919" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:38.180094" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:38.180195" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:38 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:38 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782298,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:38.180348" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:38.175347" elapsed="0.005039"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:38.173280" elapsed="0.007166"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:38.180742" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:38.180486" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:38.173260" elapsed="0.007604"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:38.186269" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782298,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:38.182524" elapsed="0.003814"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:38.182215" elapsed="0.004172"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:38.182190" elapsed="0.004232"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:38.189768" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:38.186835" elapsed="0.002981"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:38.186500" elapsed="0.003351"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:38.186476" elapsed="0.003399"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:38.190445" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:38.190056" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:38.190857" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:38.190617" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:38.191537" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:38.191102" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:38.190939" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:38.190598" elapsed="0.001040"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:38.192166" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:38.191799" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:38.192496" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:38.192263" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:38.193182" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:38.192769" elapsed="0.000441"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:38.192607" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:38.192245" elapsed="0.001022"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:38.193421" elapsed="0.000517"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:38.194594" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:38.194128" elapsed="0.000495"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:38.194798" elapsed="0.008718"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:38.181613" elapsed="0.022067"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:38.203859" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:51:38.203751" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:38.203733" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:38.204103" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:38.204188" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:38.206799" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782298,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:38.164040" elapsed="0.042797"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:38.206890" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:38.207054" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782298,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:38.161343" elapsed="0.045737"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:38.208085" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782298, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:38.207687" elapsed="0.000427"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:38.208162" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:38.208319" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782298, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:38.207306" elapsed="0.001038"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:38.208743" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:38.208521" elapsed="0.000248"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:38.209242" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:38.208943" elapsed="0.000324"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:38.209791" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:38.209438" elapsed="0.000379"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:38.210417" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:38.209987" elapsed="0.000502">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:38.150672" elapsed="0.059948">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:39.222768" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:39.222390" elapsed="0.000410"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:39.222858" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:51:39.223026" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:39.222031" elapsed="0.001020"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:39.229975" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:39.229714" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:39.230467" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:39.230181" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:39.237528" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:39.237617" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:39 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:39 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782299,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:39.237713" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:39.232724" elapsed="0.005015"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:39.230606" elapsed="0.007177"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:39.237963" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:39.237809" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:39.230585" elapsed="0.007470"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:39.241852" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782299,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:39.239243" elapsed="0.002660"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:39.239020" elapsed="0.002917"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:39.239002" elapsed="0.002960"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:39.245205" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:39.242243" elapsed="0.003029"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:39.242019" elapsed="0.003303"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:39.242002" elapsed="0.003355"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:39.246173" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:39.245635" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:39.246685" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:39.246312" elapsed="0.000456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:39.247628" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:39.247028" elapsed="0.000656"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:39.246802" elapsed="0.000934"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:39.246285" elapsed="0.001481"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:39.248499" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:39.247991" elapsed="0.000546"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:39.248991" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:39.248665" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:39.249947" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:39.249330" elapsed="0.000731"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:39.249105" elapsed="0.001011"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:39.248640" elapsed="0.001507"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:39.250364" elapsed="0.000726"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:39.251957" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:39.251326" elapsed="0.000668"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:39.252215" elapsed="0.014606"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:39.238593" elapsed="0.028426"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:39.267233" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:51:39.267095" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:39.267076" elapsed="0.000251"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:39.267482" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:39.267581" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:39.269957" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782299,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:39.223405" elapsed="0.046590"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:39.270053" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:39.270208" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782299,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:39.221532" elapsed="0.048703"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:39.271370" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782299, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:39.270949" elapsed="0.000450"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:39.271448" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:39.271631" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782299, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:39.270461" elapsed="0.001198"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:39.272020" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:39.271838" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:39.272528" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:39.272224" elapsed="0.000347"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:39.273033" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:39.272762" elapsed="0.000296"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:39.273623" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:39.273230" elapsed="0.000466">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:39.211465" elapsed="0.062342">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:40.284937" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:40.284574" elapsed="0.000395"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:40.285027" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:51:40.285195" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:40.284192" elapsed="0.001028"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:40.292068" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:40.291773" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:40.292703" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:40.292426" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:40.300391" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:40.300471" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:40 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:40 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782300,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:40.300618" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:40.294977" elapsed="0.005672"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:40.292826" elapsed="0.007885"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:40.300983" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:40.300756" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:40.292805" elapsed="0.008274"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:40.305117" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782300,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:40.302417" elapsed="0.002750"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:40.302171" elapsed="0.003032"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:40.302150" elapsed="0.003077"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:40.309696" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:40.305509" elapsed="0.004256"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:40.305284" elapsed="0.004531"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:40.305267" elapsed="0.004581"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:40.310674" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:40.310104" elapsed="0.000609"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:40.311146" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:40.310813" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:40.312093" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:40.311492" elapsed="0.000639"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:40.311262" elapsed="0.000918"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:40.310788" elapsed="0.001551"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:40.313120" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:40.312585" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:40.313649" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:40.313256" elapsed="0.000478"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:40.314608" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:40.313988" elapsed="0.000672"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:40.313767" elapsed="0.000961"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:40.313231" elapsed="0.001530"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:40.315015" elapsed="0.000781"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:40.316719" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:40.316040" elapsed="0.000719"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:40.316983" elapsed="0.008741"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:40.301688" elapsed="0.024207"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:40.326083" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:51:40.325971" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:40.325952" elapsed="0.000285"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:40.326391" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:40.326462" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:40.328833" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782300,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:40.285622" elapsed="0.043239"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:40.328914" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:40.329066" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782300,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:40.283668" elapsed="0.045424"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:40.330405" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782300, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:40.329958" elapsed="0.000477"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:40.330486" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:40.330664" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782300, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:40.329328" elapsed="0.001363"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:40.331055" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:40.330872" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:40.331585" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:40.331259" elapsed="0.000355"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:40.332055" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:40.331787" elapsed="0.000293"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:40.332655" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:40.332254" elapsed="0.000473">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:40.274693" elapsed="0.058147">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:41.344804" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:41.344344" elapsed="0.000508"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:41.344923" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:51:41.345140" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:41.343956" elapsed="0.001211"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:41.352470" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:41.352183" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:41.352979" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:41.352722" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:41.360521" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:41.360615" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:41 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:41 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782301,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:41.360719" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:41.355321" elapsed="0.005425"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:41.353105" elapsed="0.007686"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:41.361134" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:41.360899" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:41.353082" elapsed="0.008153"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:41.365230" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782301,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:41.362530" elapsed="0.002770"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:41.362293" elapsed="0.003046"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:41.362274" elapsed="0.003090"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:41.369271" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:41.365737" elapsed="0.003609"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:41.365423" elapsed="0.003976"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:41.365405" elapsed="0.004028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:41.370365" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:41.369730" elapsed="0.000675"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:41.370875" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:41.370506" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:41.371855" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:41.371216" elapsed="0.000677"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:41.370990" elapsed="0.000954"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:41.370480" elapsed="0.001494"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:41.372770" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:41.372206" elapsed="0.000602"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:41.373268" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:41.372932" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:41.374227" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:41.373646" elapsed="0.000619"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:41.373383" elapsed="0.000931"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:41.372905" elapsed="0.001439"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:41.374581" elapsed="0.000712"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:41.376366" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:41.375585" elapsed="0.000833"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:41.376699" elapsed="0.009104"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:41.361852" elapsed="0.024037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:41.386134" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T00:51:41.385993" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:41.385963" elapsed="0.000290"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:41.386459" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:41.386597" elapsed="0.000297"/>
</return>
<msg time="2026-04-10T00:51:41.389841" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782301,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:41.345577" elapsed="0.044310"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:41.389954" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:51:41.390121" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782301,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:41.343328" elapsed="0.046822"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:41.391468" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782301, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:41.390872" elapsed="0.000625"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:41.391562" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:41.391724" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782301, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:41.390396" elapsed="0.001358"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:41.392129" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:41.391943" elapsed="0.000212"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:41.392732" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:41.392348" elapsed="0.000431"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:41.393245" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:41.392960" elapsed="0.000311"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:41.393939" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:41.393478" elapsed="0.000540">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:41.333835" elapsed="0.060312">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:42.405882" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:42.405370" elapsed="0.000555"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:42.406000" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:51:42.406227" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:42.404870" elapsed="0.001393"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:42.414757" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:42.414477" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:42.415206" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:42.414963" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:42.422995" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:42.423135" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:42 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:42 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782302,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:42.423376" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:42.417487" elapsed="0.005955"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:42.415324" elapsed="0.008269"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:42.424085" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:42.423666" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:42.415304" elapsed="0.009052"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:42.431384" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782302,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:42.427394" elapsed="0.004061"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:42.426847" elapsed="0.004657"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:42.426803" elapsed="0.004736"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:42.436091" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:42.431998" elapsed="0.004162"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:42.431679" elapsed="0.004532"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:42.431655" elapsed="0.004590"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:42.437088" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:42.436490" elapsed="0.000641"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:42.437696" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:42.437323" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:42.438778" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:42.438121" elapsed="0.000696"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:42.437836" elapsed="0.001033"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:42.437295" elapsed="0.001605"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:42.439738" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:42.439129" elapsed="0.000648"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:42.440184" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:42.439877" elapsed="0.000390"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:42.440913" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:42.440461" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:42.440294" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:42.439852" elapsed="0.001147"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:42.441163" elapsed="0.000530"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:42.442297" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:42.441865" elapsed="0.000460"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:42.442483" elapsed="0.008660"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:42.425752" elapsed="0.025466"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:42.451456" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:51:42.451337" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:42.451312" elapsed="0.000267"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:42.451736" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:42.451808" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:42.454406" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782302,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:42.406763" elapsed="0.047674"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:42.454495" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:42.454677" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782302,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:42.404187" elapsed="0.050518"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:42.455825" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782302, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:42.455345" elapsed="0.000511"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:42.455907" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:42.456070" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782302, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:42.454954" elapsed="0.001144"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:42.456473" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:42.456284" elapsed="0.000216"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:42.457018" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:42.456697" elapsed="0.000348"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:42.457498" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:42.457222" elapsed="0.000303"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:42.458316" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:42.457890" elapsed="0.000499">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:42.395059" elapsed="0.063446">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:43.470411" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:43.469904" elapsed="0.000603"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:43.470605" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T00:51:43.470848" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:43.469348" elapsed="0.001536"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:43.480990" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:43.480508" elapsed="0.000545"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:43.481510" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:43.481239" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:43.489484" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:43.489571" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:43 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782303,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:43.489681" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:43.483816" elapsed="0.005908"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:43.481661" elapsed="0.008111"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:43.489987" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:43.489805" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:43.481635" elapsed="0.008443"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:43.494220" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782303,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:43.491432" elapsed="0.002846"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:43.491187" elapsed="0.003127"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:43.491167" elapsed="0.003172"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:43.497492" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:43.494664" elapsed="0.002959"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:43.494397" elapsed="0.003281"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:43.494380" elapsed="0.003333"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:43.498589" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:43.497983" elapsed="0.000648"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:43.499094" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:43.498738" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:43.500191" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:43.499459" elapsed="0.000773"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:43.499217" elapsed="0.001070"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:43.498710" elapsed="0.001608"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:43.501177" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:43.500629" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:43.501710" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:43.501323" elapsed="0.000474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:43.502706" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:43.502076" elapsed="0.000748"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:43.501836" elapsed="0.001046"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:43.501297" elapsed="0.001618"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:43.503154" elapsed="0.000775"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:43.504891" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:43.504177" elapsed="0.000754"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:43.505174" elapsed="0.009863"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:43.490697" elapsed="0.024428"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:43.515337" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:51:43.515217" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:43.515192" elapsed="0.000244"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:43.515729" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:43.515807" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:43.518183" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782303,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:43.471463" elapsed="0.046752"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:43.518271" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:43.518427" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782303,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:43.468515" elapsed="0.049940"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:43.519801" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782303, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:43.519111" elapsed="0.000722"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:43.519883" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:43.520046" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782303, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:43.518722" elapsed="0.001351"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:43.520484" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:43.520295" elapsed="0.000234"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:43.521047" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:43.520731" elapsed="0.000343"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:43.521510" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:43.521250" elapsed="0.000286"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:43.522122" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:43.521725" elapsed="0.000473">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:43.459334" elapsed="0.062977">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:44.534374" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:44.533855" elapsed="0.000563"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:44.534499" elapsed="0.000082"/>
</return>
<msg time="2026-04-10T00:51:44.534805" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:44.533298" elapsed="0.001546"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:44.543348" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:44.543086" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:44.544038" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:44.543779" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:44.558777" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:44.558838" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:44 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782304,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:44.558935" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:44.546258" elapsed="0.012703"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:44.544160" elapsed="0.014846"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:44.559218" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:44.559034" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:44.544140" elapsed="0.015352"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:44.568183" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782304,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:44.562265" elapsed="0.005970"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:44.561707" elapsed="0.006563"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:44.561664" elapsed="0.006630"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:44.571271" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:44.568592" elapsed="0.002728"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:44.568349" elapsed="0.003006"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:44.568332" elapsed="0.003047"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:44.571979" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:44.571585" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:44.572313" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:44.572076" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:44.572983" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:44.572572" elapsed="0.000437"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:44.572394" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:44.572058" elapsed="0.001008"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:44.573617" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:44.573225" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:44.573955" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:44.573719" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:44.574675" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:44.574214" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:44.574035" elapsed="0.000706"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:44.573701" elapsed="0.001062"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:44.574918" elapsed="0.000508"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:44.576096" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:44.575666" elapsed="0.000456"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:44.576277" elapsed="0.008401"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:44.560716" elapsed="0.024029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:44.584924" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:51:44.584816" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:44.584797" 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-04-10T00:51:44.585212" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:44.585283" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:44.587952" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782304,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:44.535383" elapsed="0.052598"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:44.588034" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:44.588189" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782304,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:44.532532" elapsed="0.055683"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:44.589219" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782304, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:44.588812" elapsed="0.000436"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:44.589296" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:44.589452" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782304, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:44.588445" elapsed="0.001034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:44.589889" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:44.589697" elapsed="0.000218"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:44.590397" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:44.590093" elapsed="0.000329"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:44.591031" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:44.590649" elapsed="0.000416"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:44.592093" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:44.591307" elapsed="0.000889">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:44.523256" elapsed="0.069092">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:45.606416" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:45.606035" elapsed="0.000413"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:45.606510" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T00:51:45.606698" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:45.605668" elapsed="0.001055"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:45.613692" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:45.613406" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:45.614144" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:45.613901" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:45.625940" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:45.626098" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782305,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:45.626330" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:45.616605" elapsed="0.009785"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:45.614262" elapsed="0.012236"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:45.627088" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:45.626698" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:45.614241" elapsed="0.013045"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:45.635480" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782305,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:45.630371" elapsed="0.005169"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:45.629771" elapsed="0.005838"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:45.629720" elapsed="0.005915"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:45.638793" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:45.635949" elapsed="0.002893"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:45.635694" elapsed="0.003184"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:45.635677" elapsed="0.003225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:45.639515" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:45.639103" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:45.639909" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:45.639639" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:45.640648" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:45.640157" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:45.639992" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:45.639620" elapsed="0.001113"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:45.642031" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:45.641051" elapsed="0.001022"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:45.642399" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:45.642152" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:45.643103" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:45.642664" elapsed="0.000467"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:45.642483" elapsed="0.000685"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:45.642132" elapsed="0.001058"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:45.643351" elapsed="0.000554"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:45.644518" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:45.644078" elapsed="0.000483"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:45.644724" elapsed="0.009096"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:45.628576" elapsed="0.025324"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:45.654104" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:51:45.653986" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:45.653961" 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-04-10T00:51:45.654373" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:45.654445" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:45.657185" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782305,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:45.607083" elapsed="0.050137"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:45.657276" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:45.657432" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782305,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:45.604995" elapsed="0.052463"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:45.658630" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782305, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:45.658172" elapsed="0.000486"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:45.658706" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:45.658862" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782305, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:45.657723" elapsed="0.001165"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:45.659252" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:45.659066" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:45.660265" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:45.659872" elapsed="0.000422"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:45.660763" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:45.660472" elapsed="0.000317"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:45.661412" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:45.661037" elapsed="0.000450">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:45.593353" elapsed="0.068270">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:46.675679" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:46.675158" elapsed="0.000565"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:46.675800" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:51:46.676026" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:46.674653" elapsed="0.001409"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:46.684725" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:46.684394" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:46.685184" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:46.684934" 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-04-10T00:51:46.692523" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:46.692603" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:46 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:46 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782306,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:46.692712" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:46.687497" elapsed="0.005243"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:46.685303" elapsed="0.007483"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:46.692978" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:46.692816" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:46.685282" elapsed="0.007784"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:46.696934" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782306,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:46.694339" elapsed="0.002646"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:46.694109" elapsed="0.002912"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:46.694090" elapsed="0.002955"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:46.699946" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:46.697326" elapsed="0.002669"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:46.697101" elapsed="0.002929"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:46.697084" elapsed="0.002971"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:46.700650" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:46.700237" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:46.701049" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:46.700808" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:46.701819" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:46.701300" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:46.701133" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:46.700789" elapsed="0.001118"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:46.702446" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:46.702071" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:46.702809" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:46.702570" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:46.703467" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:46.703054" elapsed="0.000441"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:46.702892" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:46.702527" elapsed="0.001051"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:46.703737" elapsed="0.000494"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:46.704859" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:46.704402" elapsed="0.000484"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:46.705046" elapsed="0.008843"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:46.693626" elapsed="0.020331"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:46.714140" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:51:46.714029" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:46.714010" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:46.714385" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:46.714458" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:46.717010" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782306,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:46.676562" elapsed="0.040481"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:46.717097" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:46.717251" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782306,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:46.673946" elapsed="0.043332"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:46.718304" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782306, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:46.717902" elapsed="0.000431"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:46.718382" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:46.718537" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782306, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:46.717509" elapsed="0.001070"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:46.718941" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:46.718761" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:46.719444" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:46.719140" elapsed="0.000331"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:46.720125" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:46.719853" elapsed="0.000298"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:46.720738" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:46.720324" elapsed="0.000488">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:46.662509" elapsed="0.058416">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:47.732452" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:47.731927" elapsed="0.000569"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:47.732604" elapsed="0.000060"/>
</return>
<msg time="2026-04-10T00:51:47.732856" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:47.731333" elapsed="0.001560"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:47.742851" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:47.742418" elapsed="0.000508"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:47.743533" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:47.743155" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:47.751033" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:47.751094" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:47 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:47 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782307,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:47.751196" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:47.746622" elapsed="0.004600"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:47.743737" elapsed="0.007530"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:47.751456" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:47.751297" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:47.743706" elapsed="0.007854"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:47.755518" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782307,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:47.752834" elapsed="0.002752"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:47.752582" elapsed="0.003040"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:47.752534" elapsed="0.003112"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:47.758559" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:47.755931" elapsed="0.002678"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:47.755703" elapsed="0.002942"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:47.755685" elapsed="0.002984"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:47.759252" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:47.758853" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:47.759621" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:47.759351" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:47.760435" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:47.759869" elapsed="0.000596"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:47.759704" elapsed="0.000800"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:47.759332" elapsed="0.001194"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:47.761172" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:47.760753" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:47.761515" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:47.761274" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:47.762202" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:47.761783" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:47.761620" elapsed="0.000710"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:47.761256" elapsed="0.001097"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:47.762514" elapsed="0.000528"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:47.763678" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:47.763216" elapsed="0.000490"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:47.763871" elapsed="0.008440"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:47.752105" elapsed="0.020275"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:47.772707" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:51:47.772454" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:47.772435" elapsed="0.000375"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:47.772981" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:47.773054" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:47.775376" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782307,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:47.733455" elapsed="0.041951"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:47.775459" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:47.775630" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782307,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:47.730633" elapsed="0.045025"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:47.777058" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782307, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:47.776248" elapsed="0.000839"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:47.777137" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:47.777293" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782307, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:47.775892" elapsed="0.001427"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:47.777704" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:47.777501" elapsed="0.000228"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:47.778220" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:47.777913" elapsed="0.000334"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:47.778769" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:47.778429" elapsed="0.000367"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:47.779393" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:47.778975" elapsed="0.000497">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:47.721989" elapsed="0.057620">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:48.791799" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:48.791197" elapsed="0.000651"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:48.791932" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:51:48.792170" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:48.790669" elapsed="0.001537"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:48.801007" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:48.800708" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:48.801630" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:48.801311" 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-04-10T00:51:48.810232" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:48.810344" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:48 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:48 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782308,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:48.810490" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:48.803932" elapsed="0.006597"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:48.801781" elapsed="0.008841"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:48.810902" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:48.810664" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:48.801753" elapsed="0.009286"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:48.817023" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782308,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:48.812896" elapsed="0.004211"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:48.812531" elapsed="0.004629"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:48.812501" elapsed="0.004695"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:48.821504" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:48.817693" elapsed="0.003905"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:48.817280" elapsed="0.004369"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:48.817254" elapsed="0.004431"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:48.822605" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:48.821944" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:48.823088" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:48.822750" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:48.824321" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:48.823672" elapsed="0.000694"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:48.823236" elapsed="0.001185"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:48.822724" elapsed="0.001728"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:48.825261" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:48.824714" elapsed="0.000730"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:48.825980" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:48.825608" elapsed="0.000456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:48.826819" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:48.826369" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:48.826099" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:48.825574" elapsed="0.001335"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:48.827070" elapsed="0.000580"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:48.828271" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:48.827825" elapsed="0.000486"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:48.828502" elapsed="0.009146"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:48.811879" elapsed="0.025840"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:48.837909" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:51:48.837794" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:48.837775" elapsed="0.000291"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:48.838222" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:48.838297" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:48.840950" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782308,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:48.792738" elapsed="0.048242"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:48.841045" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:51:48.841224" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782308,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:48.789945" elapsed="0.051306"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:48.842350" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782308, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:48.841941" elapsed="0.000439"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:48.842429" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:48.842646" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782308, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:48.841566" elapsed="0.001110"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:48.843045" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:48.842860" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:48.843602" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:48.843250" elapsed="0.000387"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:48.844088" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:48.843818" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:48.844812" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:48.844287" elapsed="0.000605">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:48.780531" elapsed="0.064479">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:49.860715" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:49.859825" elapsed="0.000965"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:49.860920" elapsed="0.000098"/>
</return>
<msg time="2026-04-10T00:51:49.861343" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:49.858843" elapsed="0.002577"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:49.872654" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:49.872251" elapsed="0.000475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:49.873372" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:49.872954" 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-04-10T00:51:49.882650" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:49.882784" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:49 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:49 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782309,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:49.882933" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:49.876757" elapsed="0.006214"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:49.873721" elapsed="0.009313"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:49.883384" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:49.883156" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:49.873688" elapsed="0.009822"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:49.888993" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782309,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:49.885237" elapsed="0.003827"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:49.884921" elapsed="0.004193"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:49.884894" elapsed="0.004254"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:49.893242" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:49.889542" elapsed="0.003767"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:49.889229" elapsed="0.004135"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:49.889204" elapsed="0.004207"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:49.894309" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:49.893731" elapsed="0.000621"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:49.894894" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:49.894456" elapsed="0.000527"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:49.895881" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:49.895249" elapsed="0.000671"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:49.895017" elapsed="0.000959"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:49.894430" elapsed="0.001589"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:49.896813" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:49.896257" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:49.897297" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:49.896952" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:49.898308" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:49.897698" elapsed="0.000648"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:49.897422" elapsed="0.000975"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:49.896926" elapsed="0.001501"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:49.898779" elapsed="0.000742"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:49.900392" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:49.899788" elapsed="0.000641"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:49.900991" elapsed="0.014789"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:49.884281" elapsed="0.031573"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:49.916053" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:51:49.915934" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:49.915912" 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-04-10T00:51:49.916311" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:49.916390" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:49.918923" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782309,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:49.862365" elapsed="0.056589"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:49.919009" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:49.919199" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782309,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:49.857338" elapsed="0.061889"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:49.920455" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782309, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:49.919983" elapsed="0.000502"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:49.920536" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:51:49.920758" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782309, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:49.919498" elapsed="0.001290"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:49.921191" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:49.920997" elapsed="0.000220"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:49.921832" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:49.921397" elapsed="0.000463"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:49.922319" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:49.922043" elapsed="0.000302"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:49.922954" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:49.922583" elapsed="0.000450">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:49.845938" elapsed="0.077240">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:50.937378" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:50.936722" elapsed="0.000698"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:50.937493" elapsed="0.000069"/>
</return>
<msg time="2026-04-10T00:51:50.937711" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:50.936036" elapsed="0.001707"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:50.944852" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:50.944518" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:50.945339" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:50.945090" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:50.952763" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:50.952844" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:50 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:50 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782310,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:50.952999" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:50.947599" elapsed="0.005429"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:50.945472" elapsed="0.007614"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:50.953334" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:50.953125" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:50.945444" elapsed="0.007978"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:50.957481" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782310,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:50.954787" elapsed="0.002773"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:50.954521" elapsed="0.003080"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:50.954499" elapsed="0.003128"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:50.960702" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:50.957925" elapsed="0.002830"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:50.957689" elapsed="0.003104"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:50.957670" elapsed="0.003194"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:50.961628" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:50.961077" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:50.962238" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:50.961872" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:50.963243" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:50.962630" elapsed="0.000654"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:50.962362" elapsed="0.000975"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:50.961843" elapsed="0.001528"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:50.964186" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:50.963633" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:50.964700" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:50.964330" elapsed="0.000457"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:50.965732" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:50.965079" elapsed="0.000694"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:50.964840" elapsed="0.000987"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:50.964304" elapsed="0.001554"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:50.966097" elapsed="0.000746"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:50.967752" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:50.967091" elapsed="0.000701"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:50.968022" elapsed="0.010694"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:50.954026" elapsed="0.024806"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:50.979079" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-10T00:51:50.978946" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:50.978910" 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-04-10T00:51:50.979403" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:50.979479" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:51:50.982267" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782310,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:50.938189" elapsed="0.044112"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:50.982362" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:51:50.982531" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782310,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:50.934957" elapsed="0.047619"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:50.983825" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782310, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:50.983307" elapsed="0.000547"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:50.983902" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:50.984058" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782310, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:50.982871" elapsed="0.001213"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:50.984454" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:50.984264" elapsed="0.000214"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:50.985388" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:50.985072" elapsed="0.000343"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:50.985868" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:50.985603" elapsed="0.000291"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:50.986514" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:50.986066" elapsed="0.000539">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:50.924118" elapsed="0.062603">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:52.001233" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:52.000857" elapsed="0.000409"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:52.001326" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:51:52.001497" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:52.000165" elapsed="0.001357"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:52.008480" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:52.008178" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:52.008953" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:52.008707" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:52.015906" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:52.015967" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:52 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:52 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782312,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:52.016068" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:52.011255" elapsed="0.004839"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:52.009072" elapsed="0.007068"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:52.016332" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:52.016169" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:52.009051" elapsed="0.007369"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:52.020372" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782312,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:52.017672" elapsed="0.002758"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:52.017423" elapsed="0.003061"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:52.017403" elapsed="0.003115"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:52.024473" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:52.020938" elapsed="0.003600"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:52.020629" elapsed="0.004010"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:52.020604" elapsed="0.004069"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:52.025455" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:52.024918" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:52.025946" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:52.025615" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:52.026885" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:52.026281" elapsed="0.000641"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:52.026058" elapsed="0.000915"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:52.025588" elapsed="0.001414"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:52.027775" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:52.027224" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:52.028232" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:52.027909" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:52.029184" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:52.028616" elapsed="0.000675"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:52.028345" elapsed="0.001001"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:52.027885" elapsed="0.001491"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:52.029614" elapsed="0.000686"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:52.031153" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:52.030533" elapsed="0.000657"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:52.031407" elapsed="0.008802"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:52.016979" elapsed="0.023295"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:52.040463" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:51:52.040346" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:52.040328" 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-04-10T00:51:52.040754" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:52.040825" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:52.043287" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782312,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:52.001890" elapsed="0.041426"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:52.043368" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:52.043520" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782312,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:51.998849" elapsed="0.044711"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:52.044757" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782312, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:52.044163" elapsed="0.000624"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:52.044835" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:52.044990" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782312, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:52.043822" elapsed="0.001194"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:52.045374" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:52.045193" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:52.045893" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:52.045591" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:52.046351" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:52.046091" elapsed="0.000286"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:52.046917" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:52.046567" elapsed="0.000420">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:51.987684" elapsed="0.059412">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:53.059041" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:53.058497" elapsed="0.000588"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:53.059163" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:51:53.059434" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:53.057969" elapsed="0.001500"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:53.067715" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:53.067393" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:53.068264" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:53.068015" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:53.076647" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:53.076735" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:53 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:53 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782313,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:53.076875" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:53.070480" elapsed="0.006433"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:53.068393" elapsed="0.008583"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:53.077251" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:53.077020" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:53.068369" elapsed="0.009009"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:53.083094" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782313,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:53.079194" elapsed="0.003985"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:53.078849" elapsed="0.004447"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:53.078820" elapsed="0.004515"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:53.088099" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:53.083779" elapsed="0.004393"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:53.083420" elapsed="0.004806"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:53.083395" elapsed="0.004868"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:53.089142" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:53.088538" elapsed="0.000645"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:53.089699" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:53.089290" elapsed="0.000497"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:53.090922" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:53.090088" elapsed="0.000890"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:53.089822" elapsed="0.001224"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:53.089262" elapsed="0.001828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:53.092054" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:53.091459" elapsed="0.000635"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:53.092591" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:53.092198" elapsed="0.000511"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:53.093891" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:53.093016" elapsed="0.000931"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:53.092757" elapsed="0.001261"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:53.092171" elapsed="0.001889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:53.094382" elapsed="0.001087"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:53.096351" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:53.095739" elapsed="0.000651"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:53.096664" elapsed="0.009075"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:53.078180" elapsed="0.027652"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:53.106061" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-10T00:51:53.105933" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:53.105904" elapsed="0.000335"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:53.106429" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:53.106505" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:51:53.109254" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782313,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:53.059976" elapsed="0.049309"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:53.109354" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:51:53.109525" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782313,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:53.057068" elapsed="0.052500"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:53.110962" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782313, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:53.110271" elapsed="0.000720"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:53.111040" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:53.111246" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782313, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:53.109834" elapsed="0.001441"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:53.111670" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:53.111458" elapsed="0.000239"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:53.112200" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:53.111874" elapsed="0.000353"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:53.112687" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:53.112400" elapsed="0.000312"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:53.113241" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:53.112883" elapsed="0.000432">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:53.048442" elapsed="0.064990">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.125803" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:54.125275" elapsed="0.000571"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:54.125927" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T00:51:54.126163" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:54.124749" elapsed="0.001451"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.135160" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:54.134858" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.135684" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:54.135405" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:54.143104" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:54.143178" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:54 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:54 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782314,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:54.143320" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:54.137914" elapsed="0.005436"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:54.135808" elapsed="0.007599"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.144203" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.144007" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.135786" elapsed="0.008510"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.148349" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782314,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:54.145661" elapsed="0.002742"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:54.145364" elapsed="0.003075"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.145343" elapsed="0.003121"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.151504" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:54.148774" elapsed="0.002826"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:54.148527" elapsed="0.003124"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.148509" elapsed="0.003177"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.152540" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:54.151936" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.153115" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.152735" elapsed="0.000463"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.154200" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:54.153499" elapsed="0.000741"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:54.153233" elapsed="0.001059"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.152699" elapsed="0.001625"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.155157" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:54.154600" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.155734" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.155339" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.156745" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:54.156081" elapsed="0.000704"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:54.155853" elapsed="0.000983"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.155312" elapsed="0.001555"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:54.157084" elapsed="0.000805"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:54.158816" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:54.158140" elapsed="0.000714"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:54.159079" elapsed="0.010042"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:54.144893" elapsed="0.024300"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:54.169410" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:51:54.169273" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.169251" elapsed="0.000260"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.169846" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.169925" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:51:54.172385" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782314,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:54.126715" elapsed="0.045720"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:54.172496" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:54.172720" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782314,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:54.123999" elapsed="0.048750"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.174155" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782314, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:54.173478" elapsed="0.000708"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:54.174238" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:54.174440" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782314, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:54.172997" elapsed="0.001472"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:54.174904" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:54.174703" elapsed="0.000228"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.175472" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:54.175113" elapsed="0.000387"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.175975" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:54.175695" elapsed="0.000308"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:51:54.176202" elapsed="0.000390"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:51:54.114452" elapsed="0.062209"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:51:23.268933" elapsed="30.907799"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:23.268468" elapsed="30.908346"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:23.263495" elapsed="30.913355"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:23.263352" elapsed="30.913535"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.190228" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:54.189890" elapsed="0.000368"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:54.190311" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:51:54.190471" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:54.189518" elapsed="0.000977"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.197581" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:54.197279" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.198063" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:54.197810" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:54.205433" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:54.205494" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:54 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:54 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782314,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:54.205624" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:54.200386" elapsed="0.005266"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:54.198205" elapsed="0.007492"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.205883" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.205727" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.198180" elapsed="0.007791"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.264468" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782314,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:54.207131" elapsed="0.057426"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:54.206814" elapsed="0.057795"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.206796" elapsed="0.057846"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.267676" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:54.265105" elapsed="0.002621"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:54.264725" elapsed="0.003038"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.264701" elapsed="0.003086"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.268391" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:54.267982" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.268762" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.268493" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.269324" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:54.269014" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:54.268846" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.268473" elapsed="0.000936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.269962" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:54.269590" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.270300" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.270062" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.270925" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:54.270578" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:54.270383" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.270044" elapsed="0.000967"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:54.271169" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:54.272034" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:54.271736" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:54.272216" elapsed="0.002395"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:54.206362" elapsed="0.068319"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:54.274879" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:51:54.274754" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.274736" elapsed="0.000236"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.275122" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.275193" elapsed="0.000014"/>
</return>
<msg time="2026-04-10T00:51:54.277533" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782314,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:54.190885" elapsed="0.086699"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:54.277643" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:51:54.277810" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782314,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:54.189048" elapsed="0.088789"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:51:54.277886" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:51:54.278033" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782314,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 1. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:51:54.184582" elapsed="0.093476"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.279131" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782314, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:54.278675" elapsed="0.000485"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:54.279209" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:54.279367" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782314, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:54.278298" elapsed="0.001147"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:54.279835" level="INFO">${value} = 10000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:54.279647" elapsed="0.000215"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.280341" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:51:54.280044" elapsed="0.000356"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 10000.</doc>
<status status="PASS" start="2026-04-10T00:51:54.184048" elapsed="0.096414"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:54.177102" elapsed="0.103404"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:54.176952" elapsed="0.103605"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${Inventory_Leader_List_Post}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:51:23.204280" elapsed="31.076352"/>
</kw>
<arg>${operation_timeout}</arg>
<arg>2s</arg>
<arg>BulkomaticKeywords.Get Bulk Flow And Verify Count In Cluster</arg>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${Inventory_Leader_List_Post}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:51:23.194990" elapsed="31.085712"/>
</kw>
<doc>10000 Flows preserved in all controller instances.</doc>
<status status="PASS" start="2026-04-10T00:51:22.718394" elapsed="31.562459"/>
</test>
<test id="s1-s2-t13" name="Verify Flows In Switch After Leader Restart" line="130">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:51:54.284513" elapsed="0.000242"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:51:54.284143" elapsed="0.000670"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.285852" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:54.285735" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.285714" elapsed="0.000209"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.291383" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:54.291273" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.291253" elapsed="0.000202"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.292491" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:54.292091" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.293053" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:54.292700" elapsed="0.000382"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:54.293129" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:51:54.293296" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:54.291708" elapsed="0.001613"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.299097" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:54.298978" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.298956" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.300422" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:54.300313" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.300295" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:54.300994" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:54.300675" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.301426" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:54.301190" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.337367" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:54.301979" elapsed="0.035656"/>
</kw>
<msg time="2026-04-10T00:51:54.337864" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:54.337917" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.301633" elapsed="0.036321"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.417824" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:54.338848" elapsed="0.079300"/>
</kw>
<msg time="2026-04-10T00:51:54.418431" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:54.418482" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.338343" elapsed="0.080176"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.419051" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.418683" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.418635" elapsed="0.000509"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.419733" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:54.419294" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.420123" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.419901" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.419883" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:54.420241" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:54.423223" elapsed="0.000411"/>
</kw>
<msg time="2026-04-10T00:51:54.423705" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:54.421981" elapsed="0.001867"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.424133" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.424472" elapsed="0.000097"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:54.421266" elapsed="0.003421"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:54.420654" elapsed="0.004100"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:54.300008" elapsed="0.124846"/>
</kw>
<msg time="2026-04-10T00:51:54.424949" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:54.425002" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.299341" elapsed="0.125718"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:54.425256" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:51:54.425144" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.425125" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.425771" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.426113" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.426185" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:54.298477" elapsed="0.127847"/>
</kw>
<msg time="2026-04-10T00:51:54.426424" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:54.426470" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.293726" elapsed="0.132789"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.426960" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.426697" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.426677" elapsed="0.000372"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:54.293572" elapsed="0.133507"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.432821" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:54.432709" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.432690" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.434093" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:54.433984" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.433967" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:54.434721" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:54.434381" elapsed="0.000369"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.435135" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:54.434914" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.490634" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:54.435678" elapsed="0.055116"/>
</kw>
<msg time="2026-04-10T00:51:54.490985" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:54.491032" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.435322" elapsed="0.055746"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.609710" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:54.491696" elapsed="0.118307"/>
</kw>
<msg time="2026-04-10T00:51:54.610245" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:54.610294" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.491279" elapsed="0.119053"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.610880" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.610463" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.610423" elapsed="0.000548"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.611528" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:54.611119" elapsed="0.000525"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.611933" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.611713" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.611695" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:54.612049" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:54.614961" elapsed="0.000415"/>
</kw>
<msg time="2026-04-10T00:51:54.615441" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:54.613700" elapsed="0.001903"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.615888" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.616404" elapsed="0.000080"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:54.612989" elapsed="0.003631"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:54.612382" elapsed="0.004363"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:54.433679" elapsed="0.183181"/>
</kw>
<msg time="2026-04-10T00:51:54.616956" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:54.617000" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.433047" elapsed="0.183990"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:54.617224" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:54.617115" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.617096" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.617749" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.618086" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.618158" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:54.432279" elapsed="0.185986"/>
</kw>
<msg time="2026-04-10T00:51:54.618359" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:54.618402" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.427366" elapsed="0.191072"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.618804" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.618512" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.618495" elapsed="0.000386"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:51:54.427218" elapsed="0.191686"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.624580" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:54.624452" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.624434" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.625810" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:54.625704" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.625687" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:54.626324" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:54.626022" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.626759" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:54.626509" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.665644" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:54.627292" elapsed="0.038558"/>
</kw>
<msg time="2026-04-10T00:51:54.666067" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:54.666117" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.626947" elapsed="0.039207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.747451" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:54.666847" elapsed="0.080865"/>
</kw>
<msg time="2026-04-10T00:51:54.747937" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:54.747985" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.666390" elapsed="0.081633"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.748571" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.748223" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.748187" elapsed="0.000475"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.749215" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:54.748814" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.749621" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.749377" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.749359" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:54.749739" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:54.752501" elapsed="0.000180"/>
</kw>
<msg time="2026-04-10T00:51:54.752747" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:54.751292" elapsed="0.001593"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.753182" elapsed="0.000522"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.753983" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:54.750648" elapsed="0.003525"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:54.750057" elapsed="0.004180"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:54.625357" elapsed="0.128978"/>
</kw>
<msg time="2026-04-10T00:51:54.754431" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:54.754474" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.624802" elapsed="0.129710"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:54.754719" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:51:54.754609" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.754590" 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-04-10T00:51:54.755208" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.755554" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.755627" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:54.624104" elapsed="0.131631"/>
</kw>
<msg time="2026-04-10T00:51:54.755831" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:54.755875" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.619177" elapsed="0.136734"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.756236" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.755986" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.755969" elapsed="0.000343"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:51:54.619034" elapsed="0.137301"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:54.293379" elapsed="0.462989"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:51:54.290897" elapsed="0.465531"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:51:54.285417" elapsed="0.471069"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.284973" elapsed="0.471558"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:51:54.281923" elapsed="0.474727"/>
</kw>
<kw name="Verify Aggregate Flow From Mininet Session" owner="MininetKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:54.758592" elapsed="0.000148"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:54.758349" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.758332" elapsed="0.000468"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.759226" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:54.758966" elapsed="0.000286"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:54.760110" elapsed="0.000142"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:54.759893" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.759876" elapsed="0.000435"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.763873" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:54.760451" elapsed="0.003479"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.792298" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<msg time="2026-04-10T00:51:54.792396" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:51:54.764090" elapsed="0.028334"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:51:54.792473" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:51:54.792645" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 143 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:51:54.759593" elapsed="0.033081"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:51:54.793113" level="INFO">${flows} = ['10000']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:51:54.792841" elapsed="0.000298"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.793695" level="INFO">${total_flows} = 10000</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:54.793301" elapsed="0.000421"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.794190" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-04-10T00:51:54.793908" elapsed="0.000340"/>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="PASS" start="2026-04-10T00:51:54.758045" elapsed="0.036260"/>
</kw>
<arg>${time_out}</arg>
<arg>2s</arg>
<arg>MininetKeywords.Check Flows In Mininet</arg>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:51:54.757400" elapsed="0.036952"/>
</kw>
<arg>${mininet_conn_id}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${operation_timeout}</arg>
<doc>Verify flow count per switch</doc>
<status status="PASS" start="2026-04-10T00:51:54.756864" elapsed="0.037549"/>
</kw>
<doc>Verify flows are installed in switch after cluster restart.</doc>
<status status="PASS" start="2026-04-10T00:51:54.281248" elapsed="0.513279"/>
</test>
<test id="s1-s2-t14" name="Stop Mininet Connected To Follower Node1" line="137">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:51:54.798750" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:51:54.798451" 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-04-10T00:51:54.800122" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:54.799998" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.799976" elapsed="0.000217"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.805312" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:54.805205" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.805187" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.806471" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:54.806078" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.807053" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:54.806691" elapsed="0.000395"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:54.807136" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:51:54.807302" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:54.805624" elapsed="0.001776"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.812929" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:54.812823" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.812805" elapsed="0.000227"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.814310" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:54.814202" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.814184" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:54.814865" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:54.814527" elapsed="0.000366"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.815300" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:54.815066" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.852172" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:54.815867" elapsed="0.036595"/>
</kw>
<msg time="2026-04-10T00:51:54.852920" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:54.852997" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.815489" elapsed="0.037570"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.926276" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:54.854273" elapsed="0.072261"/>
</kw>
<msg time="2026-04-10T00:51:54.926796" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:54.926845" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.853478" elapsed="0.073407"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.927341" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.927006" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.926968" elapsed="0.000463"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:54.927994" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:54.927603" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.928380" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.928157" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.928139" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:54.928496" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:54.931319" elapsed="0.000159"/>
</kw>
<msg time="2026-04-10T00:51:54.931557" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:54.930114" elapsed="0.001582"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.931974" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.932466" elapsed="0.000111"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:54.929450" elapsed="0.003245"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:54.928875" elapsed="0.003886"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:54.813789" elapsed="0.119143"/>
</kw>
<msg time="2026-04-10T00:51:54.933029" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:54.933074" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.813183" elapsed="0.119928"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:54.933297" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:54.933189" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.933171" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.933801" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.934136" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.934208" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:54.812471" elapsed="0.121845"/>
</kw>
<msg time="2026-04-10T00:51:54.934411" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:54.934454" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.807816" elapsed="0.126674"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:54.934833" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:54.934582" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.934564" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:54.807667" elapsed="0.127265"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.940490" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:54.940384" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.940366" elapsed="0.000245"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:54.941761" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:54.941654" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:54.941637" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:54.942273" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:54.941974" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.942698" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:54.942459" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:54.986656" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:54.943221" elapsed="0.043558"/>
</kw>
<msg time="2026-04-10T00:51:54.986969" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:54.987019" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.942885" elapsed="0.044183"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:55.075022" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:54.987686" elapsed="0.087701"/>
</kw>
<msg time="2026-04-10T00:51:55.075758" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:55.075836" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.987288" elapsed="0.088607"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:55.076692" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:55.076204" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:55.076115" elapsed="0.000718"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:55.077627" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:55.077056" elapsed="0.000724"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:55.078215" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:55.077885" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:55.077858" elapsed="0.000475"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:55.078387" elapsed="0.000057"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:55.082890" elapsed="0.000179"/>
</kw>
<msg time="2026-04-10T00:51:55.083141" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:55.081501" elapsed="0.001783"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:55.083829" elapsed="0.000092"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:55.084224" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:55.079789" elapsed="0.004632"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:55.078887" elapsed="0.005602"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:54.941336" elapsed="0.143278"/>
</kw>
<msg time="2026-04-10T00:51:55.084713" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:55.084759" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.940765" elapsed="0.144031"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:55.085006" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:51:55.084890" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:55.084867" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:55.085525" elapsed="0.000044"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:55.085900" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:55.085975" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:54.940044" elapsed="0.146041"/>
</kw>
<msg time="2026-04-10T00:51:55.086185" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:55.086230" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.935204" elapsed="0.151063"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:55.086614" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:55.086345" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:55.086328" elapsed="0.000364"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:51:54.935062" elapsed="0.151655"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:55.092474" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:55.092364" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:55.092345" elapsed="0.000284"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:55.093821" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:55.093712" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:55.093694" elapsed="0.000283"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:55.094458" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:55.094142" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:55.094895" level="INFO">${current_connection_index} = 143</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:55.094665" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:55.129749" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:55.095449" elapsed="0.034429"/>
</kw>
<msg time="2026-04-10T00:51:55.130050" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:55.130096" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:55.095101" elapsed="0.035032"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:55.207777" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:55.130702" elapsed="0.077243"/>
</kw>
<msg time="2026-04-10T00:51:55.208130" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:55.208177" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:55.130316" elapsed="0.077898"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:55.208610" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:55.208315" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:55.208286" elapsed="0.000409"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:55.209173" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:55.208840" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:55.209569" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:55.209331" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:55.209314" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:55.209683" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:55.212454" elapsed="0.000173"/>
</kw>
<msg time="2026-04-10T00:51:55.212690" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:55.211219" elapsed="0.001607"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:55.213104" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:55.213439" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:55.210566" elapsed="0.003264"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:55.209990" elapsed="0.003907"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:55.093376" elapsed="0.120619"/>
</kw>
<msg time="2026-04-10T00:51:55.214088" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:55.214132" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:55.092789" elapsed="0.121379"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:55.214351" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:51:55.214244" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:55.214226" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:55.214861" elapsed="0.000078"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:55.215265" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:55.215338" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:55.091942" elapsed="0.123507"/>
</kw>
<msg time="2026-04-10T00:51:55.215560" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:55.215607" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:55.087014" elapsed="0.128630"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:55.215994" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:55.215738" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:55.215720" elapsed="0.000351"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:51:55.086854" elapsed="0.129241"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:54.807465" elapsed="0.408665"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:51:54.804833" elapsed="0.411357"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:51:54.799679" elapsed="0.416572"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:54.799194" elapsed="0.417105"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:51:54.795528" elapsed="0.420829"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:55.221304" elapsed="0.000147"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:55.221084" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:55.221066" elapsed="0.000446"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:55.223187" level="INFO">exit</msg>
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:55.221759" elapsed="0.001490"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:51:55.314342" level="INFO">*** Stopping 1 controllers
c0 
*** Stopping 1 links
.
*** Stopping 1 switches
s1 
*** Stopping 1 hosts
h1 
*** Done
completed in 91.463 seconds
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:51:55.223408" elapsed="0.091096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:51:55.314819" elapsed="0.000226"/>
</kw>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="PASS" start="2026-04-10T00:51:55.220811" elapsed="0.094307"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:55.318084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:55.317738" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:55.317710" elapsed="0.000461"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:55.318490" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:51:55.318329" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:55.319211" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:55.318818" elapsed="0.000441"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:55.320185" level="INFO">${conn_id} = 154</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:51:55.319452" elapsed="0.000760"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:51:55.321156" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:51:55.321233" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:51:55.320866" elapsed="0.000391"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:55.321517" elapsed="0.000377"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:51:55.322777" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:51:55.933654" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:51:55 UTC 2026

  System load:  0.01               Processes:             187
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:50:23 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:51:55.322440" elapsed="0.611476"/>
</kw>
<msg time="2026-04-10T00:51:55.934077" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:55.322073" elapsed="0.612170"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:51:55.320437" elapsed="0.614036"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:51:55.935730" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:51:57.144180" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:51:57.144632" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:51:57.144720" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:51:55.935106" elapsed="1.209667"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:51:57.145321" elapsed="0.000607"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:57.147025" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:57.146359" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:51:57.147629" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:57.147303" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.147250" elapsed="0.000555"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:51:57.148122" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-10T00:51:57.147923" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.147891" elapsed="0.000376"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:51:57.148321" elapsed="0.000023"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:57.154485" elapsed="0.000663"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:51:57.155488" elapsed="0.000278"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:51:57.155934" elapsed="0.000132"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:57.148970" elapsed="0.007169"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:51:55.317129" elapsed="1.839131"/>
</kw>
<msg time="2026-04-10T00:51:57.156342" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:55.316406" elapsed="1.840016"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:51:55.315886" elapsed="1.840640"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.159656" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:57.159188" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.159152" elapsed="0.000621"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:57.160248" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:51:57.160003" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:57.161242" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:57.160690" elapsed="0.000625"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:57.162061" level="INFO">${conn_id} = 156</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:51:57.161574" elapsed="0.000518"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:51:57.163312" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:51:57.163401" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:51:57.162933" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:57.163646" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:51:57.165036" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:51:57.544355" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:51:55 UTC 2026

  System load:  0.01               Processes:             187
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:51:55 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:51:57.164686" elapsed="0.379855"/>
</kw>
<msg time="2026-04-10T00:51:57.544664" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:57.164261" elapsed="0.380504"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:51:57.162407" elapsed="0.382507"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:51:57.545640" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:51:57.579480" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:51:57.579941" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:51:57.580066" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:51:57.545244" elapsed="0.034901"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:51:57.580724" elapsed="0.000763"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:57.583087" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:57.582206" elapsed="0.000981"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:51:57.583785" elapsed="0.000059"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:57.583391" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.583333" elapsed="0.000672"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:51:57.584408" elapsed="0.000070"/>
</return>
<status status="PASS" start="2026-04-10T00:51:57.584148" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.584111" elapsed="0.000552"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:51:57.584759" elapsed="0.000035"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:57.590807" elapsed="0.000533"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:51:57.591616" elapsed="0.000266"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:51:57.592217" elapsed="0.000149"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:57.585597" elapsed="0.006845"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:51:57.158422" elapsed="0.434179"/>
</kw>
<msg time="2026-04-10T00:51:57.592699" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:57.157588" elapsed="0.435194"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:51:57.156924" elapsed="0.435982"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:55.315378" elapsed="2.277616"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="PASS" start="2026-04-10T00:51:54.794951" elapsed="2.798201"/>
</test>
<test id="s1-s2-t15" name="Delete All Flows From Follower Node1" line="142">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:51:57.598769" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:51:57.598462" elapsed="0.000583"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:57.600134" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:57.600019" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.599999" elapsed="0.000206"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:57.605485" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:57.605373" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.605354" elapsed="0.000228"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:57.606781" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:57.606342" elapsed="0.000468"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:57.607312" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:57.606978" elapsed="0.000363"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:57.607388" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:51:57.607567" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:57.605880" elapsed="0.001715"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:57.616027" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:57.615915" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.615896" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:57.617398" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:57.617290" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.617271" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:57.617978" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:57.617652" elapsed="0.000353"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:57.618409" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:57.618168" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:57.650705" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:57.619013" elapsed="0.031868"/>
</kw>
<msg time="2026-04-10T00:51:57.651086" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:57.651139" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:57.618624" elapsed="0.032553"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:57.716521" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:57.651849" elapsed="0.065151"/>
</kw>
<msg time="2026-04-10T00:51:57.717259" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:57.717311" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:57.651398" elapsed="0.065953"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.717857" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:57.717476" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.717440" elapsed="0.000510"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:57.718510" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:57.718100" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.718922" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:57.718696" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.718678" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:57.719084" elapsed="0.000050"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:57.720760" elapsed="0.000867"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:51:57.721916" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:51:57.722706" elapsed="0.000368"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:57.720063" elapsed="0.003114"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:57.719436" elapsed="0.003806"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:57.616897" elapsed="0.106446"/>
</kw>
<msg time="2026-04-10T00:51:57.723440" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:57.723485" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:57.616255" elapsed="0.107268"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:57.723729" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:51:57.723620" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.723600" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.724239" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.724601" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:57.724674" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:57.615530" elapsed="0.109256"/>
</kw>
<msg time="2026-04-10T00:51:57.725055" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:57.725112" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:57.608008" elapsed="0.117146"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.725514" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:57.725248" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.725227" elapsed="0.000383"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:57.607856" elapsed="0.117779"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:57.731627" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:57.731500" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.731481" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:57.732969" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:57.732822" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.732804" elapsed="0.000235"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:57.733501" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:57.733188" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:57.733939" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:57.733714" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:57.770342" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:57.734469" elapsed="0.036049"/>
</kw>
<msg time="2026-04-10T00:51:57.770779" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:57.770827" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:57.734128" elapsed="0.036737"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:57.849367" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:57.771599" elapsed="0.078188"/>
</kw>
<msg time="2026-04-10T00:51:57.850123" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:57.850194" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:57.771131" elapsed="0.079117"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.850890" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:57.850414" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.850369" elapsed="0.000675"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:57.851828" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:57.851275" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.852398" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:57.852054" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.852028" elapsed="0.000484"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:57.852660" elapsed="0.000069"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:57.854572" elapsed="0.000801"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:51:57.855676" elapsed="0.000483"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:51:57.856427" elapsed="0.000412"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:57.853882" elapsed="0.003061"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:57.853132" elapsed="0.003875"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:57.732483" elapsed="0.124625"/>
</kw>
<msg time="2026-04-10T00:51:57.857208" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:57.857253" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:57.731905" elapsed="0.125386"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:57.857482" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:51:57.857372" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.857353" elapsed="0.000238"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.858083" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.858427" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:57.858500" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:57.731140" elapsed="0.127498"/>
</kw>
<msg time="2026-04-10T00:51:57.858738" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:57.858783" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:57.725930" elapsed="0.132891"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.859156" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:57.858899" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.858881" elapsed="0.000354"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:51:57.725782" 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-04-10T00:51:57.865152" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:57.865044" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.865026" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:57.866372" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:57.866265" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.866248" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:57.867015" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:57.866692" elapsed="0.000367"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:57.867461" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:57.867234" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:57.900041" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:57.868183" elapsed="0.032031"/>
</kw>
<msg time="2026-04-10T00:51:57.900411" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:57.900478" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:57.867703" elapsed="0.032815"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:57.976157" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:57.901162" elapsed="0.075311"/>
</kw>
<msg time="2026-04-10T00:51:57.976763" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:57.976815" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:57.900762" elapsed="0.076092"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.977348" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:57.976998" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.976959" elapsed="0.000488"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:57.978023" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:57.977621" elapsed="0.000498"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.978416" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:57.978190" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.978171" elapsed="0.000433"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:57.978644" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:57.980316" elapsed="0.000824"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:51:57.981426" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:51:57.982207" elapsed="0.000381"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:57.979617" elapsed="0.003079"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:57.978988" elapsed="0.003773"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:57.865965" elapsed="0.116898"/>
</kw>
<msg time="2026-04-10T00:51:57.982964" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:57.983010" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:57.865375" elapsed="0.117672"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:57.983238" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:51:57.983128" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.983109" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.983756" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.984102" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:57.984174" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:57.864685" elapsed="0.119621"/>
</kw>
<msg time="2026-04-10T00:51:57.984407" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:57.984451" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:57.859555" elapsed="0.124934"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:57.984841" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:57.984584" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:57.984566" elapsed="0.000351"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:51:57.859393" elapsed="0.125548"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:57.607667" elapsed="0.377312"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:51:57.604977" elapsed="0.380063"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:51:57.599708" elapsed="0.385389"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:57.599204" elapsed="0.385941"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:51:57.595347" elapsed="0.389854"/>
</kw>
<kw name="Delete Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Delete Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:57.996998" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:57.996603" elapsed="0.000429"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:57.997092" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:51:57.997262" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:57.996180" elapsed="0.001107"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.013350" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:58.012951" elapsed="0.000477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.014074" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:58.013771" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.014661" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:58.014333" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.015219" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:58.014915" elapsed="0.000359"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:58.016393" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:51:58.016118" elapsed="0.000310"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:51:58.016873" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:51:58.016652" elapsed="0.000253"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:51:58.017103" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.017896" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:58.017582" elapsed="0.000370"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:51:58.018009" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:51:58.018231" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:51:58.015592" elapsed="0.002669"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:58.034817" level="INFO">POST Request : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Content-Length': '404', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:51:58.034880" level="INFO">POST Response : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:58.034990" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:58.021747" elapsed="0.013270"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:58.018370" elapsed="0.016702"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:58.035290" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:58.035107" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:58.018343" elapsed="0.017038"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.039090" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:58.036601" elapsed="0.002536"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:58.036342" elapsed="0.002830"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:58.036322" elapsed="0.002875"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.042083" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:58.039480" elapsed="0.002652"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:58.039254" elapsed="0.002913"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:58.039237" elapsed="0.002954"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.042802" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:58.042378" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:58.043143" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:58.042902" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.043706" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:58.043388" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:58.043224" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:58.042883" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.044348" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:58.043950" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:58.044773" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:58.044515" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.045319" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:58.045019" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:58.044857" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:58.044496" elapsed="0.000908"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:58.045577" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:58.046401" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:58.046102" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:58.046600" elapsed="0.002431"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:58.035831" elapsed="0.013269"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:58.049287" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:58.049177" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:58.049158" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:58.051943" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:58.049506" elapsed="0.002464"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:58.052017" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:51:58.052218" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:58.009298" elapsed="0.042950"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:58.052328" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:51:58.052512" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:51:58.005677" elapsed="0.046884"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:58.052619" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:51:58.052772" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:57.995497" elapsed="0.057299"/>
</kw>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Delete Bulk Flow in member 3 according to ${json_body_del}.</doc>
<status status="PASS" start="2026-04-10T00:51:57.990845" elapsed="0.062016"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.060153" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:58.059819" elapsed="0.000368"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:58.060242" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:51:58.060400" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:58.059446" elapsed="0.000979"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.067196" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:58.066939" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.067663" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:58.067398" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:58.074458" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:58.074518" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:58 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:58 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782318,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:58.075225" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:58.070223" elapsed="0.005041"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:58.067774" elapsed="0.007552"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:58.075609" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:58.075366" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:58.067756" elapsed="0.007976"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.081463" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782318,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:58.077283" elapsed="0.004250"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:58.076970" elapsed="0.004650"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:58.076944" elapsed="0.004711"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.085205" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:58.082050" elapsed="0.003202"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:58.081735" elapsed="0.003552"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:58.081711" elapsed="0.003600"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.085897" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:58.085487" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:58.086234" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:58.085996" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.086798" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:58.086477" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:58.086315" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:58.085978" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.087404" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:58.087043" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:58.087757" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:58.087500" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.088371" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:58.087998" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:58.087838" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:58.087483" elapsed="0.000972"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:58.088628" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:58.089427" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:58.089140" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:58.089621" elapsed="0.002605"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:58.076322" elapsed="0.015983"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:58.092492" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:51:58.092384" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:58.092365" 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-04-10T00:51:58.092756" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:58.092827" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:51:58.095173" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782318,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:58.060784" elapsed="0.034507"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:58.095347" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:58.095504" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782318,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:58.058988" elapsed="0.036542"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.096664" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782318, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:58.096220" elapsed="0.000474"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:58.096743" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:58.096900" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782318, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:58.095775" elapsed="0.001152"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:58.097305" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:58.097120" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.098016" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:58.097507" elapsed="0.000544"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.098501" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:58.098229" elapsed="0.000298"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:58.099107" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:58.098716" elapsed="0.000468">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:58.054268" elapsed="0.045036">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.112724" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:59.112321" elapsed="0.000438"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:59.112819" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:51:59.112990" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:59.111954" elapsed="0.001062"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.120486" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.120213" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.120998" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.120739" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:59.128955" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:59.129021" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:59 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:59 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782319,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:59.129128" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:59.123291" elapsed="0.005870"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:59.121117" elapsed="0.008110"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.129437" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.129259" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.121096" elapsed="0.008470"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.133339" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782319,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.130832" elapsed="0.002560"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:59.130565" elapsed="0.002969"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.130527" elapsed="0.003051"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.136449" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.133904" elapsed="0.002594"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:59.133640" elapsed="0.002926"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.133621" elapsed="0.002977"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.137229" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:59.136821" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.137639" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.137350" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.138488" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:59.138095" elapsed="0.000440"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:59.137729" elapsed="0.000877"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.137326" elapsed="0.001303"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.139168" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:59.138796" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.139569" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.139276" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.140128" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:59.139828" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:59.139664" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.139257" elapsed="0.000955"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:59.140384" elapsed="0.000420"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:59.141271" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:59.140975" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:59.141523" elapsed="0.002591"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:59.130018" elapsed="0.014174"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:59.144378" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:51:59.144265" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.144247" 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-04-10T00:51:59.144687" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:59.144774" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:51:59.147373" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782319,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:59.113369" elapsed="0.034035"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:59.147457" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:59.147625" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782319,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:59.111444" elapsed="0.036208"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.148649" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782319, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:59.148226" elapsed="0.000451"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:59.148725" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:59.148879" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782319, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:59.147882" elapsed="0.001077"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:59.149328" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:59.149145" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.149904" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:59.149533" elapsed="0.000398"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.150387" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:59.150107" elapsed="0.000306"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:51:59.150604" elapsed="0.000327"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:51:59.100250" elapsed="0.050743"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:51:58.053677" elapsed="1.097367"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 3.</doc>
<status status="PASS" start="2026-04-10T00:51:58.053093" elapsed="1.098012"/>
</kw>
<arg>${temp_json_config_del}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Delete Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:51:57.990287" elapsed="1.160874"/>
</kw>
<doc>10000 Flows deleted via Follower Node1 and verify it gets applied in all instances.</doc>
<status status="PASS" start="2026-04-10T00:51:57.594027" elapsed="1.557257"/>
</test>
<test id="s1-s2-t16" name="Verify No Flows In Leader Node" line="149">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:51:59.154939" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:51:59.154670" elapsed="0.000529"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:59.156228" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:59.156117" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.156098" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:59.161409" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:59.161303" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.161285" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.162595" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:59.162192" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.163082" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:59.162781" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:59.163151" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:59.163307" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:59.161813" elapsed="0.001518"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:59.168809" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:59.168702" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.168684" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:59.170083" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:59.169977" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.169960" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:59.170615" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:59.170297" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:59.171023" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:59.170802" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:59.210260" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:59.171563" elapsed="0.038834"/>
</kw>
<msg time="2026-04-10T00:51:59.210606" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:59.210654" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:59.171209" elapsed="0.039482"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:59.276783" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:59.211570" elapsed="0.065561"/>
</kw>
<msg time="2026-04-10T00:51:59.277445" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:59.277583" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:59.211156" elapsed="0.066501"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.278352" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.277847" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.277794" elapsed="0.000685"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.279281" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.278714" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.279848" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.279510" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.279484" elapsed="0.000475"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:59.280011" elapsed="0.000057"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:59.282362" elapsed="0.001150"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:51:59.283960" elapsed="0.000704"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:51:59.285065" elapsed="0.000619"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:59.281343" elapsed="0.004512"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:59.280463" elapsed="0.005507"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:59.169660" elapsed="0.116458"/>
</kw>
<msg time="2026-04-10T00:51:59.286254" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:59.286315" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:59.169030" elapsed="0.117336"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:59.286657" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:51:59.286479" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.286452" elapsed="0.000292"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.287195" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.287589" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:59.287666" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:59.168350" elapsed="0.119433"/>
</kw>
<msg time="2026-04-10T00:51:59.287885" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:59.287931" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:59.163726" elapsed="0.124254"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.288344" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.288063" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.288046" elapsed="0.000459"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:59.163579" elapsed="0.124951"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:59.294636" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:59.294492" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.294472" 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-04-10T00:51:59.295953" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:59.295843" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.295825" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:59.296520" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:59.296191" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:59.296959" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:59.296735" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:59.334237" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:59.297608" elapsed="0.036999"/>
</kw>
<msg time="2026-04-10T00:51:59.335038" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:59.335130" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:59.297161" elapsed="0.038040"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:59.405817" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:59.336526" elapsed="0.069549"/>
</kw>
<msg time="2026-04-10T00:51:59.406309" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:59.406358" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:59.335676" elapsed="0.070721"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.406900" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.406522" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.406484" elapsed="0.000510"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.407584" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.407163" elapsed="0.000514"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.408125" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.407749" elapsed="0.000433"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.407730" elapsed="0.000476"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:59.408245" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:59.410265" elapsed="0.000836"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:51:59.411394" elapsed="0.000691"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:51:59.412370" elapsed="0.000378"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:59.409603" elapsed="0.003250"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:59.408607" elapsed="0.004310"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:59.295510" elapsed="0.117508"/>
</kw>
<msg time="2026-04-10T00:51:59.413113" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:59.413254" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:59.294874" elapsed="0.118424"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:59.413489" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:51:59.413378" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.413359" elapsed="0.000231"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.413997" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.414338" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:59.414412" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:59.294104" elapsed="0.120418"/>
</kw>
<msg time="2026-04-10T00:51:59.414637" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:59.414685" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:59.288842" elapsed="0.125880"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.415080" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.414800" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.414783" elapsed="0.000387"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:51:59.288694" elapsed="0.126500"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:59.420949" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:59.420808" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.420783" elapsed="0.000259"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:51:59.422296" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:59.422186" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.422168" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:59.422970" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:59.422563" elapsed="0.000447"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:51:59.423506" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:51:59.423238" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:51:59.454042" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:51:59.424113" elapsed="0.030043"/>
</kw>
<msg time="2026-04-10T00:51:59.454327" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:51:59.454375" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:59.423758" elapsed="0.030654"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:51:59.514513" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:51:59.454974" elapsed="0.059788"/>
</kw>
<msg time="2026-04-10T00:51:59.514997" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:51:59.515046" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:59.454614" elapsed="0.060470"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.515600" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.515221" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.515180" elapsed="0.000518"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.516339" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.515857" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.516746" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.516500" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.516480" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:51:59.516866" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:59.518594" elapsed="0.000803"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:51:59.519706" elapsed="0.000479"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:51:59.520456" elapsed="0.000715"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:51:59.517910" elapsed="0.003386"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:51:59.517279" elapsed="0.004097"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:51:59.421881" elapsed="0.099605"/>
</kw>
<msg time="2026-04-10T00:51:59.521599" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:59.521645" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:59.421263" elapsed="0.100419"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:51:59.521870" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:51:59.521762" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.521743" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.522365" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.522724" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:51:59.522798" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:51:59.420385" elapsed="0.102521"/>
</kw>
<msg time="2026-04-10T00:51:59.523003" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:51:59.523047" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:59.415474" elapsed="0.107610"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.523411" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.523160" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.523143" elapsed="0.000346"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:51:59.415327" elapsed="0.108185"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:59.163387" elapsed="0.360174"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:51:59.160942" elapsed="0.362683"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:51:59.155826" elapsed="0.367860"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:51:59.155355" elapsed="0.368380"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:51:59.152241" elapsed="0.371551"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.533776" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:51:59.533377" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.534308" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:51:59.534008" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:51:59.534379" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:59.534532" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:51:59.532958" elapsed="0.001615"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.545009" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:59.544672" elapsed="0.000366"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:59.545085" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:59.545234" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:59.544309" elapsed="0.000949"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.560686" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.560407" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.561207" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.560893" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.561680" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.561413" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.562120" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.561878" elapsed="0.000285"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:59.562987" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:51:59.562786" elapsed="0.000228"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:51:59.563338" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:51:59.563168" elapsed="0.000195"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:51:59.563512" elapsed="0.000220"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.564134" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.563889" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:51:59.564221" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:51:59.564378" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:51:59.562364" elapsed="0.002039"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:59.577973" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:51:59.578081" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:59.578302" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:59.566689" elapsed="0.011672"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:59.564478" elapsed="0.013987"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.578911" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.578523" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.564459" elapsed="0.014693"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.587331" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.581644" elapsed="0.005788"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:59.581063" elapsed="0.006448"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.581012" elapsed="0.006586"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.591504" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.588225" elapsed="0.003412"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:59.587726" elapsed="0.003953"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.587688" elapsed="0.004016"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.592282" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:59.591884" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.592638" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.592382" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.593252" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:59.592910" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:59.592720" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.592364" elapsed="0.000973"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.593883" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:59.593500" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.594215" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.593980" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.594772" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:59.594457" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:59.594296" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.593963" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:59.595007" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:59.595815" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:59.595514" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:59.595998" elapsed="0.002449"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:59.579991" elapsed="0.018519"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:51:59.598706" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:51:59.598600" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.598580" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:51:59.601419" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:51:59.598917" elapsed="0.002529"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:51:59.601496" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:51:59.601673" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:59.557682" elapsed="0.044016"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:59.601764" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:51:59.601913" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:51:59.555036" elapsed="0.046901"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:59.601987" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:51:59.602132" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:59.543862" elapsed="0.058293"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:51:59.539391" elapsed="0.062826"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:59.534769" elapsed="0.067481"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:59.534632" elapsed="0.067650"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.614151" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:59.613712" elapsed="0.000466"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:51:59.614224" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:59.614371" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:51:59.613340" elapsed="0.001055"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.621482" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.621204" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.621955" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.621708" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:51:59.628272" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:51:59.628332" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:51:59 GMT', 'Expires': 'Thu, 09 Apr 2026 23:51:59 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782319,"status":200} 
 </msg>
<msg time="2026-04-10T00:51:59.628428" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:51:59.624159" elapsed="0.004294"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:59.622074" elapsed="0.006422"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.628704" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.628526" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.622053" elapsed="0.006739"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.632383" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782319,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.629878" elapsed="0.002554"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:59.629653" elapsed="0.002815"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.629635" elapsed="0.002857"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.635224" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:51:59.632810" elapsed="0.002460"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:59.632563" elapsed="0.002742"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.632530" elapsed="0.002799"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.635907" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:59.635502" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.636241" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.636004" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.636837" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:59.636484" elapsed="0.000381"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:59.636322" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.635985" elapsed="0.000938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.637445" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:59.637084" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.637795" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:51:59.637556" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.638330" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:51:59.638036" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-10T00:51:59.637877" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.637523" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:51:59.638581" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:51:59.639438" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:59.639145" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:51:59.639635" elapsed="0.002426"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:51:59.629208" elapsed="0.012918"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:51:59.642307" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:51:59.642197" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:51:59.642178" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:51:59.642569" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:51:59.642643" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:51:59.645004" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782319,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:51:59.614746" elapsed="0.030286"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:51:59.645085" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:51:59.645238" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782319,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:59.612764" elapsed="0.032500"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.646248" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782319, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:51:59.645850" elapsed="0.000427"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:51:59.646326" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:51:59.646479" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782319, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:51:59.645490" elapsed="0.001014"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:51:59.646882" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:51:59.646701" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.647384" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:59.647084" elapsed="0.000326"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.647859" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:51:59.647597" elapsed="0.000287"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:51:59.648409" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:51:59.648058" elapsed="0.000424">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:51:59.608282" elapsed="0.040330">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:00.661668" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:00.661259" elapsed="0.000443"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:00.661765" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:52:00.661946" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:00.660885" elapsed="0.001086"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:00.669067" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:00.668782" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:00.669526" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:00.669278" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:00.678097" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:00.678318" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:00 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782320,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:00.678494" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:00.672517" elapsed="0.006015"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:00.669672" elapsed="0.008955"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:00.678996" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:00.678674" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:00.669649" elapsed="0.009462"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:00.684521" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782320,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:00.680648" elapsed="0.003988"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:00.680290" elapsed="0.004410"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:00.680265" elapsed="0.004478"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:00.688964" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:00.685250" elapsed="0.003809"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:00.684861" elapsed="0.004265"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:00.684825" elapsed="0.004345"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:00.690149" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:00.689515" elapsed="0.000668"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:00.690660" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:00.690292" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:00.691433" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:00.691023" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:00.690767" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:00.690263" elapsed="0.001277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:00.692277" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:00.691788" elapsed="0.000522"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:00.692754" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:00.692410" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:00.693459" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:00.693076" elapsed="0.000418"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:00.692858" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:00.692384" elapsed="0.001206"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:00.693794" elapsed="0.000404"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:00.694898" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:00.694453" elapsed="0.000480"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:00.695131" elapsed="0.003902"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:00.679679" elapsed="0.019482"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:00.699456" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:52:00.699297" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:00.699257" elapsed="0.000355"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:00.699873" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:00.699966" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:52:00.703285" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782320,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:00.662324" elapsed="0.041103"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:00.703512" elapsed="0.000069"/>
</return>
<msg time="2026-04-10T00:52:00.703735" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782320,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:00.660313" elapsed="0.043450"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:00.705038" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782320, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:00.704516" elapsed="0.000552"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:00.705122" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:52:00.705287" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782320, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:00.704075" elapsed="0.001239"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:00.705716" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:00.705503" elapsed="0.000239"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:00.706266" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:00.705923" elapsed="0.000371"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:00.706766" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:00.706472" elapsed="0.000320"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:00.707489" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:00.707067" elapsed="0.000547">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:00.649601" elapsed="0.058147">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:01.721842" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:01.721056" elapsed="0.000853"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:01.722006" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:52:01.722303" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:01.720248" elapsed="0.002247"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:01.732442" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:01.732115" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:01.732946" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:01.732687" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:01.740821" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:01.740907" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:01 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:01 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782321,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:01.741038" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:01.735271" elapsed="0.005796"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:01.733073" elapsed="0.008095"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:01.741427" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:01.741209" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:01.733050" elapsed="0.008469"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:01.745569" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782321,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:01.742787" elapsed="0.002846"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:01.742513" elapsed="0.003247"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:01.742491" elapsed="0.003299"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:01.748920" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:01.746123" elapsed="0.002848"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:01.745863" elapsed="0.003145"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:01.745840" elapsed="0.003193"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:01.749754" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:01.749289" elapsed="0.000506"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:01.750269" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:01.749906" elapsed="0.000451"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:01.751136" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:01.750668" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:01.750394" elapsed="0.000838"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:01.749878" elapsed="0.001387"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:01.752079" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:01.751509" elapsed="0.000611"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:01.752685" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:01.752228" elapsed="0.000553"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:01.753537" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:01.753058" elapsed="0.000548"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:01.752818" elapsed="0.000841"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:01.752199" elapsed="0.001494"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:01.753936" elapsed="0.000524"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:01.755167" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:01.754733" elapsed="0.000473"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:01.755439" elapsed="0.003850"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:01.741999" elapsed="0.017398"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:01.759705" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:52:01.759511" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:01.759481" elapsed="0.000367"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:01.760077" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:01.760183" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:52:01.763114" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782321,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:01.723141" elapsed="0.040006"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:01.763204" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:01.763365" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782321,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:01.719190" elapsed="0.044202"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:01.764496" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782321, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:01.764066" elapsed="0.000458"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:01.764590" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:52:01.764748" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782321, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:01.763664" elapsed="0.001189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:01.765270" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:01.765041" elapsed="0.000255"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:01.765822" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:01.765481" elapsed="0.000369"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:01.766343" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:01.766030" elapsed="0.000341"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:01.766941" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:01.766567" elapsed="0.000450">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:01.708662" elapsed="0.058521">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:02.778435" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:02.777929" elapsed="0.000550"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:02.778578" elapsed="0.000060"/>
</return>
<msg time="2026-04-10T00:52:02.778823" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:02.777376" elapsed="0.001483"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:02.787197" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:02.786863" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:02.788465" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:02.787412" elapsed="0.001100"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:02.795333" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:02.795397" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:02 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:02 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782322,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:02.795559" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:02.790835" elapsed="0.004754"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:02.788612" elapsed="0.007024"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:02.795857" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:02.795670" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:02.788588" elapsed="0.007389"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:02.799951" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782322,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:02.797173" elapsed="0.002829"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:02.796938" elapsed="0.003099"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:02.796917" elapsed="0.003145"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:02.802823" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:02.800343" elapsed="0.002528"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:02.800118" elapsed="0.002789"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:02.800101" elapsed="0.002830"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:02.803624" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:02.803114" elapsed="0.000539"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:02.804067" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:02.803728" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:02.804872" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:02.804409" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:02.804183" elapsed="0.000864"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:02.803709" elapsed="0.001372"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:02.805858" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:02.805309" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:02.806330" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:02.805997" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:02.807117" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:02.806696" elapsed="0.000459"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:02.806445" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:02.805972" elapsed="0.001266"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:02.807457" elapsed="0.000587"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:02.808707" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:02.808280" elapsed="0.000464"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:02.808966" elapsed="0.003548"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:02.796439" elapsed="0.016199"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:02.812915" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-10T00:52:02.812751" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:02.812721" elapsed="0.000332"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:02.813277" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:02.813385" elapsed="0.000024"/>
</return>
<msg time="2026-04-10T00:52:02.816948" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782322,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:02.779339" elapsed="0.037655"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:02.817078" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:52:02.817319" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782322,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:02.776657" elapsed="0.040701"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:02.819008" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782322, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:02.818343" elapsed="0.000707"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:02.819124" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:52:02.819354" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782322, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:02.817761" elapsed="0.001632"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:02.819945" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:02.819750" elapsed="0.000221"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:02.820458" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:02.820148" elapsed="0.000337"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:02.821020" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:02.820739" elapsed="0.000308"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:02.821608" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:02.821224" elapsed="0.000466">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:02.768235" elapsed="0.053577">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:03.833701" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:03.833285" elapsed="0.000626"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:03.833980" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:52:03.834192" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:03.832906" elapsed="0.001314"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:03.841107" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:03.840790" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:03.841591" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:03.841321" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:03.848179" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:03.848241" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:03 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:03 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782323,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:03.848338" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:03.843866" elapsed="0.004500"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:03.841748" elapsed="0.006663"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:03.848620" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:03.848439" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:03.841721" elapsed="0.006988"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:03.852387" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782323,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:03.849773" elapsed="0.002665"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:03.849526" elapsed="0.002948"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:03.849508" elapsed="0.002990"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:03.855753" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:03.852807" elapsed="0.003020"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:03.852574" elapsed="0.003303"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:03.852539" elapsed="0.003372"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:03.856797" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:03.856199" elapsed="0.000638"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:03.857319" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:03.856936" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:03.858170" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:03.857691" elapsed="0.000519"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:03.857438" elapsed="0.000823"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:03.856911" elapsed="0.001381"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:03.859083" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:03.858520" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:03.859585" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:03.859225" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:03.860378" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:03.859931" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:03.859704" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:03.859200" elapsed="0.001296"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:03.860742" elapsed="0.000557"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:03.861978" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:03.861568" elapsed="0.000535"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:03.862375" elapsed="0.003435"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:03.849089" elapsed="0.016815"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:03.866217" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-10T00:52:03.866007" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:03.865980" elapsed="0.000377"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:03.866596" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:03.866704" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:52:03.869244" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782323,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:03.834608" elapsed="0.034677"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:03.869353" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:52:03.869530" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782323,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:03.832381" elapsed="0.037192"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:03.870644" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782323, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:03.870214" elapsed="0.000459"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:03.870723" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:03.870881" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782323, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:03.869806" elapsed="0.001101"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:03.871278" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:03.871087" elapsed="0.000228"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:03.871844" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:03.871512" elapsed="0.000357"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:03.872307" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:03.872044" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:03.872879" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:03.872506" elapsed="0.000446">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:03.822905" elapsed="0.050159">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:04.885396" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:04.884884" elapsed="0.000557"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:04.885538" elapsed="0.000106"/>
</return>
<msg time="2026-04-10T00:52:04.885843" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:04.884285" elapsed="0.001594"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:04.894316" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:04.894039" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:04.894805" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:04.894530" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:04.904803" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:04.905016" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:04 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:04 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782324,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:04.905176" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:04.897892" elapsed="0.007323"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:04.894936" elapsed="0.010346"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:04.905584" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:04.905323" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:04.894910" elapsed="0.010839"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:04.910877" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782324,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:04.907285" elapsed="0.003665"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:04.906958" elapsed="0.004044"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:04.906925" elapsed="0.004125"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:04.914670" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:04.911478" elapsed="0.003240"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:04.911146" elapsed="0.003609"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:04.911117" elapsed="0.003663"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:04.915388" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:04.914969" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:04.915753" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:04.915488" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:04.916331" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:04.916003" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:04.915837" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:04.915470" elapsed="0.000948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:04.917001" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:04.916597" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:04.917350" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:04.917101" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:04.917922" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:04.917613" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:04.917433" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:04.917083" elapsed="0.000923"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:04.918165" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:04.919020" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:04.918720" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:04.919210" elapsed="0.002477"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:04.906316" elapsed="0.015437"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:04.921936" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:52:04.921824" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:04.921805" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:04.922178" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:04.922256" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:52:04.924610" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782324,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:04.886414" elapsed="0.038262"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:04.924770" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:52:04.924937" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782324,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:04.883586" elapsed="0.041377"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:04.925976" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782324, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:04.925564" elapsed="0.000441"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:04.926055" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:04.926238" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782324, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:04.925188" elapsed="0.001079"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:04.926699" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:04.926473" elapsed="0.000261"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:04.927234" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:04.926924" elapsed="0.000337"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:04.927747" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:04.927448" elapsed="0.000325"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:04.928308" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:04.927948" elapsed="0.000443">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:04.874043" elapsed="0.054467">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:05.940899" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:05.940508" elapsed="0.000423"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:05.940989" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:52:05.941156" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:05.940141" elapsed="0.001041"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:05.947932" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:05.947666" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:05.948387" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:05.948138" 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-04-10T00:52:05.954884" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:05.954949" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:05 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:05 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782325,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:05.955052" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:05.950602" elapsed="0.004478"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:05.948506" elapsed="0.006622"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:05.955330" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:05.955160" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:05.948486" elapsed="0.006931"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:05.963036" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782325,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:05.956905" elapsed="0.006220"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:05.956538" elapsed="0.006722"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:05.956511" elapsed="0.006792"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:05.967920" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:05.964047" elapsed="0.003930"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:05.963401" elapsed="0.004618"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:05.963373" elapsed="0.004672"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:05.968923" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:05.968464" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:05.969273" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:05.969027" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:05.969862" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:05.969522" elapsed="0.000371"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:05.969357" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:05.969008" elapsed="0.000943"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:05.970478" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:05.970114" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:05.970836" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:05.970598" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:05.971379" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:05.971085" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:05.970924" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:05.970579" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:05.971668" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:05.972480" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:05.972185" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:05.972681" elapsed="0.002556"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:05.955885" elapsed="0.019430"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:05.975557" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-10T00:52:05.975395" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:05.975374" 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-04-10T00:52:05.975824" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:05.975898" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:52:05.978263" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782325,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:05.941531" elapsed="0.036764"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:05.978350" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:05.978507" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782325,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:05.939652" elapsed="0.038882"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:05.979750" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782325, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:05.979203" elapsed="0.000577"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:05.979831" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:05.979989" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782325, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:05.978809" elapsed="0.001302"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:05.980486" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:05.980299" elapsed="0.000213"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:05.981025" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:05.980711" elapsed="0.000341"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:05.981491" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:05.981227" elapsed="0.000291"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:05.982071" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:05.981709" elapsed="0.000436">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:05.929395" elapsed="0.052868">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:06.993677" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:06.993103" elapsed="0.000638"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:06.993843" elapsed="0.000060"/>
</return>
<msg time="2026-04-10T00:52:06.994177" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:06.992486" elapsed="0.001744"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:07.006536" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:07.005985" elapsed="0.000677"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:07.007326" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:07.006976" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:07.014638" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:07.014703" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:07 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:07 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782327,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:07.014804" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:07.009742" elapsed="0.005089"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:07.007463" elapsed="0.007415"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:07.015163" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:07.014925" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:07.007440" elapsed="0.007852"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:07.020648" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782327,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:07.016893" elapsed="0.003830"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:07.016525" elapsed="0.004251"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:07.016498" elapsed="0.004315"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:07.024295" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:07.021238" elapsed="0.003107"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:07.020898" elapsed="0.003482"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:07.020872" elapsed="0.003533"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:07.025012" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:07.024608" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:07.025352" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:07.025110" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:07.025923" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:07.025616" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:07.025434" elapsed="0.000621"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:07.025092" elapsed="0.000988"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:07.026668" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:07.026248" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:07.027008" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:07.026767" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:07.027563" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:07.027250" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:07.027089" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:07.026749" elapsed="0.000899"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:07.027806" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:07.028639" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:07.028323" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:07.028823" elapsed="0.002413"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:07.015881" elapsed="0.015422"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:07.031484" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:52:07.031375" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:07.031356" elapsed="0.000237"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:07.031745" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:07.031817" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:07.034175" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782327,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:06.995027" elapsed="0.039178"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:07.034258" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:07.034454" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782327,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:06.991662" elapsed="0.042820"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:07.035465" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782327, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:07.035070" elapsed="0.000423"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:07.035556" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:07.035712" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782327, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:07.034723" elapsed="0.001015"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:07.036098" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:07.035918" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:07.036618" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:07.036299" elapsed="0.000346"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:07.037081" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:07.036818" elapsed="0.000288"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:07.037641" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:07.037277" elapsed="0.000437">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:06.983259" elapsed="0.054567">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:08.051065" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:08.050677" elapsed="0.000508"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:08.051249" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:52:08.051436" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:08.050266" elapsed="0.001198"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:08.060052" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:08.059603" elapsed="0.000529"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:08.060674" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:08.060357" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:08.070208" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:08.070499" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:08 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:08 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782328,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:08.070868" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:08.063773" elapsed="0.007169"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:08.060827" elapsed="0.010247"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:08.071647" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:08.071156" elapsed="0.000647"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:08.060798" elapsed="0.011053"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:08.078784" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782328,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:08.074694" elapsed="0.004168"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:08.074311" elapsed="0.004615"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:08.074278" elapsed="0.004714"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:08.083344" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:08.079441" elapsed="0.003973"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:08.079090" elapsed="0.004375"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:08.079063" elapsed="0.004438"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:08.084396" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:08.083795" elapsed="0.000642"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:08.084928" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:08.084563" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:08.085917" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:08.085297" elapsed="0.000658"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:08.085052" elapsed="0.000943"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:08.084515" elapsed="0.001503"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:08.086590" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:08.086188" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:08.086943" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:08.086692" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:08.087499" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:08.087196" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:08.087029" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:08.086673" elapsed="0.000929"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:08.087766" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:08.088634" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:08.088300" elapsed="0.000432"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:08.088897" elapsed="0.002807"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:08.072827" elapsed="0.018948"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:08.091970" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:52:08.091853" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:08.091832" elapsed="0.000240"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:08.092228" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:08.092300" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:08.094792" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782328,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:08.051920" elapsed="0.042902"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:08.094878" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:52:08.095092" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782328,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:08.049731" elapsed="0.045397"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:08.096692" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782328, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:08.096045" elapsed="0.000704"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:08.096855" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:52:08.097154" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782328, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:08.095462" elapsed="0.001733"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:08.097815" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:08.097517" elapsed="0.000345"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:08.098686" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:08.098137" elapsed="0.000590"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:08.099369" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:08.098984" elapsed="0.000421"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:08.100178" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:08.099675" elapsed="0.000604">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:08.038798" elapsed="0.061643">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:09.111697" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:09.111147" elapsed="0.000598"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:09.111827" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:52:09.112066" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:09.110585" elapsed="0.001519"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:09.126048" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:09.125670" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:09.126562" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:09.126285" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:09.133757" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:09.133939" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:09 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:09 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782329,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:09.134081" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:09.129100" elapsed="0.005010"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:09.126699" elapsed="0.007469"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:09.134414" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:09.134206" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:09.126673" elapsed="0.007832"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:09.140075" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782329,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:09.136085" elapsed="0.004074"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:09.135718" elapsed="0.004499"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:09.135688" elapsed="0.004568"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:09.145059" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:09.140818" elapsed="0.004326"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:09.140349" elapsed="0.004855"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:09.140321" elapsed="0.004923"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:09.146210" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:09.145582" elapsed="0.000668"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:09.146752" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:09.146366" elapsed="0.000474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:09.147647" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:09.147149" elapsed="0.000540"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:09.146876" elapsed="0.000868"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:09.146337" elapsed="0.001441"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:09.148897" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:09.148043" elapsed="0.000907"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:09.149420" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:09.149061" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:09.150319" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:09.149814" elapsed="0.000545"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:09.149566" elapsed="0.000846"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:09.149033" elapsed="0.001412"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:09.150710" elapsed="0.000550"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:09.151975" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:09.151515" elapsed="0.000499"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:09.152250" elapsed="0.003141"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:09.134982" elapsed="0.020622"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:09.156046" elapsed="0.000072"/>
</return>
<status status="PASS" start="2026-04-10T00:52:09.155783" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:09.155736" elapsed="0.000514"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:09.156665" elapsed="0.000054"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:09.156831" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:52:09.162191" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782329,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:09.112681" elapsed="0.049687"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:09.162492" elapsed="0.000099"/>
</return>
<msg time="2026-04-10T00:52:09.162963" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782329,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:09.109715" elapsed="0.053312"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:09.165200" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782329, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:09.164479" elapsed="0.000750"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:09.165280" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:09.165436" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782329, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:09.163582" elapsed="0.001880"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:09.165846" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:09.165661" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:09.166360" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:09.166050" elapsed="0.000337"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:09.166841" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:09.166575" elapsed="0.000291"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:09.167393" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:09.167037" elapsed="0.000430">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:09.101372" elapsed="0.066225">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:10.184503" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:10.184138" elapsed="0.000397"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:10.184607" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:52:10.184774" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:10.183344" elapsed="0.001456"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:10.191564" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:10.191215" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:10.192020" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:10.191772" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:10.198508" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:10.198585" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:10 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:10 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782330,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:10.198681" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:10.194247" elapsed="0.004460"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:10.192141" elapsed="0.006610"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:10.198934" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:10.198779" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:10.192122" elapsed="0.006904"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:10.202580" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782330,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:10.200091" elapsed="0.002540"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:10.199866" elapsed="0.002859"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:10.199848" elapsed="0.002904"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:10.205671" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:10.203036" elapsed="0.002683"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:10.202810" elapsed="0.002943"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:10.202792" elapsed="0.002986"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:10.206348" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:10.205955" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:10.206700" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:10.206445" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:10.207247" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:10.206947" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:10.206784" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:10.206427" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:10.207951" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:10.207580" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:10.208388" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:10.208058" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:10.209158" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:10.208745" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:10.208499" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:10.208030" elapsed="0.001242"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:10.209505" elapsed="0.000680"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:10.210949" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:10.210470" elapsed="0.000516"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:10.211208" elapsed="0.003414"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:10.199389" elapsed="0.015324"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:10.214962" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-10T00:52:10.214811" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:10.214785" 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-04-10T00:52:10.215293" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:10.215390" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:52:10.218674" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782330,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:10.185148" elapsed="0.033567"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:10.218787" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:52:10.218996" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782330,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:10.182149" elapsed="0.036883"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:10.220330" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782330, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:10.219879" elapsed="0.000480"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:10.220406" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:10.220575" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782330, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:10.219340" elapsed="0.001305"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:10.221015" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:10.220827" elapsed="0.000213"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:10.221519" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:10.221218" elapsed="0.000342"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:10.222004" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:10.221738" elapsed="0.000291"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:10.222567" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:10.222203" elapsed="0.000437">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:10.168636" elapsed="0.054118">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:11.236443" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:11.236071" elapsed="0.000404"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:11.236535" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T00:52:11.236719" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:11.235702" elapsed="0.001043"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:11.244242" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:11.243971" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:11.244718" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:11.244450" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:11.252597" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:11.252662" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:11 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:11 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782331,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:11.252763" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:11.247026" elapsed="0.005763"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:11.244837" elapsed="0.007997"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:11.253026" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:11.252866" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:11.244817" elapsed="0.008312"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:11.257574" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782331,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:11.254258" elapsed="0.003388"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:11.254018" elapsed="0.003677"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:11.253998" elapsed="0.003731"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:11.261590" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:11.258122" elapsed="0.003539"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:11.257807" elapsed="0.003902"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:11.257783" elapsed="0.003960"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:11.262526" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:11.261987" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:11.263044" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:11.262706" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:11.263846" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:11.263391" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:11.263159" elapsed="0.000856"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:11.262679" elapsed="0.001372"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:11.264994" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:11.264284" elapsed="0.000750"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:11.265351" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:11.265111" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:11.265925" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:11.265618" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:11.265434" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:11.265092" elapsed="0.000918"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:11.266171" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:11.267039" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:11.266740" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:11.267221" elapsed="0.002446"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:11.253563" elapsed="0.016169"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:11.269913" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:52:11.269803" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:11.269785" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:11.270156" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:11.270227" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:52:11.272611" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782331,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:11.237103" elapsed="0.035538"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:11.272693" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:11.272845" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782331,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:11.235190" elapsed="0.037681"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:11.273859" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782331, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:11.273439" elapsed="0.000449"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:11.273937" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:11.274096" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782331, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:11.273094" elapsed="0.001028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:11.274482" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:11.274301" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:11.275092" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:11.274777" elapsed="0.000342"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:11.275574" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:11.275295" elapsed="0.000306"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:11.276129" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:11.275772" elapsed="0.000432">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:11.223706" elapsed="0.052613">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:12.286337" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:12.285796" elapsed="0.000678"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:12.286580" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T00:52:12.286831" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:12.285240" elapsed="0.001680"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:12.294289" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:12.293975" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:12.294773" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:12.294503" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:12.302276" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:12.302343" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:12 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:12 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782332,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:12.302444" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:12.297131" elapsed="0.005339"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:12.294943" elapsed="0.007572"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:12.302725" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:12.302564" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:12.294918" elapsed="0.007894"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:12.307598" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782332,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:12.304008" elapsed="0.003665"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:12.303766" elapsed="0.003957"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:12.303742" elapsed="0.004016"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:12.311929" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:12.308159" elapsed="0.003854"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:12.307839" elapsed="0.004224"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:12.307816" elapsed="0.004274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:12.312723" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:12.312278" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:12.313084" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:12.312823" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:12.313680" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:12.313331" elapsed="0.000376"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:12.313170" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:12.312804" elapsed="0.000961"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:12.314296" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:12.313926" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:12.314695" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:12.314393" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:12.315278" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:12.314971" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:12.314782" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:12.314374" elapsed="0.000988"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:12.315525" elapsed="0.000392"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:12.316399" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:12.316098" elapsed="0.000379"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:12.316677" elapsed="0.002489"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:12.303265" elapsed="0.015968"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:12.319415" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:52:12.319304" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:12.319285" elapsed="0.000221"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:12.319685" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:12.319761" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:52:12.322163" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782332,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:12.287461" elapsed="0.034731"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:12.322246" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:12.322400" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782332,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:12.284498" elapsed="0.037927"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:12.323675" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782332, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:12.323231" elapsed="0.000478"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:12.323760" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:12.323925" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782332, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:12.322699" elapsed="0.001254"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:12.324315" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:12.324132" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:12.324853" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:12.324519" elapsed="0.000360"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:12.325351" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:12.325054" elapsed="0.000324"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:12.326029" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:12.325591" elapsed="0.000512">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:12.277054" elapsed="0.049360">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:13.338888" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:13.338306" elapsed="0.000630"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:13.339020" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:52:13.339262" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:13.337754" elapsed="0.001545"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:13.347144" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:13.346867" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:13.347618" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:13.347356" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:13.355835" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:13.355977" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:13 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:13 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782333,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:13.356082" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:13.349963" elapsed="0.006146"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:13.347739" elapsed="0.008415"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:13.356412" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:13.356185" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:13.347717" elapsed="0.008793"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:13.360177" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782333,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:13.357643" elapsed="0.002639"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:13.357374" elapsed="0.002947"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:13.357355" elapsed="0.002991"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:13.364167" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:13.360651" elapsed="0.003622"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:13.360404" elapsed="0.003934"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:13.360387" elapsed="0.003990"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:13.365247" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:13.364666" elapsed="0.000621"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:13.365767" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:13.365391" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:13.366602" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:13.366131" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:13.365887" elapsed="0.000808"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:13.365365" elapsed="0.001362"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:13.367503" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:13.366967" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:13.368017" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:13.367668" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:13.368946" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:13.368472" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:13.368152" elapsed="0.000884"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:13.367641" elapsed="0.001426"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:13.369235" elapsed="0.000423"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:13.370124" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:13.369829" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:13.370306" elapsed="0.002555"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:13.356924" elapsed="0.016005"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:13.373117" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:52:13.373004" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:13.372985" elapsed="0.000229"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:13.373393" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:13.373468" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:13.375990" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782333,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:13.339857" elapsed="0.036221"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:13.376137" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:13.376351" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782333,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:13.336906" elapsed="0.039472"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:13.377466" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782333, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:13.377040" elapsed="0.000455"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:13.377561" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:52:13.377731" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782333, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:13.376667" elapsed="0.001097"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:13.378147" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:13.377960" elapsed="0.000213"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:13.378743" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:13.378350" elapsed="0.000422"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:13.379225" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:13.378946" elapsed="0.000305"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:13.379828" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:13.379433" elapsed="0.000474">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:13.327411" elapsed="0.052625">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:14.392972" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:14.392430" elapsed="0.000587"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:14.393098" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:52:14.393337" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:14.391889" elapsed="0.001487"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:14.402884" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:14.402604" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:14.403361" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:14.403098" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:14.411085" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:14.411165" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:14 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:14 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782334,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:14.411311" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:14.406234" elapsed="0.005115"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:14.403496" elapsed="0.007919"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:14.411720" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:14.411457" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:14.403475" elapsed="0.008371"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:14.419691" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782334,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:14.413356" elapsed="0.006432"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:14.413028" elapsed="0.006928"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:14.413001" elapsed="0.007005"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:14.423530" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:14.420486" elapsed="0.003114"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:14.420124" elapsed="0.003514"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:14.420088" elapsed="0.003575"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:14.424274" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:14.423855" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:14.424636" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:14.424375" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:14.425198" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:14.424885" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:14.424720" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:14.424357" elapsed="0.000929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:14.425888" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:14.425480" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:14.426229" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:14.425988" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:14.426793" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:14.426472" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:14.426312" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:14.425970" elapsed="0.000918"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:14.427048" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:14.427989" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:14.427588" elapsed="0.000442"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:14.428276" elapsed="0.003211"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:14.412384" elapsed="0.019205"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:14.431792" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:52:14.431673" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:14.431653" elapsed="0.000238"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:14.432051" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:14.432124" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:52:14.434491" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782334,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:14.394012" elapsed="0.040509"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:14.434590" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:52:14.434747" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782334,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:14.391100" elapsed="0.043672"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:14.435851" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782334, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:14.435409" elapsed="0.000471"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:14.435929" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:14.436086" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782334, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:14.435033" elapsed="0.001139"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:14.436587" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:14.436358" elapsed="0.000258"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:14.437112" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:14.436799" elapsed="0.000341"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:14.437661" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:14.437316" elapsed="0.000373"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:14.438225" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:14.437866" elapsed="0.000436">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:14.381018" elapsed="0.057403">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:15.449103" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:15.448605" elapsed="0.000542"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:15.449230" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T00:52:15.449463" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:15.448060" elapsed="0.001438"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:15.457138" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:15.456878" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:15.457603" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:15.457343" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:15.464682" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:15.464747" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:15 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:15 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782335,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:15.464845" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:15.459899" elapsed="0.004973"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:15.457722" elapsed="0.007194"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:15.465110" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:15.464948" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:15.457701" elapsed="0.007508"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:15.468898" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782335,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:15.466347" elapsed="0.002602"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:15.466108" elapsed="0.002876"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:15.466087" elapsed="0.002922"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:15.472047" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:15.469291" elapsed="0.002825"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:15.469065" elapsed="0.003099"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:15.469048" elapsed="0.003150"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:15.473022" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:15.472449" elapsed="0.000611"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:15.473488" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:15.473158" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:15.474289" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:15.473863" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:15.473633" elapsed="0.000840"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:15.473133" elapsed="0.001377"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:15.475420" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:15.474820" elapsed="0.000642"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:15.475928" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:15.475589" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:15.476797" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:15.476272" elapsed="0.000564"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:15.476045" elapsed="0.000843"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:15.475539" elapsed="0.001380"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:15.477142" elapsed="0.000630"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:15.478430" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:15.478012" elapsed="0.000458"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:15.478774" elapsed="0.002645"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:15.465620" elapsed="0.015870"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:15.481698" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:52:15.481584" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:15.481563" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:15.481948" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:15.482021" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:52:15.484528" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782335,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:15.450113" elapsed="0.034466"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:15.484637" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:15.484794" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782335,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:15.447367" elapsed="0.037454"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:15.485874" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782335, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:15.485452" elapsed="0.000451"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:15.485953" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:15.486111" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782335, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:15.485085" elapsed="0.001052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:15.486500" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:15.486318" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:15.487108" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:15.486777" elapsed="0.000358"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:15.487595" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:15.487312" elapsed="0.000309"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:15.488146" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:15.487794" elapsed="0.000425">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:15.439344" elapsed="0.048988">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:16.502310" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:16.501770" elapsed="0.000688"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:16.502566" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:52:16.502828" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:16.501189" elapsed="0.001679"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:16.510360" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:16.510070" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:16.510860" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:16.510598" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:16.517505" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:16.517588" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:16 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:16 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782336,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:16.517692" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:16.513179" elapsed="0.004540"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:16.510990" elapsed="0.006774"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:16.517960" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:16.517795" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:16.510966" elapsed="0.007083"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:16.521995" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782336,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:16.519173" elapsed="0.002886"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:16.518934" elapsed="0.003167"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:16.518915" elapsed="0.003212"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:16.525371" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:16.522431" elapsed="0.003009"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:16.522193" elapsed="0.003298"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:16.522175" elapsed="0.003353"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:16.526405" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:16.525818" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:16.526945" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:16.526578" elapsed="0.000456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:16.527867" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:16.527319" elapsed="0.000588"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:16.527069" elapsed="0.000893"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:16.526524" elapsed="0.001471"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:16.528812" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:16.528235" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:16.529317" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:16.528959" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:16.530154" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:16.529710" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:16.529441" elapsed="0.000808"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:16.528931" elapsed="0.001350"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:16.530513" elapsed="0.000554"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:16.531856" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:16.531320" elapsed="0.000685"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:16.532229" elapsed="0.002677"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:16.518466" elapsed="0.016511"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:16.535167" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:52:16.535053" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:16.535034" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:16.535421" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:16.535496" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:16.537903" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782336,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:16.503403" elapsed="0.034530"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:16.537986" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:16.538145" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782336,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:16.500311" elapsed="0.037861"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:16.539223" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782336, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:16.538801" elapsed="0.000452"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:16.539304" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:16.539467" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782336, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:16.538413" elapsed="0.001081"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:16.539953" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:16.539761" elapsed="0.000218"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:16.540484" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:16.540163" elapsed="0.000348"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:16.540976" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:16.540707" elapsed="0.000294"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:16.541555" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:16.541174" elapsed="0.000457">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:16.489304" elapsed="0.052440">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.556786" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:17.555922" elapsed="0.000932"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:17.556975" elapsed="0.000083"/>
</return>
<msg time="2026-04-10T00:52:17.557282" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:17.555087" elapsed="0.002219"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.564581" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:17.564272" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.565039" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:17.564792" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:17.572516" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:17.572695" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:17 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782337,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:17.572795" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:17.567266" elapsed="0.005555"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:17.565161" elapsed="0.007703"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.573048" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:17.572892" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.565139" elapsed="0.007995"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.576827" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782337,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:17.574266" elapsed="0.002616"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:17.574036" elapsed="0.002886"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.574018" elapsed="0.002931"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.580711" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:17.577259" elapsed="0.003519"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:17.577009" elapsed="0.003817"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.576992" elapsed="0.003868"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.581677" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:17.581107" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.582143" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:17.581814" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.582927" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:17.582481" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:17.582255" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.581789" elapsed="0.001255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.583792" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:17.583269" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.584253" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:17.583928" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.585054" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:17.584638" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:17.584366" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.583903" elapsed="0.001267"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:17.585343" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:17.586165" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:17.585875" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:17.586345" elapsed="0.002476"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:17.573581" elapsed="0.015305"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:17.589081" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:52:17.588972" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.588953" elapsed="0.000236"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.589341" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:17.589412" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:17.591741" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782337,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:17.557852" elapsed="0.033983"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:17.591922" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:52:17.592149" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782337,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:17.553983" elapsed="0.038200"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.593306" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782337, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:17.592891" elapsed="0.000445"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:17.593385" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:17.593555" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782337, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:17.592434" elapsed="0.001150"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:17.593944" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:17.593763" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.594629" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:17.594144" elapsed="0.000514"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.595097" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:17.594832" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:52:17.595294" elapsed="0.000336"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:52:17.543265" elapsed="0.052427"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:51:59.607639" elapsed="17.988106"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:51:59.607216" elapsed="17.988593"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:51:59.602474" elapsed="17.993369"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:51:59.602336" elapsed="17.993543"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.607229" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:17.606927" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:17.607301" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:17.607447" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:17.606581" elapsed="0.000891"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.614158" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:17.613902" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.614620" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:17.614359" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:17.622677" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:17.622756" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:17 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782337,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:17.622886" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:17.616829" elapsed="0.006093"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:17.614734" elapsed="0.008247"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.623230" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:17.623019" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.614715" elapsed="0.008702"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.628734" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782337,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:17.625082" elapsed="0.003723"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:17.624535" elapsed="0.004320"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.624510" elapsed="0.004379"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.632663" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:17.629292" elapsed="0.003436"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:17.628969" elapsed="0.003806"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.628945" elapsed="0.003863"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.633583" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:17.633037" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.634054" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:17.633723" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.634873" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:17.634421" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:17.634168" elapsed="0.000792"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.633698" elapsed="0.001292"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.635739" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:17.635212" elapsed="0.000564"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.636198" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:17.635874" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.637015" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:17.636531" elapsed="0.000522"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:17.636310" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.635850" elapsed="0.001282"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:17.637324" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:17.638135" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:17.637855" elapsed="0.000306"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:17.638316" elapsed="0.002463"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:17.623949" elapsed="0.016907"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:17.641051" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:17.640935" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.640913" elapsed="0.000229"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.641305" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:17.641382" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:17.643713" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782337,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:17.607828" elapsed="0.035913"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:17.643793" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:17.643943" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782337,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:17.606108" elapsed="0.037860"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:52:17.644013" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:52:17.644155" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782337,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 1. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:52:17.601558" elapsed="0.042675"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.645250" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782337, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:17.644852" elapsed="0.000426"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:17.645327" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:17.645481" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782337, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:17.644459" elapsed="0.001049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:17.645880" level="INFO">${value} = 0</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:17.645700" elapsed="0.000205"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.646362" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:52:17.646083" elapsed="0.000335"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 0.</doc>
<status status="PASS" start="2026-04-10T00:52:17.601101" elapsed="0.045381"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:17.596081" elapsed="0.050437"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:17.595938" elapsed="0.050627"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_del}</arg>
<arg>${Inventory_Leader_List_Post}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:51:59.532368" elapsed="18.114256"/>
</kw>
<doc>Verify flow count is 0 across cluster nodes.</doc>
<status status="PASS" start="2026-04-10T00:51:59.151718" elapsed="18.495033"/>
</test>
<test id="s1-s2-t17" name="Get Inventory Follower And Leader Before Cluster Restart" line="157">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:52:17.650128" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:52:17.649847" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:17.651399" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:17.651291" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.651273" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:17.656918" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:17.656809" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.656790" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.658063" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:17.657683" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.658563" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:17.658249" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:17.658635" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:17.658790" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:17.657213" elapsed="0.001602"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:17.664235" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:17.664127" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.664108" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:17.665676" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:17.665567" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.665525" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:17.666189" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:17.665889" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:17.666617" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:17.666379" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:17.701185" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:17.667136" elapsed="0.034256"/>
</kw>
<msg time="2026-04-10T00:52:17.701595" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:17.701645" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:17.666802" elapsed="0.034880"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:17.785026" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "A "n "d "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:17.702333" elapsed="0.082925"/>
</kw>
<msg time="2026-04-10T00:52:17.785471" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:17.785521" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:17.701910" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.786008" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:17.785697" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.785665" elapsed="0.000430"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.786627" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "A "n "d "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:17.786245" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.787019" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:17.786794" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.786776" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:17.787136" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:17.788716" elapsed="0.000841"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:17.789846" elapsed="0.000479"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:17.790618" 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-04-10T00:52:17.788043" elapsed="0.003262"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:17.787452" elapsed="0.003921"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:17.665235" elapsed="0.126238"/>
</kw>
<msg time="2026-04-10T00:52:17.791587" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:17.791634" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:17.664455" elapsed="0.127218"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:17.791863" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:17.791755" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.791736" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.792363" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.792720" elapsed="0.000069"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:17.792839" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:17.663784" elapsed="0.129165"/>
</kw>
<msg time="2026-04-10T00:52:17.793046" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:17.793091" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:17.659181" elapsed="0.134001"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.793518" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:17.793261" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.793244" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:17.659036" elapsed="0.134601"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:17.799194" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:17.799086" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.799067" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:17.800600" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:17.800462" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.800444" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:17.801226" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:17.800902" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:17.801653" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:17.801417" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:17.840430" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:17.802179" elapsed="0.038382"/>
</kw>
<msg time="2026-04-10T00:52:17.840748" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:17.840833" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:17.801841" elapsed="0.039030"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:17.936244" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "A "n "d "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:17.841407" elapsed="0.094995"/>
</kw>
<msg time="2026-04-10T00:52:17.936595" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:17.936642" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:17.841050" elapsed="0.095630"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.937039" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:17.936769" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.936746" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:17.937600" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "A "n "d "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:17.937265" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.937983" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:17.937766" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.937748" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:17.938094" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:17.939657" elapsed="0.000783"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:17.940737" elapsed="0.000517"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:17.941522" elapsed="0.000391"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:17.938994" elapsed="0.003022"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:17.938415" elapsed="0.003730"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:17.800151" elapsed="0.142096"/>
</kw>
<msg time="2026-04-10T00:52:17.942341" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:17.942386" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:17.799417" elapsed="0.143008"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:17.942629" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:17.942503" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.942485" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.943122" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.943709" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:17.943784" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:17.798716" elapsed="0.145179"/>
</kw>
<msg time="2026-04-10T00:52:17.943991" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:17.944036" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:17.793912" elapsed="0.150162"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:17.944402" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:17.944150" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.944133" elapsed="0.000344"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:52:17.793766" elapsed="0.150735"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:17.950140" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:17.950035" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.950016" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:17.951336" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:17.951232" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:17.951214" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:17.951871" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:17.951568" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:17.952272" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:17.952057" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:17.989403" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:17.952818" elapsed="0.036713"/>
</kw>
<msg time="2026-04-10T00:52:17.989732" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:17.989781" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:17.952457" elapsed="0.037362"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:18.079509" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "A "n "d "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:17.990391" elapsed="0.089427"/>
</kw>
<msg time="2026-04-10T00:52:18.080061" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:18.080110" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:17.990015" elapsed="0.090225"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.080749" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.080368" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.080330" elapsed="0.000510"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.081432" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "A "n "d "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.081022" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.081839" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.081618" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.081599" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:18.081954" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:18.083568" elapsed="0.000797"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:18.084668" elapsed="0.000539"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:18.085497" elapsed="0.000397"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:18.082894" elapsed="0.003103"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:18.082290" elapsed="0.003772"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:17.950933" elapsed="0.135228"/>
</kw>
<msg time="2026-04-10T00:52:18.086262" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:18.086307" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:17.950362" elapsed="0.135983"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:18.086530" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T00:52:18.086422" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.086404" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.087047" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.087393" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.087465" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:17.949692" elapsed="0.137901"/>
</kw>
<msg time="2026-04-10T00:52:18.087692" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:18.087736" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:17.944794" elapsed="0.142980"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.088103" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.087852" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.087835" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:52:17.944651" elapsed="0.143552"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:17.658868" elapsed="0.429373"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:52:17.656348" elapsed="0.431956"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:52:17.651002" elapsed="0.437364"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:17.650565" elapsed="0.437850"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:52:17.647674" elapsed="0.440847"/>
</kw>
<kw name="Get InventoryConfig Shard Status" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.096382" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:18.095980" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.096899" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:18.096589" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:18.097023" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:52:18.097210" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:18.095598" elapsed="0.001637"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:52:18.097393" elapsed="0.000189"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.098077" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:18.097747" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.098495" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:18.098261" elapsed="0.000259"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.098920" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:18.098684" elapsed="0.000262"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.101694" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.101234" elapsed="0.000487"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:18.101766" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:18.101913" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:18.100870" elapsed="0.001067"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.177936" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.177527" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:18.178845" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:18.178468" elapsed="0.000457">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:18.179019" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:18.178132" elapsed="0.000912"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.179614" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:18.179212" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:52:18.179948" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:52:18.180111" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:52:18.179805" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.180561" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.180300" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.181595" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.181326" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.182129" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:52:18.181802" elapsed="0.000354"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.182485" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.182716" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.182895" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:52:18.182346" elapsed="0.000608"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.182208" elapsed="0.000777"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:52:18.183032" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:18.183194" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:52:18.180982" elapsed="0.002236"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.180682" elapsed="0.002569"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.183422" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.183275" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.180660" elapsed="0.002838"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.184094" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.183656" elapsed="0.000465"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:52:18.184170" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:52:18.176824" elapsed="0.007513"/>
</kw>
<msg time="2026-04-10T00:52:18.184409" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:18.163176" elapsed="0.021395"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.200232" elapsed="0.000069"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.214339" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.228621" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.229018" elapsed="0.000104"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.229374" elapsed="0.000075"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.230255" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.230013" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:18.229981" elapsed="0.000386"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.230654" 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-04-10T00:52:18.231034" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.231339" elapsed="0.000036"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:52:18.229904" elapsed="0.001521"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.229622" elapsed="0.001877"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.231837" elapsed="0.000077"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.232090" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:52:18.232310" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:52:18.152508" elapsed="0.079830"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:18.234601" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:18.234208" elapsed="0.000471">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:18.234835" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:18.233330" elapsed="0.001545"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.236727" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.235033" elapsed="0.001825"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.237909" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.237301" elapsed="0.000659"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.236915" elapsed="0.001098"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.235012" elapsed="0.003036"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.241707" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:18.238269" elapsed="0.003484"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:52:18.241901" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:52:18.242168" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:18.232793" elapsed="0.009402"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:18.244407" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:18.244002" elapsed="0.000484">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:18.244850" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:18.243150" elapsed="0.001742"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:52:18.245428" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-10T00:52:18.245052" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.245029" elapsed="0.000612"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.245854" elapsed="0.000094"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.246223" elapsed="0.000079"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.246425" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:52:18.262205" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:18.242639" elapsed="0.019620"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.265711" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.264873" elapsed="0.001079"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.267233" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.266212" elapsed="0.001158"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:18.279773" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:18.280214" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:52:18.280605" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:18.270902" elapsed="0.009753"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.267516" elapsed="0.013198"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.281861" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.280759" elapsed="0.001203"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.267489" elapsed="0.014510"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.287790" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.284462" elapsed="0.003821"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.284158" elapsed="0.004213"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.284125" elapsed="0.004315"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.292572" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.289019" elapsed="0.003620"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.288601" elapsed="0.004122"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.288536" elapsed="0.004256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.294176" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.293336" elapsed="0.000908"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.294859" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.294402" elapsed="0.000571"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.295805" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.295346" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.295040" elapsed="0.000887"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.294358" elapsed="0.001633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.297215" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.296462" elapsed="0.000823"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.297899" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.297438" elapsed="0.000573"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.298819" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.298374" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.298078" elapsed="0.000862"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.297395" elapsed="0.001608"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:18.299485" elapsed="0.000640"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:18.301280" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.300636" elapsed="0.000710"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:18.301860" elapsed="0.002677"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:18.282896" elapsed="0.021744"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.305021" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:18.304813" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.304792" elapsed="0.000417"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:18.316213" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:18.305411" elapsed="0.010856"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:18.316420" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:52:18.316709" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:18.263131" elapsed="0.053606"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:18.316804" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:18.316958" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:52:18.110605" elapsed="0.206380"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.317413" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.317078" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.317060" elapsed="0.000539"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:18.317634" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:52:18.106204" elapsed="0.211561"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.102005" elapsed="0.215804"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.101987" elapsed="0.215846"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:52:18.318466" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:18.318356" elapsed="0.000171"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.318624" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:18.318584" elapsed="0.000081"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.318339" elapsed="0.000349"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.318849" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:52:18.318972" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:52:18.318071" elapsed="0.000928"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.319595" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.319179" elapsed="0.000444"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.320243" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.319780" elapsed="0.000491"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.326117" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.325838" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.326636" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.326321" 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-04-10T00:52:18.336454" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:18.336649" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":29729,"SnapshotIndex":97378,"InMemoryJournalLogSize":545,"ReplicatedToAllIndex":97378,"Leader":"member-1-shard-inventory-config","LastIndex":97923,"RaftState":"Leader","LastApplied":97379,"LastCommittedTransactionTime":"2026-04-10 00:51:58.144","LastLogIndex":97923,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.223","active":true,"matchIndex":97379,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":97380},{"timeSinceLastActivity":"00:00:00.014","active":true,"matchIndex":97652,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":97653}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"757.8 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":2,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":97379,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":2,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":980278},"timestamp":1775782338,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:18.336879" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:18.328829" elapsed="0.008087"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.326748" elapsed="0.010231"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.337281" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.337020" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.326730" elapsed="0.010734"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.344035" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":29729,"SnapshotIndex":97378,"InMemoryJournalLogSize":545,"ReplicatedToAllIndex":97378,"Leader":"member-1-shard-inventory-config","LastIndex":97923,"RaftState":"Leader","LastApplied":97379,"LastCommittedTransactionTime":"2026-04-10 00:51:58.144","LastLogIndex":97923,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.223","active":true,"matchIndex":97379,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":97380},{"timeSinceLastActivity":"00:00:00.014","active":true,"matchIndex":97652,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":97653}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"757.8 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":2,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":97379,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":2,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":980278},"timestamp":1775782338,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.339792" elapsed="0.004462"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.339173" elapsed="0.005214"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.339147" elapsed="0.005280"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.349056" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.344971" elapsed="0.004319"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.344510" elapsed="0.004906"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.344486" elapsed="0.004967"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.350458" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.349718" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.351258" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.350641" elapsed="0.000797"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.352738" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.351973" elapsed="0.000808"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.351465" elapsed="0.001419"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.350621" elapsed="0.002288"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.353672" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.353074" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.354427" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.353805" elapsed="0.000865"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.356083" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.355318" elapsed="0.000807"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.354699" elapsed="0.001528"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.353785" elapsed="0.002467"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:18.356411" elapsed="0.000757"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:18.357979" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.357424" elapsed="0.000582"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:18.358203" elapsed="0.002747"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:18.338236" elapsed="0.022806"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.361241" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:18.361113" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.361095" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:18.379055" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:18.361455" elapsed="0.017636"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:18.379311" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:52:18.379504" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:18.321220" elapsed="0.058312"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:18.379623" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:18.379782" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:52:18.320486" elapsed="0.059323"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.381250" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782338, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.380469" elapsed="0.000812"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:18.381331" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:52:18.381605" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782338, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:18.380075" elapsed="0.001568"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:18.382040" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 97379, 'CommittedTransactionsCount': 2, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True,...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:18.381822" elapsed="0.000246"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:18.382434" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:18.382226" elapsed="0.000234"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:52:18.382507" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:18.382682" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:18.100244" elapsed="0.282464"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:52:18.382768" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:52:18.382920" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:18.099375" elapsed="0.283570"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.383265" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.383037" elapsed="0.000286"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:18.383571" elapsed="0.000201"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.383347" elapsed="0.000462"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.383985" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.383834" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.383016" elapsed="0.001045"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:18.099204" elapsed="0.284883"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.387010" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.386678" elapsed="0.000361"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:18.387089" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:52:18.387247" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:18.386304" elapsed="0.000969"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.470460" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.470044" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:18.471392" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:18.471130" elapsed="0.000338">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:18.471581" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:18.470778" elapsed="0.000829"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.472170" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:18.471778" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:52:18.472505" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:52:18.472673" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:52:18.472362" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.473113" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.472861" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.474225" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.473970" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.474726" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:52:18.474433" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.475086" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.475293" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.475470" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:52:18.474947" elapsed="0.000581"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.474806" elapsed="0.000770"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:52:18.475625" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:52:18.475846" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:52:18.473645" elapsed="0.002235"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.473240" elapsed="0.002677"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.476098" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.475943" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.473215" elapsed="0.002961"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.476814" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.476324" elapsed="0.000527"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:52:18.476907" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:52:18.469262" elapsed="0.007835"/>
</kw>
<msg time="2026-04-10T00:52:18.477173" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:18.454967" elapsed="0.022394"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.491816" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.506237" elapsed="0.000055"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.520167" elapsed="0.000056"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.520568" elapsed="0.000081"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.520897" elapsed="0.000077"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.521779" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.521525" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:18.521494" elapsed="0.000395"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.522159" elapsed="0.000035"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.522473" 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-04-10T00:52:18.522806" elapsed="0.000036"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:52:18.521424" elapsed="0.001466"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.521126" elapsed="0.001837"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.523286" elapsed="0.000078"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.523537" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:52:18.523756" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:52:18.443590" elapsed="0.080194"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:18.525915" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:18.525563" elapsed="0.000428">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:18.526145" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:18.524677" elapsed="0.001508"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.527647" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.526340" elapsed="0.001398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.528650" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.528085" elapsed="0.000613"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.527777" elapsed="0.000971"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.526320" elapsed="0.002464"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.532008" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:18.528992" elapsed="0.003058"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:52:18.532189" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:52:18.532464" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:18.524182" elapsed="0.008309"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:18.534842" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:18.534376" elapsed="0.000533">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:18.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-04-10T00:52:18.533573" elapsed="0.001527"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:52:18.535561" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-04-10T00:52:18.535249" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.535229" elapsed="0.000518"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.535949" elapsed="0.000077"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.536279" elapsed="0.000085"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.536491" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:52:18.551276" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:18.532934" elapsed="0.018371"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.553912" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.553265" elapsed="0.000785"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.555132" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.554289" elapsed="0.000976"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:18.587154" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:18.588107" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:52:18.588868" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:18.558503" elapsed="0.030470"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.555392" elapsed="0.033711"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.591586" elapsed="0.000087"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.589197" elapsed="0.002608"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.555372" elapsed="0.036515"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.600722" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.597490" elapsed="0.003553"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.596784" elapsed="0.004322"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.596710" elapsed="0.004447"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.604134" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.601697" elapsed="0.002484"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.601256" elapsed="0.002984"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.601225" elapsed="0.003063"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.605196" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.604659" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.605744" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.605353" elapsed="0.000474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.606402" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.606089" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.605875" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.605322" elapsed="0.001214"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.607407" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.606893" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.607885" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.607582" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.608521" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.608221" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.608010" elapsed="0.000626"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.607534" elapsed="0.001146"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:18.609009" elapsed="0.000528"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:18.610348" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.609910" elapsed="0.000483"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:18.610743" elapsed="0.002616"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:18.593824" elapsed="0.019655"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.613864" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:18.613663" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.613643" elapsed="0.000384"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:18.626815" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:18.614222" elapsed="0.012638"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:18.627002" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:52:18.627251" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:18.551695" elapsed="0.075584"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:18.627345" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:52:18.627498" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:52:18.396943" elapsed="0.230582"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.627873" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.627627" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.627609" elapsed="0.000411"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:18.628054" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:52:18.392109" elapsed="0.236074"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.387342" elapsed="0.240885"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.387325" elapsed="0.240926"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:52:18.628892" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:18.628785" elapsed="0.000167"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.629013" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:18.628976" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.628768" elapsed="0.000306"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.629222" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:52:18.629339" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:52:18.628483" elapsed="0.000881"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.629946" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.629572" elapsed="0.000400"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.630602" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.630128" elapsed="0.000501"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.636306" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.635942" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.636952" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.636666" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:18.648671" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:18.648784" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":96378,"InMemoryJournalLogSize":1001,"ReplicatedToAllIndex":96378,"Leader":"member-1-shard-inventory-config","LastIndex":97379,"RaftState":"Follower","LastApplied":96379,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":97379,"LastLeadershipChangeTime":"2026-04-10 00:51:04.372","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"501.8 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":96379,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":976858},"timestamp":1775782338,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:18.648942" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:18.639240" elapsed="0.009728"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.637068" elapsed="0.011944"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.649192" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.649038" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.637050" elapsed="0.012226"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.657874" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":96378,"InMemoryJournalLogSize":1001,"ReplicatedToAllIndex":96378,"Leader":"member-1-shard-inventory-config","LastIndex":97379,"RaftState":"Follower","LastApplied":96379,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":97379,"LastLeadershipChangeTime":"2026-04-10 00:51:04.372","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"501.8 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":96379,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":976858},"timestamp":1775782338,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.651076" elapsed="0.007202"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.650366" elapsed="0.008005"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.650326" elapsed="0.008072"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.661516" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.658777" elapsed="0.002911"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.658457" elapsed="0.003322"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.658440" elapsed="0.003366"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.662539" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.661975" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.663309" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.662688" elapsed="0.000801"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.664777" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.664021" elapsed="0.000799"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.663516" elapsed="0.001407"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.662669" elapsed="0.002278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.665713" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.665112" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.666528" elapsed="0.000094"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.665915" elapsed="0.000815"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.668012" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.667251" elapsed="0.000803"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.666757" elapsed="0.001399"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.665896" elapsed="0.002284"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:18.668334" elapsed="0.000748"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:18.669917" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.669297" elapsed="0.000647"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:18.670139" elapsed="0.002741"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:18.649846" elapsed="0.023129"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.673160" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:18.673049" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.673029" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:18.691387" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:18.673377" elapsed="0.018052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:18.691507" elapsed="0.000064"/>
</return>
<msg time="2026-04-10T00:52:18.691726" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:18.631525" elapsed="0.060228"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:18.691883" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:18.692044" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:52:18.630844" elapsed="0.061227"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.693357" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782338, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.692847" elapsed="0.000540"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:18.693438" elapsed="0.000080"/>
</return>
<msg time="2026-04-10T00:52:18.693980" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782338, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:18.692391" elapsed="0.001617"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:18.694383" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 96379, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInit...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:18.694171" elapsed="0.000240"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:18.694794" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:18.694586" elapsed="0.000235"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:52:18.694869" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:18.695029" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:18.385677" elapsed="0.309378"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:52:18.695116" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:18.695274" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:18.384457" elapsed="0.310842"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:18.695639" elapsed="0.000204"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.695394" elapsed="0.000488"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.696055" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.695906" elapsed="0.000246"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.696344" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.696176" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.695374" elapsed="0.001048"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:52:18.384265" elapsed="0.312181"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.699136" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.698824" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:18.699210" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:18.699359" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:18.698226" elapsed="0.001158"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.776046" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.775635" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:18.776877" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:18.776611" elapsed="0.000346">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:18.777128" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:18.776255" elapsed="0.000899"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.777748" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:18.777323" elapsed="0.000453"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:52:18.778083" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:52:18.778235" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:52:18.777941" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.778690" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.778420" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.779726" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.779449" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.780206" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:52:18.779938" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.780589" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.780799" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.780977" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:52:18.780428" elapsed="0.000607"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.780286" elapsed="0.000780"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:52:18.781113" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:52:18.781283" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:52:18.779123" elapsed="0.002186"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.778816" elapsed="0.002525"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.781561" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.781366" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.778793" elapsed="0.002850"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.782232" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.781791" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:52:18.782309" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:52:18.774912" elapsed="0.007566"/>
</kw>
<msg time="2026-04-10T00:52:18.782570" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:18.760824" elapsed="0.021892"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.796720" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.810984" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.826120" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.826518" elapsed="0.000094"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.826860" elapsed="0.000076"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.827735" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.827480" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:18.827447" elapsed="0.000409"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.828160" elapsed="0.000040"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.828514" elapsed="0.000054"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.828845" elapsed="0.000037"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:52:18.827372" elapsed="0.001560"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.827090" elapsed="0.001919"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.829338" elapsed="0.000079"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.829661" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:52:18.829878" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:52:18.749918" elapsed="0.079989"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:18.832160" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:18.831781" elapsed="0.000457">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:18.832410" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:18.830828" elapsed="0.001624"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.833952" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.832629" elapsed="0.001417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.834935" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.834397" elapsed="0.000587"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.834086" elapsed="0.000949"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.832608" elapsed="0.002463"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.838249" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:18.835280" elapsed="0.003011"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:52:18.838431" elapsed="0.000215"/>
</return>
<msg time="2026-04-10T00:52:18.838856" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:18.830316" elapsed="0.008566"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:18.841168" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:18.840802" elapsed="0.000446">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:18.841497" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:18.839942" elapsed="0.001660"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:52:18.842127" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-10T00:52:18.841807" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.841783" elapsed="0.000539"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.842530" elapsed="0.000095"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.842878" elapsed="0.000079"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.843080" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:52:18.858263" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:18.839246" elapsed="0.019046"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.861213" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.860598" elapsed="0.000751"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.862230" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.861640" elapsed="0.000721"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:18.896003" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:18.896701" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:52:18.897160" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:18.865673" elapsed="0.031554"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.862487" elapsed="0.034829"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.898854" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.897376" elapsed="0.001614"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.862467" elapsed="0.036574"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.906378" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.902439" elapsed="0.004359"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.902018" elapsed="0.004843"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.901971" elapsed="0.004940"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.909703" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.907305" elapsed="0.002445"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.907009" elapsed="0.002800"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.906979" elapsed="0.002879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.910853" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.910215" elapsed="0.000684"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.911316" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.911008" elapsed="0.000388"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.911984" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.911675" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.911444" elapsed="0.000626"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.910977" elapsed="0.001138"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.912976" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.912452" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.913432" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.913130" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.914133" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.913830" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.913575" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.913099" elapsed="0.001165"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:18.914609" elapsed="0.000443"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:18.915883" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.915397" elapsed="0.000532"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:18.916260" elapsed="0.004082"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:18.900246" elapsed="0.020177"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.920811" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:18.920608" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.920587" elapsed="0.000386"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:18.931496" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:18.921169" elapsed="0.010402"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:18.931715" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:52:18.931969" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:18.858729" elapsed="0.073268"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:18.932063" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:18.932216" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:52:18.708122" elapsed="0.224120"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.932621" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:18.932344" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.932324" elapsed="0.000448"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:18.932806" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:52:18.703782" elapsed="0.229152"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.699656" elapsed="0.233321"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.699436" elapsed="0.233566"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:52:18.933659" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:52:18.933510" elapsed="0.000213"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:52:18.933786" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:18.933746" elapsed="0.000080"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.933492" elapsed="0.000357"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:18.934001" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:52:18.934125" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:52:18.933233" elapsed="0.000917"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.934728" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:18.934324" elapsed="0.000431"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.935383" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:18.934914" elapsed="0.000501"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.941417" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.941142" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:18.941929" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:18.941657" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:19.011282" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:19.011620" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":97379,"InMemoryJournalLogSize":1176,"ReplicatedToAllIndex":97379,"Leader":"member-1-shard-inventory-config","LastIndex":98555,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":97555,"LastLogIndex":98555,"LastLeadershipChangeTime":"2026-04-10 00:50:15.798","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"56.49 ms","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":97555,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":1021546},"timestamp":1775782339,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:19.012029" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:18.944104" elapsed="0.067992"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:18.942040" elapsed="0.070173"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.012800" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.012306" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:18.942022" elapsed="0.070990"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.023141" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":97379,"InMemoryJournalLogSize":1176,"ReplicatedToAllIndex":97379,"Leader":"member-1-shard-inventory-config","LastIndex":98555,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":97555,"LastLogIndex":98555,"LastLeadershipChangeTime":"2026-04-10 00:50:15.798","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"56.49 ms","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":97555,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":1021546},"timestamp":1775782339,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:19.016448" elapsed="0.006931"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:19.015656" elapsed="0.008063"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.015534" elapsed="0.008219"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.027183" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:19.024203" elapsed="0.003126"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:19.023833" elapsed="0.003597"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.023809" elapsed="0.003651"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.028354" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:19.027735" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.029160" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.028496" elapsed="0.000855"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.030735" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:19.029932" elapsed="0.000849"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:19.029378" elapsed="0.001507"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.028475" elapsed="0.002437"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.031738" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:19.031088" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.032539" elapsed="0.000100"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.031877" elapsed="0.000868"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.034103" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:19.033266" elapsed="0.000880"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:19.032774" elapsed="0.001476"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.031857" elapsed="0.002420"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:19.034454" elapsed="0.000812"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:19.036191" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:19.035493" elapsed="0.000725"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.036420" elapsed="0.002988"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:19.014370" elapsed="0.025152"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.039874" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.039748" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.039723" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:19.058184" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:19.040114" elapsed="0.018114"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:19.058312" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:52:19.058519" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:18.936390" elapsed="0.122174"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:19.058706" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:19.058868" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:52:18.935666" elapsed="0.123229"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.060565" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782339, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:19.060020" elapsed="0.000576"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:19.060647" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:19.060823" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782339, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:19.059196" elapsed="0.001654"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:19.061217" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 97555, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInit...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.061011" elapsed="0.000234"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:19.061628" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.061405" elapsed="0.000250"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:52:19.061703" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:52:19.061887" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:18.697619" elapsed="0.364293"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:52:19.061972" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:52:19.062121" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:18.696814" elapsed="0.365331"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.062467" elapsed="0.000225"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:19.062238" elapsed="0.000493"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.062906" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.062756" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.063133" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.062985" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.062217" elapsed="0.000991"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:52:18.696639" elapsed="0.366594"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:18.098997" elapsed="0.964269"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:52:19.063311" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:19.063519" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:52:19.063762" level="INFO">${follower_list} = [2, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:52:18.094818" elapsed="0.968970"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.064268" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:52:19.064367" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:52:19.063969" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.064708" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.064464" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.064446" elapsed="0.000343"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.067307" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:52:19.064929" elapsed="0.002430"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:52:19.067986" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.067782" elapsed="0.000231"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:52:19.068065" elapsed="0.000034"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:52:18.092014" elapsed="0.976220"/>
</kw>
<msg time="2026-04-10T00:52:19.068356" level="INFO">${inv_conf_leader} = 1</msg>
<msg time="2026-04-10T00:52:19.068407" level="INFO">${inv_conf_followers_list} = [2, 3]</msg>
<var>${inv_conf_leader}</var>
<var>${inv_conf_followers_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Get_Leader_And_Followers_For_Shard</arg>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:52:18.091392" elapsed="0.977041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.068982" level="INFO">config inventory Leader is 1 and followers are [2, 3]</msg>
<arg>config inventory Leader is ${inv_conf_leader} and followers are ${inv_conf_followers_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:19.068676" elapsed="0.000351"/>
</kw>
<return>
<value>${inv_conf_leader}</value>
<value>${inv_conf_followers_list}</value>
<status status="PASS" start="2026-04-10T00:52:19.069072" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:19.069284" level="INFO">${inventory_leader} = 1</msg>
<msg time="2026-04-10T00:52:19.069331" level="INFO">${inventory_followers} = [2, 3]</msg>
<var>${inventory_leader}</var>
<var>${inventory_followers}</var>
<doc>Check Status for Inventory Config shard in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:52:18.088781" elapsed="0.980574"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.069861" level="INFO">${Active_Nodes} = []</msg>
<var>${Active_Nodes}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:19.069539" elapsed="0.000349"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:52:19.070255" level="INFO">${Follower_Node_1} = 2</msg>
<var>${Follower_Node_1}</var>
<arg>${Inventory_Followers}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.070066" elapsed="0.000221"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:52:19.070669" level="INFO">${Follower_Node_2} = 3</msg>
<var>${Follower_Node_2}</var>
<arg>${Inventory_Followers}</arg>
<arg>1</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.070465" elapsed="0.000230"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${Active_Nodes}</arg>
<arg>${inventory_leader}</arg>
<arg>${Follower_Node_1}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.070869" elapsed="0.000225"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.071636" level="INFO">${Active_Nodes} = [1, 2]</msg>
<arg>${Active_Nodes}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:52:19.071290" elapsed="0.000390"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.072152" level="INFO">${Inventory_Leader_List} = [1]</msg>
<var>${Inventory_Leader_List}</var>
<arg>${inventory_leader}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:19.071854" elapsed="0.000324"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.072673" level="INFO">${Inventory_Follower_Node1_List} = [2]</msg>
<var>${Inventory_Follower_Node1_List}</var>
<arg>${Follower_Node_1}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:19.072356" elapsed="0.000343"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.073195" level="INFO">${Follower_Node_1} = 2</msg>
<arg>${Follower_Node_1}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:52:19.072887" elapsed="0.000350"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.073778" level="INFO">${Follower_Node_2} = 3</msg>
<arg>${Follower_Node_2}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:52:19.073424" elapsed="0.000402"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.074310" level="INFO">${Inventory_Leader} = 1</msg>
<arg>${Inventory_Leader}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:52:19.074009" elapsed="0.000342"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.074891" level="INFO">${Inventory_Leader_List} = [1]</msg>
<arg>${Inventory_Leader_List}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:52:19.074573" elapsed="0.000360"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.075432" level="INFO">${Inventory_Follower_Node1_List} = [2]</msg>
<arg>${Inventory_Follower_Node1_List}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:52:19.075116" elapsed="0.000358"/>
</kw>
<doc>Find a follower in the inventory config shard</doc>
<status status="PASS" start="2026-04-10T00:52:17.647114" elapsed="1.428495"/>
</test>
<test id="s1-s2-t18" name="Shutdown Follower From Cluster Node" line="173">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:52:19.079794" elapsed="0.000248"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:52:19.079473" 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-04-10T00:52:19.081264" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.081126" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.081103" elapsed="0.000238"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.086783" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.086653" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.086630" elapsed="0.000229"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.087965" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:19.087513" elapsed="0.000580"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.088595" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:19.088262" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:19.088669" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:52:19.088835" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:19.087121" elapsed="0.001739"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.094974" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.094840" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.094817" elapsed="0.000241"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.096436" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.096326" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.096308" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:19.097009" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.096686" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.097427" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:19.097204" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.128750" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:19.098017" elapsed="0.030998"/>
</kw>
<msg time="2026-04-10T00:52:19.129262" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:19.129312" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.097638" elapsed="0.031712"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.194699" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "h "u "t "d "o "w "n "[78C[C "[A[78CF
 "o "l "l "o "w "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:19.130136" elapsed="0.064830"/>
</kw>
<msg time="2026-04-10T00:52:19.195200" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:19.195257" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.129649" elapsed="0.065647"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.195767" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.195414" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.195380" elapsed="0.000508"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.196428" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "h "u "t "d "o "w "n "[78C[C "[A[78CF
 "o "l "l "o "w "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:19.196047" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.196833" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.196610" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.196591" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:19.196951" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:19.198521" 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-04-10T00:52:19.199637" elapsed="0.000478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:19.200473" 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-04-10T00:52:19.197876" elapsed="0.003093"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:19.197264" elapsed="0.003770"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:19.096015" elapsed="0.105121"/>
</kw>
<msg time="2026-04-10T00:52:19.201250" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:19.201296" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.095249" elapsed="0.106087"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:19.201525" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T00:52:19.201416" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.201397" elapsed="0.000230"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.202084" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.202430" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.202502" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:19.094396" elapsed="0.108235"/>
</kw>
<msg time="2026-04-10T00:52:19.202730" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:19.202776" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.089250" elapsed="0.113563"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.203143" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.202892" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.202874" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:19.089104" elapsed="0.114141"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.209258" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.209151" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.209132" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.210514" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.210407" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.210390" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:19.211054" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.210756" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.211458" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:19.211243" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.252375" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:19.212006" elapsed="0.040631"/>
</kw>
<msg time="2026-04-10T00:52:19.252877" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:19.252926" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.211664" elapsed="0.041301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.330541" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "h "u "t "d "o "w "n "[78C[C "[A[78CF
 "o "l "l "o "w "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:19.253696" elapsed="0.077115"/>
</kw>
<msg time="2026-04-10T00:52:19.331047" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:19.331193" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.253229" elapsed="0.078005"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.331701" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.331351" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.331317" elapsed="0.000472"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.332332" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "h "u "t "d "o "w "n "[78C[C "[A[78CF
 "o "l "l "o "w "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:19.331940" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.332734" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.332492" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.332473" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:19.332852" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:19.334467" elapsed="0.000790"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.335557" elapsed="0.000536"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:19.336366" elapsed="0.000386"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:19.333780" elapsed="0.003074"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:19.333179" elapsed="0.003739"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:19.210105" elapsed="0.126917"/>
</kw>
<msg time="2026-04-10T00:52:19.337121" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:19.337166" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.209479" elapsed="0.127724"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:19.337392" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:19.337282" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.337264" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.337904" elapsed="0.000046"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.338272" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.338349" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:19.208803" elapsed="0.129658"/>
</kw>
<msg time="2026-04-10T00:52:19.338574" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:19.338621" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.203521" elapsed="0.135138"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.338992" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.338738" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.338720" elapsed="0.000349"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:52:19.203377" elapsed="0.135716"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.345024" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.344914" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.344895" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.346311" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.346201" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.346183" elapsed="0.000245"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:19.346912" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.346606" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.347319" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:19.347102" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.382270" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:19.347868" elapsed="0.034551"/>
</kw>
<msg time="2026-04-10T00:52:19.382628" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:19.382677" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.347507" elapsed="0.035208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.450735" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "h "u "t "d "o "w "n "[78C[C "[A[78CF
 "o "l "l "o "w "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:19.383312" elapsed="0.067652"/>
</kw>
<msg time="2026-04-10T00:52:19.451185" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:19.451235" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.382924" elapsed="0.068349"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.451728" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.451388" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.451355" elapsed="0.000460"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.452336" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "h "u "t "d "o "w "n "[78C[C "[A[78CF
 "o "l "l "o "w "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:19.451965" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.452734" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.452494" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.452475" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:19.452850" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:19.454465" elapsed="0.000798"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.455561" elapsed="0.000546"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:19.456378" 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-04-10T00:52:19.453754" elapsed="0.003121"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:19.453167" elapsed="0.003772"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:19.345873" elapsed="0.111169"/>
</kw>
<msg time="2026-04-10T00:52:19.457139" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:19.457184" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.345251" elapsed="0.111969"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:19.457416" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:19.457306" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.457284" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.457922" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.458367" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.458441" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:19.344436" elapsed="0.114133"/>
</kw>
<msg time="2026-04-10T00:52:19.458670" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:19.458716" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.339370" elapsed="0.119382"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.459085" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.458831" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.458813" elapsed="0.000351"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:52:19.339224" elapsed="0.119965"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:19.088921" elapsed="0.370301"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:52:19.086181" elapsed="0.373102"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:52:19.080810" elapsed="0.378534"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.080263" elapsed="0.379128"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:52:19.077009" elapsed="0.382439"/>
</kw>
<kw name="Kill_Single_Member" owner="ClusterManagement">
<kw name="ClusterManagement__Build_List" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.463060" level="INFO">${member_int} = 3</msg>
<var>${member_int}</var>
<arg>${member}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:52:19.462742" elapsed="0.000345"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.463538" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>${member_int}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:19.463246" elapsed="0.000338"/>
</kw>
<return>
<value>${index_list}</value>
<status status="PASS" start="2026-04-10T00:52:19.463630" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:19.463785" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>${member}</arg>
<status status="PASS" start="2026-04-10T00:52:19.462400" elapsed="0.001409"/>
</kw>
<kw name="Return_Member_IP" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.464777" level="INFO">${member_int} = 3</msg>
<var>${member_int}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:52:19.464321" elapsed="0.000483"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:19.465228" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_int}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.464961" elapsed="0.000292"/>
</kw>
<return>
<value>${member_ip}</value>
<status status="PASS" start="2026-04-10T00:52:19.465302" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:19.465453" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>${member}</arg>
<doc>Return the IP address of the member given the member_index.</doc>
<status status="PASS" start="2026-04-10T00:52:19.464001" elapsed="0.001476"/>
</kw>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.472710" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.472598" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.472579" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.473792" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:19.473390" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.474307" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:19.473980" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:19.474378" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:19.474531" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:19.473009" elapsed="0.001562"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.480320" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.480212" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.480193" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.481582" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.481460" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.481443" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:19.482012" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.481797" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.482424" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:19.482244" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.511696" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "1 ". "1 "5 "1 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:19.482962" elapsed="0.028814"/>
</kw>
<msg time="2026-04-10T00:52:19.511879" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:19.511924" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.482626" elapsed="0.029333"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.515170" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:19.512500" elapsed="0.002731"/>
</kw>
<msg time="2026-04-10T00:52:19.515335" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:19.515379" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.512135" elapsed="0.003276"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.515744" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.515501" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.515481" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.516222" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:19.515967" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.516569" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.516336" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.516319" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:19.516682" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:19.517865" 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-04-10T00:52:19.518425" elapsed="0.000184"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:19.518759" elapsed="0.000099"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:19.517481" elapsed="0.001428"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:19.516954" elapsed="0.002001"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:19.481074" elapsed="0.037977"/>
</kw>
<msg time="2026-04-10T00:52:19.519144" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:19.519187" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.480559" elapsed="0.038655"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:19.519395" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:52:19.519289" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.519272" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.519886" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.520216" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.520324" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:19.479870" elapsed="0.040566"/>
</kw>
<msg time="2026-04-10T00:52:19.520530" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:19.520592" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.474947" elapsed="0.045674"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.520950" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.520699" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.520682" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:19.474802" elapsed="0.046249"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.526833" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.526725" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.526707" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.527983" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.527879" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.527862" elapsed="0.000187"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:19.528405" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.528192" elapsed="0.000239"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.528773" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:19.528603" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.571539" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "1 ". "1 "5 "1 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:19.529286" elapsed="0.042352"/>
</kw>
<msg time="2026-04-10T00:52:19.571742" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:19.571788" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.528954" elapsed="0.042869"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.575592" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:19.572340" elapsed="0.003311"/>
</kw>
<msg time="2026-04-10T00:52:19.575748" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:19.575792" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.571998" elapsed="0.003820"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.576113" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.575893" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.575874" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.576597" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:19.576332" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.576929" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.576713" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.576696" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:19.577040" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:19.578205" elapsed="0.000381"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.578754" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:19.579053" elapsed="0.000097"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:19.577816" elapsed="0.001384"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:19.577302" elapsed="0.001986"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:19.527581" elapsed="0.051807"/>
</kw>
<msg time="2026-04-10T00:52:19.579479" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:19.579523" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.527055" elapsed="0.052512"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:19.579754" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:19.579647" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.579629" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.580224" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.580573" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.580647" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:19.526363" elapsed="0.054392"/>
</kw>
<msg time="2026-04-10T00:52:19.580848" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:19.580892" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.521319" elapsed="0.059599"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.581240" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.580993" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.580976" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:52:19.521178" elapsed="0.060162"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.586984" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.586876" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.586858" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.588131" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:19.588026" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.588009" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:19.588571" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.588342" elapsed="0.000257"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.588926" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:19.588756" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.619388" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "1 ". "1 "5 "1 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:19.589443" elapsed="0.030025"/>
</kw>
<msg time="2026-04-10T00:52:19.619592" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:19.619641" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.589109" elapsed="0.030567"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.622413" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:19.620196" elapsed="0.002276"/>
</kw>
<msg time="2026-04-10T00:52:19.622584" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:19.622628" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.619851" elapsed="0.002804"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.622953" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.622730" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.622712" elapsed="0.000361"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.623474" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:19.623218" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.623826" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.623606" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.623587" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:19.623936" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:19.625068" 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-04-10T00:52:19.625605" elapsed="0.000149"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:19.625904" elapsed="0.000097"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:19.624708" elapsed="0.001343"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:19.624196" elapsed="0.001900"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:19.587729" elapsed="0.038481"/>
</kw>
<msg time="2026-04-10T00:52:19.626302" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:19.626345" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.587205" elapsed="0.039167"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:19.626570" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:52:19.626447" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.626429" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.627045" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.627380" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:19.627450" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:19.586524" elapsed="0.041050"/>
</kw>
<msg time="2026-04-10T00:52:19.627668" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:19.627710" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:19.581616" elapsed="0.046121"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.628062" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.627813" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.627796" elapsed="0.000342"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:52:19.581460" elapsed="0.046701"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:19.474629" elapsed="0.153562"/>
</for>
<arg>Killing ODL${member} ${member_ip}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:52:19.470422" elapsed="0.157825"/>
</kw>
<kw name="Kill_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.629828" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:19.629439" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.630335" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:19.630014" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:19.630404" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:19.630578" level="INFO">${kill_index_list} = [3]</msg>
<var>${kill_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:19.629069" elapsed="0.001535"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.631818" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:19.631419" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.632311" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:19.632007" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:19.632382" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:19.632536" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${original_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:19.630847" elapsed="0.001730"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.634016" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:19.633648" elapsed="0.000395"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.634515" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:19.634219" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:19.634602" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:19.634755" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:19.633265" elapsed="0.001514"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:19.635806" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.635527" elapsed="0.000305"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.636624" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:19.636451" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:19.639929" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:19.639223" elapsed="0.000874"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:19.639205" elapsed="0.000919"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.640401" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:19.640275" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.641724" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:19.640770" elapsed="0.001017"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.642721" level="INFO">${conn_id} = 173</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:19.641960" elapsed="0.000788"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:52:19.644424" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:52:19.644707" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:52:19.643887" elapsed="0.000924"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:19.645107" elapsed="0.000615"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:52:19.647033" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:52:20.253079" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:52:19 UTC 2026

  System load:  0.99               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:51:17 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:52:19.646714" elapsed="0.606621"/>
</kw>
<msg time="2026-04-10T00:52:20.253484" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:19.646023" elapsed="0.607620"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:52:19.643012" elapsed="0.610849"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:52:20.254536" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh'.</msg>
<msg time="2026-04-10T00:52:20.280295" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:52:20.280833" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:52:20.280946" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:52:20.254158" elapsed="0.026842"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:20.281832" elapsed="0.000559"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:20.284296" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:20.282992" elapsed="0.001406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:52:20.285368" elapsed="0.000065"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:20.284904" elapsed="0.000961"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:20.284845" elapsed="0.001083"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:52:20.286457" elapsed="0.000071"/>
</return>
<status status="PASS" start="2026-04-10T00:52:20.286059" elapsed="0.000780"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:20.286022" elapsed="0.000892"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:52:20.287000" elapsed="0.000036"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:20.294589" elapsed="0.001307"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:20.296251" elapsed="0.000527"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:20.297118" elapsed="0.000285"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:20.287792" elapsed="0.009799"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:52:19.638626" elapsed="0.659078"/>
</kw>
<msg time="2026-04-10T00:52:20.297762" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:19.637943" elapsed="0.659880"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:52:19.637406" elapsed="0.660500"/>
</kw>
<msg time="2026-04-10T00:52:20.297947" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:19.636906" elapsed="0.661087"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:20.302636" elapsed="0.000369"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:20.303181" elapsed="0.000195"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:20.303584" elapsed="0.000111"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:20.298312" elapsed="0.005437"/>
</kw>
<msg time="2026-04-10T00:52:20.303843" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:52:19.636048" elapsed="0.667820"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:20.304339" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:20.304059" elapsed="0.000324"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:52:20.304430" elapsed="0.000033"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:52:19.635133" elapsed="0.669536"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:52:19.634960" elapsed="0.669748"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:19.634832" elapsed="0.669911"/>
</for>
<arg>command=${NODE_KILL_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:52:19.632786" elapsed="0.672011"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:20.305405" level="INFO">${updated_index_list} = [1, 2, 3]</msg>
<var>${updated_index_list}</var>
<arg>@{index_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:20.305060" elapsed="0.000388"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{kill_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:20.305684" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:20.306169" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:20.306044" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:20.306022" elapsed="0.000234"/>
</if>
<kw name="Sleep" owner="BuiltIn">
<msg time="2026-04-10T00:52:21.307027" level="INFO">Slept 1 second.</msg>
<msg time="2026-04-10T00:52:21.307174" level="INFO">Kill -9 closes open files, which may take longer than ssh overhead, but not long enough to warrant WUKS.</msg>
<arg>1s</arg>
<arg>Kill -9 closes open files, which may take longer than ssh overhead, but not long enough to warrant WUKS.</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="PASS" start="2026-04-10T00:52:20.306428" elapsed="1.000914"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Verify_Karaf_Is_Not_Running_On_Member" owner="ClusterManagement">
<kw name="Count_Running_Karafs_On_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:21.311072" level="INFO">${command} = ps axf | grep org.apache.karaf | grep -v grep | wc -l</msg>
<var>${command}</var>
<arg>${NODE_KARAF_COUNT_COMMAND}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:21.310290" elapsed="0.000846"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:21.313406" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:21.312829" elapsed="0.000614"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:21.314603" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:21.314364" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:21.320258" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:21.319300" elapsed="0.001094"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:21.319201" elapsed="0.001293"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:21.321457" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:21.320899" elapsed="0.001132"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:21.323397" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:21.322410" elapsed="0.001304"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:21.325166" level="INFO">${conn_id} = 176</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:21.324101" elapsed="0.001167"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:52:21.326892" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:52:21.326972" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:52:21.326483" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:21.327208" elapsed="0.000373"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:52:21.328493" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:52:21.643760" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:52:19 UTC 2026

  System load:  0.99               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:52:20 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:52:21.328166" elapsed="0.315801"/>
</kw>
<msg time="2026-04-10T00:52:21.644146" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:21.327800" elapsed="0.316437"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:52:21.325656" elapsed="0.318847"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:52:21.645400" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-04-10T00:52:21.658890" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:52:21.659743" level="INFO">${stdout} = 0</msg>
<msg time="2026-04-10T00:52:21.660165" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:52:21.644916" elapsed="0.015488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:21.661131" elapsed="0.001289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:21.665229" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:21.663942" elapsed="0.001815"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:52:21.666948" elapsed="0.000091"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:21.666140" elapsed="0.001024"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:21.666029" elapsed="0.001297"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:52:21.668372" elapsed="0.000157"/>
</return>
<status status="PASS" start="2026-04-10T00:52:21.667719" elapsed="0.001073"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:21.667620" elapsed="0.001363"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:52:21.669212" elapsed="0.000040"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:21.674971" elapsed="0.000422"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:21.675707" elapsed="0.000235"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:21.676207" elapsed="0.000173"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:21.670807" elapsed="0.005655"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:52:21.317508" elapsed="0.359300"/>
</kw>
<msg time="2026-04-10T00:52:21.676956" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:21.316539" elapsed="0.360496"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:52:21.315793" elapsed="0.361359"/>
</kw>
<msg time="2026-04-10T00:52:21.677204" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:21.315014" elapsed="0.362240"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:21.680812" elapsed="0.000327"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:21.681327" elapsed="0.000155"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:21.681656" 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-04-10T00:52:21.677604" elapsed="0.004206"/>
</kw>
<msg time="2026-04-10T00:52:21.681907" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:52:21.313778" elapsed="0.368154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:21.682397" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:21.682120" elapsed="0.000323"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:52:21.682486" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:52:21.682664" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>command=${command}</arg>
<arg>member_index=${member_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:52:21.311664" elapsed="0.371025"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-04-10T00:52:21.682737" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:21.682885" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>member_index=${member_index}</arg>
<doc>Remotely execute grep for karaf process, return count as string.</doc>
<status status="PASS" start="2026-04-10T00:52:21.309428" elapsed="0.373481"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>0</arg>
<arg>${count}</arg>
<arg>Found running Karaf count: ${count}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-04-10T00:52:21.683068" elapsed="0.000505"/>
</kw>
<arg>member_index=${index}</arg>
<doc>Fail if non-zero karaf instances are counted on member of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:21.308440" elapsed="0.375202"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:52:21.307980" elapsed="0.375695"/>
</iter>
<var>${index}</var>
<value>@{kill_index_list}</value>
<status status="PASS" start="2026-04-10T00:52:21.307519" elapsed="0.376193"/>
</for>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:21.687130" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:21.686711" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:21.687743" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:21.687353" elapsed="0.000418"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:21.687841" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:52:21.688009" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:21.686302" elapsed="0.001733"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:21.689155" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:21.688884" elapsed="0.000298"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:21.690039" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:21.689899" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:21.693992" elapsed="0.000087"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:21.693093" elapsed="0.001087"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:21.693072" elapsed="0.001138"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:21.694597" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:21.694394" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:21.696153" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:21.694988" elapsed="0.001249"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:21.697311" level="INFO">${conn_id} = 179</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:21.696447" elapsed="0.000892"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:52:21.699620" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:52:21.699898" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:52:21.698909" elapsed="0.001090"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:21.700338" elapsed="0.000710"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:52:21.702473" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:52:22.324810" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:52:21 UTC 2026

  System load:  0.93               Processes:             124
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:51:15 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:52:21.702136" elapsed="0.622857"/>
</kw>
<msg time="2026-04-10T00:52:22.325267" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:21.701396" elapsed="0.623990"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:52:21.697676" elapsed="0.627908"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:52:22.326263" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:52:22.339316" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:52:22.339515" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:52:22.339609" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:52:22.325879" elapsed="0.013765"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:22.340003" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:22.341525" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:22.340686" elapsed="0.000975"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:52:22.342127" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:22.341831" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:22.341790" elapsed="0.000537"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:52:22.342679" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:52:22.342405" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:22.342383" elapsed="0.000544"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:52:22.342978" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:22.347602" elapsed="0.001143"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:22.349240" elapsed="0.000660"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:22.350324" elapsed="0.000406"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:22.343441" elapsed="0.007502"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:52:21.692417" elapsed="0.658665"/>
</kw>
<msg time="2026-04-10T00:52:22.351159" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:21.691462" elapsed="0.659773"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:52:21.690900" elapsed="0.660449"/>
</kw>
<msg time="2026-04-10T00:52:22.351416" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:21.690325" elapsed="0.661174"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:22.355111" elapsed="0.000320"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:22.355620" elapsed="0.000162"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:22.355976" elapsed="0.000104"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:22.352039" elapsed="0.004096"/>
</kw>
<msg time="2026-04-10T00:52:22.356229" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:52:21.689444" elapsed="0.666810"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:22.356749" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:22.356443" elapsed="0.000348"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:52:22.356838" 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-04-10T00:52:21.688435" elapsed="0.668557"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:21.688226" elapsed="0.668805"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:22.358122" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:22.357796" elapsed="0.000354"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:22.359080" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:22.358919" elapsed="0.000319"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:22.362785" elapsed="0.000091"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:22.362041" elapsed="0.000933"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:22.362021" elapsed="0.000982"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:22.363290" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:22.363159" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:22.364757" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:22.363698" elapsed="0.001125"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:22.365799" level="INFO">${conn_id} = 182</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:22.365011" elapsed="0.000816"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:52:22.367525" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:52:22.367830" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:52:22.366964" elapsed="0.001021"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:22.368321" elapsed="0.000657"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:52:22.370326" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:52:23.011663" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:52:22 UTC 2026

  System load:  0.8                Processes:             125
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.169
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:51:16 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:52:22.369997" elapsed="0.641841"/>
</kw>
<msg time="2026-04-10T00:52:23.011997" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:22.369295" elapsed="0.642828"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:52:22.366138" elapsed="0.646217"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:52:23.013058" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:52:23.025576" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:52:23.025903" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:52:23.026000" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:52:23.012670" elapsed="0.013381"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:23.026653" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:23.028830" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:23.027599" elapsed="0.001374"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:52:23.029666" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:23.029228" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.029175" elapsed="0.000786"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:52:23.030425" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-04-10T00:52:23.030081" elapsed="0.000773"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.030046" elapsed="0.000875"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:52:23.031001" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:23.035474" elapsed="0.000720"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:23.036531" elapsed="0.000483"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:23.037305" elapsed="0.000283"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:23.031774" elapsed="0.005958"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:52:22.361386" elapsed="0.676446"/>
</kw>
<msg time="2026-04-10T00:52:23.037889" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:22.360689" elapsed="0.677259"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:52:22.360046" elapsed="0.677985"/>
</kw>
<msg time="2026-04-10T00:52:23.038072" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:22.359420" elapsed="0.678698"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:23.041085" elapsed="0.000318"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:23.041640" elapsed="0.000153"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:23.041944" elapsed="0.000098"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:23.038418" elapsed="0.003676"/>
</kw>
<msg time="2026-04-10T00:52:23.042192" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:52:22.358444" elapsed="0.683773"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:23.042691" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:23.042416" elapsed="0.000316"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:52:23.042776" elapsed="0.000031"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:52:22.357320" elapsed="0.685586"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:52:22.357132" elapsed="0.685813"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:23.043986" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:23.043703" elapsed="0.000310"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:23.044854" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:23.044712" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:23.048608" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:23.047856" elapsed="0.000927"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.047836" elapsed="0.000976"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:23.049099" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:23.048967" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:23.050506" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:23.049466" elapsed="0.001122"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:23.051504" level="INFO">${conn_id} = 185</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:23.050769" elapsed="0.000762"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:52:23.053169" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:52:23.053433" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:52:23.052626" elapsed="0.000907"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:23.053852" elapsed="0.000611"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:52:23.055788" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:52:23.411603" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:52:19 UTC 2026

  System load:  0.99               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:52:21 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:52:23.055442" elapsed="0.356320"/>
</kw>
<msg time="2026-04-10T00:52:23.411913" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:23.054790" elapsed="0.357233"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:52:23.051822" elapsed="0.360366"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:52:23.412891" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:52:23.425746" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:52:23.425964" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:52:23.426028" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:52:23.412499" elapsed="0.013562"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:23.426380" elapsed="0.000519"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:23.428667" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:23.427321" elapsed="0.001496"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:52:23.429500" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:23.429036" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.428983" elapsed="0.000872"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:52:23.430365" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-04-10T00:52:23.429994" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.429957" elapsed="0.000786"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:52:23.430823" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:23.436203" elapsed="0.001047"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:23.437647" elapsed="0.000447"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:23.438389" elapsed="0.000281"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:23.431664" elapsed="0.007150"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:52:23.047215" elapsed="0.391696"/>
</kw>
<msg time="2026-04-10T00:52:23.438969" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:23.046268" elapsed="0.392758"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:52:23.045732" elapsed="0.393375"/>
</kw>
<msg time="2026-04-10T00:52:23.439211" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:23.045140" elapsed="0.394120"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:23.442211" elapsed="0.000317"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:23.442769" elapsed="0.000149"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:23.443070" elapsed="0.000098"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:23.439577" elapsed="0.003645"/>
</kw>
<msg time="2026-04-10T00:52:23.443315" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:52:23.044278" elapsed="0.399063"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:23.443813" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:23.443536" elapsed="0.000319"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:52:23.443900" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:52:23.043238" elapsed="0.400790"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:52:23.043048" elapsed="0.401018"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:21.688092" elapsed="1.756010"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:52:21.683937" elapsed="1.760225"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-10T00:52:23.444203" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:52:23.444368" level="INFO">${updated_index_list} = [1, 2]</msg>
<var>${updated_index_list}</var>
<arg>${index_list}</arg>
<arg>${original_index_list}</arg>
<arg>${confirm}</arg>
<doc>If the list is empty, kill all ODL instances. Otherwise, kill members based on ${kill_index_list}
If ${confirm} is True, sleep 1 second and verify killed instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-04-10T00:52:19.628575" elapsed="3.815819"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-10T00:52:23.444485" elapsed="0.000027"/>
</return>
<arg>${Follower_Node_2}</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="PASS" start="2026-04-10T00:52:19.459721" elapsed="3.984911"/>
</kw>
<doc>Shutdown Follower Node2 and Start it Up.</doc>
<status status="PASS" start="2026-04-10T00:52:19.076438" elapsed="4.368316"/>
</test>
<test id="s1-s2-t19" name="Check Shards Status After Follower Shutdown" line="177">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:52:23.448356" elapsed="0.000268"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:52:23.448086" elapsed="0.000594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:23.449717" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:23.449599" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.449580" elapsed="0.000208"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:23.455310" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:23.455196" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.455177" elapsed="0.000202"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:23.456633" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:23.456067" elapsed="0.000596"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:23.457143" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:23.456829" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:23.457214" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:52:23.457375" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:23.455643" elapsed="0.001758"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:23.463295" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:23.463178" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.463159" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:23.464655" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:23.464501" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.464481" elapsed="0.000314"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:23.465333" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:23.464960" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:23.465799" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:23.465538" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:23.499943" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:23.466331" elapsed="0.033843"/>
</kw>
<msg time="2026-04-10T00:52:23.500413" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:23.500489" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:23.465988" elapsed="0.034550"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:23.573916" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "S "h "u "t "d "o "w "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:23.501375" elapsed="0.072832"/>
</kw>
<msg time="2026-04-10T00:52:23.574469" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:23.574529" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:23.500882" elapsed="0.073717"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:23.575090" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:23.574733" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.574694" elapsed="0.000487"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:23.575802" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "S "h "u "t "d "o "w "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:23.575332" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:23.576244" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:23.576013" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.575993" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:23.576363" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:23.578099" elapsed="0.000820"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:23.579210" elapsed="0.000547"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:23.580034" 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-04-10T00:52:23.577400" elapsed="0.003169"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:23.576784" elapsed="0.003859"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:23.464136" elapsed="0.116611"/>
</kw>
<msg time="2026-04-10T00:52:23.580845" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:23.580889" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:23.463517" elapsed="0.117410"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:23.581117" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:23.581007" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.580988" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:23.581715" 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-04-10T00:52:23.582163" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:23.582260" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:23.462831" elapsed="0.119569"/>
</kw>
<msg time="2026-04-10T00:52:23.582707" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:23.582754" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:23.457801" elapsed="0.124992"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:23.583132" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:23.582874" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.582856" elapsed="0.000354"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:23.457652" elapsed="0.125581"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:23.589673" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:23.589504" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.589477" elapsed="0.000288"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:23.591138" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:23.591027" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.591009" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:23.591704" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:23.591356" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:23.592222" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:23.591931" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:23.620953" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:23.592916" elapsed="0.028237"/>
</kw>
<msg time="2026-04-10T00:52:23.621388" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:23.621447" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:23.592459" elapsed="0.029027"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:23.708030" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "S "h "u "t "d "o "w "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:23.622208" elapsed="0.086164"/>
</kw>
<msg time="2026-04-10T00:52:23.708735" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:23.708801" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:23.621772" elapsed="0.087078"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:23.709463" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:23.709023" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.708968" elapsed="0.000643"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:23.710335" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "S "h "u "t "d "o "w "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:23.709821" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:23.710877" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:23.710584" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.710538" elapsed="0.000432"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:23.711097" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:23.712881" elapsed="0.000830"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:23.714000" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:23.714777" elapsed="0.000383"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:23.712097" elapsed="0.003167"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:23.711443" elapsed="0.003886"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:23.590677" elapsed="0.124756"/>
</kw>
<msg time="2026-04-10T00:52:23.715535" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:23.715605" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:23.590000" elapsed="0.125644"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:23.715842" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:52:23.715730" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.715709" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:23.716356" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:23.716750" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:23.716826" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:23.589113" elapsed="0.127827"/>
</kw>
<msg time="2026-04-10T00:52:23.717040" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:23.717085" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:23.583520" elapsed="0.133603"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:23.717454" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:23.717201" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.717184" elapsed="0.000348"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:52:23.583370" elapsed="0.134209"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:23.723664" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:23.723534" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.723513" elapsed="0.000223"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:23.725000" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:23.724876" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:23.724855" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:23.725539" level="INFO">${karaf_connection_index} = 92</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:23.725220" elapsed="0.000425"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:23.726033" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:23.725810" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:23.726885" level="FAIL">OSError: Socket is closed</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:52:23.726581" elapsed="0.000884">OSError: Socket is closed</status>
</kw>
<msg time="2026-04-10T00:52:23.727672" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:52:23.727718" level="INFO">${message_write} = OSError: Socket is closed</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:23.726220" elapsed="0.001521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:33.728940" level="FAIL">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:52:23.728250" elapsed="10.001572">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</status>
</kw>
<msg time="2026-04-10T00:52:33.730218" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:52:33.730271" level="INFO">${message_wait} = No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:23.727910" elapsed="10.002387"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.731587" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Follower Shutdown"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:52:33.730802" elapsed="0.000854">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Follower Shutdown"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:52:33.730429" elapsed="0.001304">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Follower Shutdown"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:52:33.730389" elapsed="0.001379">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Follower Shutdown"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.731938" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.732172" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:33.732028" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:33.732011" elapsed="0.000237"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:52:33.732293" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:33.733938" elapsed="0.000821"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:33.735045" elapsed="0.000551"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:33.735872" elapsed="0.000361"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:33.733253" elapsed="0.003085"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:33.732638" elapsed="0.003769"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:52:23.724500" elapsed="10.012007">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Follower Shutdown"</status>
</kw>
<msg time="2026-04-10T00:52:33.736637" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:52:33.736684" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Follower Shutdown"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:23.723898" elapsed="10.012811"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:33.736913" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:33.736796" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.736775" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:33.737858" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:33.737750" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.737731" elapsed="0.000194"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:33.738467" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:33.738085" elapsed="0.000558"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.739091" level="INFO">{1: 88, 2: 153, 3: 92}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:33.738802" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.739712" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:33.739294" elapsed="0.000464"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:33.740315" elapsed="0.000288"/>
</kw>
<msg time="2026-04-10T00:52:33.740704" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:33.740751" level="INFO">${old_connection_index} = 92</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:33.739928" elapsed="0.000846"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:33.741679" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:33.743033" level="FAIL">OSError: Socket is closed</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:52:33.742586" elapsed="0.001404">OSError: Socket is closed</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:33.742067" elapsed="0.002023"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:33.744748" elapsed="0.000358"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:33.744267" elapsed="0.000925"/>
</kw>
<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="PASS" start="2026-04-10T00:52:33.741144" elapsed="0.004095"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:33.740914" elapsed="0.004376"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.740894" elapsed="0.004421"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:33.746211" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:33.745897" elapsed="0.000341"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:52:33.746289" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:52:33.746449" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:33.745535" elapsed="0.000939"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:33.746667" elapsed="0.000423"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:33.747423" level="INFO">index=191
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:33.747264" elapsed="0.000328"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:52:33.747748" elapsed="0.002376"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:52:33.750586" level="INFO">Logging into '10.30.171.151:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:52:33.752718" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</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="FAIL" start="2026-04-10T00:52:33.750293" elapsed="0.002842">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:33.771083" elapsed="0.000605"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:33.771873" elapsed="0.000174"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:33.772199" elapsed="0.000101"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:33.754041" elapsed="0.018314"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:33.753446" elapsed="0.018959"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:52:33.737418" elapsed="0.035080">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.772895" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:33.772976" 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="FAIL" start="2026-04-10T00:52:23.723152" elapsed="10.049939">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<msg time="2026-04-10T00:52:33.773203" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:52:33.773248" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:23.717861" elapsed="10.055411"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.773721" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:33.773431" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.773411" elapsed="0.000389"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:52:23.717717" elapsed="10.056107"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:23.457459" elapsed="10.316398"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:52:23.454813" elapsed="10.319099"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:52:23.449276" elapsed="10.324692"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:23.448835" elapsed="10.325177"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:52:23.445807" elapsed="10.328256"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:33.795708" elapsed="0.000244"/>
</kw>
<msg time="2026-04-10T00:52:33.796011" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:33.795004" elapsed="0.001066"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:52:33.794518" elapsed="0.001630"/>
</kw>
<msg time="2026-04-10T00:52:33.796194" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:33.785401" elapsed="0.010837"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:52:33.784991" elapsed="0.011322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.796783" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:33.796508" elapsed="0.000320"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.802244" level="INFO">${return_list_reference} = [1, 2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:33.801858" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.802755" level="INFO">${return_list_copy} = [1, 2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:33.802435" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:33.802828" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:52:33.802988" level="INFO">${index_list} = [1, 2]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:33.801467" elapsed="0.001545"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:52:33.803171" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.803856" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:33.803502" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.804286" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:33.804045" elapsed="0.000267"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.804722" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:33.804462" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.807468" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:33.806947" elapsed="0.000550"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:33.807574" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:52:33.807732" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:33.806524" elapsed="0.001299"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.867473" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:33.867024" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:33.868335" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:33.868040" elapsed="0.000373">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:33.868508" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:33.867697" elapsed="0.000836"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.869107" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:33.868720" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:52:33.869442" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:52:33.869630" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:52:33.869298" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.870075" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:33.869823" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.871104" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:33.870849" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.871618" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:52:33.871311" 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-04-10T00:52:33.871985" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.872195" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.872373" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:52:33.871844" elapsed="0.000586"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:52:33.871698" elapsed="0.000764"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:52:33.872510" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:52:33.872696" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:52:33.870503" elapsed="0.002218"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:33.870198" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.872927" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:33.872778" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.870176" elapsed="0.002828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.873612" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:33.873151" elapsed="0.000489"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:52:33.873688" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:52:33.866388" elapsed="0.007425"/>
</kw>
<msg time="2026-04-10T00:52:33.873868" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:33.853377" elapsed="0.020543"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.887030" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.899800" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.912483" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.912701" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.912883" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.913258" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:33.913111" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:33.913096" 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-04-10T00:52:33.913481" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.913666" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.913836" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:52:33.913065" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:52:33.912961" elapsed="0.000955"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.914062" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:33.914138" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:33.914417" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:52:33.848829" elapsed="0.065623"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:33.916192" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:33.915936" elapsed="0.000325">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:33.916355" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:33.915587" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.916718" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:33.916449" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.917268" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:33.916974" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:33.916800" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.916432" elapsed="0.000960"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.919894" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:33.917559" elapsed="0.002362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:52:33.919972" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:33.920278" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:33.915091" elapsed="0.005221"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:33.921947" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:33.921703" elapsed="0.000308">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:33.922105" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:33.921349" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:52:33.922335" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:33.922200" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.922182" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.922592" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.922774" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:33.922839" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:33.925184" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:33.920914" elapsed="0.004306"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.927041" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:33.926782" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.927500" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:33.927243" 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-04-10T00:52:33.938795" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:33.939224" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:52:33.939481" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:33.929782" elapsed="0.009727"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:33.927652" elapsed="0.011924"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.939768" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:33.939604" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.927634" elapsed="0.012221"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.943708" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:33.940897" elapsed="0.003233"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:33.940670" elapsed="0.003511"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.940651" elapsed="0.003565"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.948018" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:33.944634" elapsed="0.003448"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:33.944296" elapsed="0.003834"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.944272" elapsed="0.003892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.948960" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:33.948399" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.949426" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:33.949096" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.950210" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:33.949788" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:33.949559" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.949071" elapsed="0.001254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.951077" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:33.950566" elapsed="0.000547"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.951596" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:33.951210" elapsed="0.000470"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.952177" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:33.951883" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:33.951714" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.951185" elapsed="0.001074"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:33.952412" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:33.953242" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:33.952942" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:33.953424" elapsed="0.002582"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:33.940225" elapsed="0.015847"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:33.956252" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:33.956143" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.956124" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:33.964731" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:33.956469" elapsed="0.008292"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:33.964814" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:52:33.965142" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:33.925825" elapsed="0.039354"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:33.965270" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:52:33.965631" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:52:33.823575" elapsed="0.142099"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.966622" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:33.965865" elapsed="0.000928"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.965846" elapsed="0.000988"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:33.966925" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:52:33.812283" elapsed="0.154839"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:33.807902" elapsed="0.159266"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.807881" elapsed="0.159312"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:52:33.967965" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:33.967838" elapsed="0.000222"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:52:33.968207" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:33.968085" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.967819" elapsed="0.000523"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.968493" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:52:33.968631" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:52:33.967524" elapsed="0.001133"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.969237" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:33.968828" elapsed="0.000435"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.970002" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:33.969422" elapsed="0.000610"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.977177" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:33.976473" elapsed="0.000870"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.978438" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:33.977619" elapsed="0.001011"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:33.987764" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:33.987853" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:33 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:33 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":387,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":387,"Leader":"member-2-shard-inventory-operational","LastIndex":388,"RaftState":"Follower","LastApplied":388,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":388,"LastLeadershipChangeTime":"2026-04-10 00:52:30.161","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"442.2 μs","Voting":true,"CurrentTerm":4,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":388,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":39877437},"timestamp":1775782353,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:33.988156" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:33.981199" elapsed="0.007009"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:33.978756" elapsed="0.009535"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:33.988856" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:33.988380" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.978718" elapsed="0.010366"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:33.995922" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":387,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":387,"Leader":"member-2-shard-inventory-operational","LastIndex":388,"RaftState":"Follower","LastApplied":388,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":388,"LastLeadershipChangeTime":"2026-04-10 00:52:30.161","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"442.2 μs","Voting":true,"CurrentTerm":4,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":388,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":39877437},"timestamp":1775782353,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:33.992124" elapsed="0.003884"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:33.991745" elapsed="0.004312"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.991679" elapsed="0.004442"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.000217" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:33.996655" elapsed="0.003609"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:33.996312" elapsed="0.003987"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:33.996248" elapsed="0.004096"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.001153" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.000634" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.001637" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.001357" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.002223" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.001909" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.001742" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.001311" elapsed="0.001015"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.003082" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.002604" elapsed="0.000532"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.003565" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.003286" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.004135" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.003834" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.003668" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.003240" elapsed="0.000995"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:34.004485" elapsed="0.000444"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:34.005532" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.005188" elapsed="0.000422"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.005861" elapsed="0.002559"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:33.990266" elapsed="0.018266"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.008905" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:34.008680" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.008647" elapsed="0.000410"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:34.012769" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:34.009289" elapsed="0.003575"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:34.012952" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:52:34.013233" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:33.971039" elapsed="0.042264"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.013365" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:34.013520" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:52:33.970247" elapsed="0.043326"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.014950" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.014190" elapsed="0.000789"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:34.015027" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:34.015205" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:34.013813" elapsed="0.001419"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:34.015652" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 388, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.015390" elapsed="0.000289"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:34.016070" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.015837" elapsed="0.000259"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:52:34.016142" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:34.016295" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:33.805914" elapsed="0.210405"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:52:34.016376" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:52:34.016526" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:33.805172" elapsed="0.211393"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.016868" elapsed="0.000191"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.016650" elapsed="0.000446"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.017266" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.017120" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.017484" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.017342" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.016632" elapsed="0.000953"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:33.805000" elapsed="0.212611"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.020363" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.019743" elapsed="0.000647"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:34.020436" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:34.020605" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:34.019331" elapsed="0.001299"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.080439" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.079947" elapsed="0.000533"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.081492" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:34.081163" elapsed="0.000506">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:34.081768" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:34.080718" elapsed="0.001075"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.082349" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:34.081962" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.082702" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:52:34.082865" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:52:34.082554" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.083291" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.083048" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.084406" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.084151" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.084906" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.084631" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.085272" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.085483" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.085679" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:52:34.085132" elapsed="0.000607"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.084987" elapsed="0.000784"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:52:34.085821" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:52:34.085993" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:52:34.083826" elapsed="0.002192"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.083418" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.086227" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.086077" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.083393" elapsed="0.002911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.086912" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.086451" elapsed="0.000488"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.086988" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:52:34.079089" elapsed="0.008023"/>
</kw>
<msg time="2026-04-10T00:52:34.087167" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:34.065362" elapsed="0.021858"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.100500" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.114373" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.127040" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.127281" 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-04-10T00:52:34.127505" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.128046" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.127832" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:34.127803" elapsed="0.000360"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.128363" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.128644" elapsed="0.000030"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.128881" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:52:34.127754" elapsed="0.001202"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.127627" elapsed="0.001369"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.129202" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.129310" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:52:34.129806" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:52:34.060967" elapsed="0.068892"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.132350" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:34.131962" elapsed="0.000487">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:34.132601" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:34.131380" elapsed="0.001257"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.133106" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.132738" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.133916" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.133463" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.133217" elapsed="0.000785"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.132712" elapsed="0.001318"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.136932" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:34.134241" elapsed="0.002718"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:52:34.137013" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:52:34.137330" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:34.130739" elapsed="0.006626"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.139144" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:34.138849" elapsed="0.000363">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:34.139366" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:34.138440" elapsed="0.000951"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:52:34.139642" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:34.139488" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.139468" elapsed="0.000259"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.139909" 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-04-10T00:52:34.140097" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.140163" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:34.142840" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:34.137997" elapsed="0.004881"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.144851" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.144563" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.145305" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.145058" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:34.173981" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:34.174672" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:52:34.175041" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:34.147662" elapsed="0.027419"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.145421" elapsed="0.029735"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.175538" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.175208" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.145401" elapsed="0.030287"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.181250" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.177250" elapsed="0.004510"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.176922" elapsed="0.004889"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.176892" elapsed="0.004954"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.185152" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.182250" elapsed="0.002949"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.181926" elapsed="0.003307"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.181902" elapsed="0.003355"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.185856" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.185440" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.186191" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.185953" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.186759" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.186436" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.186272" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.185935" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.187355" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.186999" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.187723" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.187473" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.188257" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.187964" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.187804" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.187454" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:34.188493" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:34.189313" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.189023" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.189494" elapsed="0.002575"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:34.176243" elapsed="0.015894"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.192317" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:34.192208" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.192189" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:34.200990" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:34.192534" elapsed="0.008490"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:34.201086" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:52:34.201476" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:34.143575" elapsed="0.057939"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.201633" elapsed="0.000075"/>
</return>
<msg time="2026-04-10T00:52:34.202130" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:52:34.036134" elapsed="0.166038"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.203187" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.202373" elapsed="0.000993"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.202352" elapsed="0.001057"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.203532" elapsed="0.000047"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:52:34.024940" elapsed="0.178810"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.020714" elapsed="0.183082"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.020683" elapsed="0.183139"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.204581" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:34.204435" elapsed="0.000245"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:52:34.204825" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:34.204705" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.204417" elapsed="0.000544"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.205126" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:52:34.205248" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:52:34.204121" elapsed="0.001152"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.205911" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.205454" elapsed="0.000484"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.206689" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.206099" elapsed="0.000620"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.214010" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.213230" elapsed="0.000944"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.215160" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.214437" elapsed="0.000883"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:34.228570" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:34.228655" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":387,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-inventory-operational","LastIndex":388,"RaftState":"Leader","LastApplied":388,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational","LastLogIndex":388,"LastLeadershipChangeTime":"2026-04-10 00:52:30.149","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.435","active":true,"matchIndex":388,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":389},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-3-shard-inventory-operational","nextIndex":388}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"2.367 ms","CurrentTerm":4,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-3-shard-inventory-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":388,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":19387996},"timestamp":1775782354,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:34.228958" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:34.217906" elapsed="0.011102"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.215476" elapsed="0.013612"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.229646" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.229173" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.215408" elapsed="0.014511"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.236681" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":387,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-inventory-operational","LastIndex":388,"RaftState":"Leader","LastApplied":388,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational","LastLogIndex":388,"LastLeadershipChangeTime":"2026-04-10 00:52:30.149","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.435","active":true,"matchIndex":388,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":389},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-3-shard-inventory-operational","nextIndex":388}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"2.367 ms","CurrentTerm":4,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-3-shard-inventory-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":388,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":19387996},"timestamp":1775782354,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.232950" elapsed="0.003816"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.232629" elapsed="0.004186"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.232535" elapsed="0.004342"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.240914" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.237384" elapsed="0.003595"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.237068" elapsed="0.003960"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.237005" elapsed="0.004086"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.242092" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.241455" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.242736" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.242374" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.243608" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.243112" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.242880" elapsed="0.000818"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.242310" elapsed="0.001444"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.244485" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.244017" elapsed="0.000518"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.244942" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.244700" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.245502" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.245204" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.245040" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.244654" elapsed="0.000975"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:34.245875" elapsed="0.000421"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:34.246913" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.246567" elapsed="0.000396"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.247211" elapsed="0.002561"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:34.231084" elapsed="0.018796"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.250226" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:34.250009" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.249977" elapsed="0.000398"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:34.254154" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:34.250621" elapsed="0.003626"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:34.254369" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:52:34.254662" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:34.207785" elapsed="0.046905"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.254748" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:52:34.254896" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:52:34.206934" elapsed="0.047988"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.256263" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.255555" elapsed="0.000738"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:34.256342" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:34.256516" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:34.255145" elapsed="0.001412"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:34.256945" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 388, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.256719" elapsed="0.000253"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:34.257363" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.257129" elapsed="0.000259"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:52:34.257434" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:34.257630" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:34.018731" elapsed="0.238924"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:52:34.257713" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:52:34.257863" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:34.017957" elapsed="0.239930"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.258188" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.257968" elapsed="0.000276"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.258475" elapsed="0.000206"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.258268" elapsed="0.000451"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.258889" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.258743" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.257950" elapsed="0.001012"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:52:34.017785" elapsed="0.241201"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:33.804795" elapsed="0.454225"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:52:34.259064" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:52:34.259266" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:52:34.259312" level="INFO">${follower_list} = [1]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:52:33.800750" elapsed="0.458585"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.259853" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:52:34.259931" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:52:34.259577" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.260279" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.260024" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.260007" elapsed="0.000352"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.264385" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:52:34.260498" elapsed="0.003953"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:52:34.264931" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.264690" elapsed="0.000274"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:52:34.265021" elapsed="0.000038"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:52:33.797859" elapsed="0.467347"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:52:33.797620" elapsed="0.467642"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.270872" level="INFO">${return_list_reference} = [1, 2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:34.270368" elapsed="0.000536"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.271503" level="INFO">${return_list_copy} = [1, 2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:34.271104" elapsed="0.000430"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:34.271605" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:52:34.271794" level="INFO">${index_list} = [1, 2]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:34.269920" elapsed="0.001902"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:52:34.272021" elapsed="0.000203"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.272758" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:34.272393" elapsed="0.000392"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.273187" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:34.272945" elapsed="0.000268"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.273621" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:34.273363" elapsed="0.000284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.276360" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.275884" elapsed="0.000503"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:34.276432" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:34.276612" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:34.275459" elapsed="0.001179"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.337628" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.337214" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.338447" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:34.338175" elapsed="0.000355">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:34.338644" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:34.337834" elapsed="0.000835"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.339227" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:34.338839" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.339611" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:52:34.339838" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:52:34.339418" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.340277" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.340025" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.341319" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.341057" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.341830" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.341533" elapsed="0.000324"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.342195" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.342406" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.342601" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:52:34.342055" elapsed="0.000606"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.341912" elapsed="0.000780"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:52:34.342740" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:52:34.342910" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:52:34.340725" elapsed="0.002210"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.340400" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.343143" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.342992" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.340378" elapsed="0.002843"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.343857" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.343367" elapsed="0.000519"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.343935" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:52:34.336594" elapsed="0.007465"/>
</kw>
<msg time="2026-04-10T00:52:34.344114" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:34.323569" elapsed="0.020598"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.357446" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.370108" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.382793" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.383082" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.383267" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.383719" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.383564" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:34.383534" elapsed="0.000268"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.383944" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.384112" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.384277" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:52:34.383496" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.383353" elapsed="0.001004"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.384504" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.384597" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:52:34.384914" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:52:34.319006" elapsed="0.065944"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.386727" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:34.386424" elapsed="0.000382">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:34.386901" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:34.386048" elapsed="0.000879"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.387260" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.386998" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.387864" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.387567" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.387342" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.386980" elapsed="0.000966"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.390308" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:34.388098" elapsed="0.002237"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:52:34.390386" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:52:34.390755" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:34.385588" elapsed="0.005202"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.392445" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:34.392202" elapsed="0.000305">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:34.392623" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:34.391863" elapsed="0.000785"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:52:34.392856" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:34.392720" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.392702" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.393125" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.393299" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.393365" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:52:34.395681" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:34.391374" elapsed="0.004344"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.397526" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.397262" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.397992" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.397749" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:34.409101" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:34.409535" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:52:34.409779" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:34.400244" elapsed="0.009562"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.398102" elapsed="0.011750"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.410041" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.409880" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.398084" elapsed="0.012043"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.414003" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.411173" elapsed="0.003152"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.410949" elapsed="0.003412"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.410929" elapsed="0.003457"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.417106" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.414683" elapsed="0.002470"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.414442" elapsed="0.002745"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.414425" elapsed="0.002786"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.417788" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.417384" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.418122" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.417887" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.418682" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.418366" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.418203" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.417868" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.419317" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.418957" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.419697" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.419414" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.420232" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.419940" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.419780" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.419396" elapsed="0.000919"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:34.420466" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:34.421289" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.420996" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.421470" elapsed="0.002509"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:34.410498" elapsed="0.013547"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.424226" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:34.424117" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.424098" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:34.432844" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:34.424442" elapsed="0.008433"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:34.432928" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:52:34.433269" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:34.396312" elapsed="0.036996"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.433402" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:52:34.433774" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:52:34.292458" elapsed="0.141359"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.434780" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.434014" elapsed="0.000933"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.433994" elapsed="0.000994"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.435079" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:52:34.281114" elapsed="0.154163"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.276716" elapsed="0.158607"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.276695" elapsed="0.158653"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.436107" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:34.435977" elapsed="0.000227"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:52:34.436351" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:34.436229" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.435959" elapsed="0.000529"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.436655" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:52:34.436779" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:52:34.435676" elapsed="0.001129"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.437392" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.436976" elapsed="0.000444"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.438166" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.437595" elapsed="0.000599"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.445430" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.444742" elapsed="0.000868"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.446576" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.445871" elapsed="0.000868"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:34.455371" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:34.455431" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":5,"SnapshotIndex":54,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":54,"Leader":"member-1-shard-topology-operational","LastIndex":55,"RaftState":"Leader","LastApplied":55,"LastCommittedTransactionTime":"2026-04-10 00:51:56.412","LastLogIndex":55,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.118","active":true,"matchIndex":55,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":56},{"timeSinceLastActivity":"00:00:14.678","active":false,"matchIndex":54,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":55}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"461.6 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":5,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":55,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":2591},"timestamp":1775782354,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:34.455699" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:34.449315" elapsed="0.006420"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.446857" elapsed="0.008935"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.456167" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.455853" elapsed="0.000452"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.446825" elapsed="0.009539"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.461164" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":5,"SnapshotIndex":54,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":54,"Leader":"member-1-shard-topology-operational","LastIndex":55,"RaftState":"Leader","LastApplied":55,"LastCommittedTransactionTime":"2026-04-10 00:51:56.412","LastLogIndex":55,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.118","active":true,"matchIndex":55,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":56},{"timeSinceLastActivity":"00:00:14.678","active":false,"matchIndex":54,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":55}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"461.6 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":5,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":55,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":2591},"timestamp":1775782354,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.458516" elapsed="0.002712"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.458288" elapsed="0.002976"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.458242" elapsed="0.003067"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.464147" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.461690" elapsed="0.002503"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.461445" elapsed="0.002783"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.461400" elapsed="0.002872"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.465169" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.464530" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.465628" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.465370" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.466202" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.465896" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.465730" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.465324" elapsed="0.000983"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.466995" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.466572" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.467436" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.467194" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.468041" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.467740" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.467572" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.467149" elapsed="0.000993"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:34.468386" elapsed="0.000512"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:34.469488" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.469156" elapsed="0.000383"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.469803" elapsed="0.002546"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:34.457279" elapsed="0.015177"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.472838" elapsed="0.000046"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:34.472615" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.472580" elapsed="0.000405"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:34.476768" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:34.473215" elapsed="0.003646"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:34.476982" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:52:34.477262" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:34.439208" elapsed="0.038082"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.477349" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:34.477500" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:52:34.438411" elapsed="0.039116"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.478857" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757823...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.478135" elapsed="0.000752"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:34.479054" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:34.479236" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757823...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:34.477768" elapsed="0.001495"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:34.479708" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 55, 'CommittedTransactionsCount': 5, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.479421" elapsed="0.000315"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:34.480130" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.479896" elapsed="0.000260"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:52:34.480203" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:34.480355" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:34.274830" elapsed="0.205549"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:52:34.480437" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:52:34.480662" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:34.274090" elapsed="0.206598"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.480987" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.480770" elapsed="0.000274"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.481276" elapsed="0.000187"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.481067" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.481690" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.481524" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.480753" elapsed="0.001011"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:34.273916" elapsed="0.207872"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.484323" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.483859" elapsed="0.000490"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:34.484395" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:34.484579" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:34.483453" elapsed="0.001153"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.543942" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.543560" elapsed="0.000411"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.544826" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:34.544535" elapsed="0.000370">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:34.544999" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:34.544193" elapsed="0.000830"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.545589" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:34.545189" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.545920" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:52:34.546077" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:52:34.545782" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.546501" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.546259" 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-04-10T00:52:34.547529" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.547248" elapsed="0.000342"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.548023" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.547756" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.548375" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.548596" 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-04-10T00:52:34.548775" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:52:34.548240" elapsed="0.000594"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.548104" elapsed="0.000759"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:52:34.548907" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:34.549067" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:52:34.546924" elapsed="0.002168"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.546630" elapsed="0.002495"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.549296" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.549149" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.546610" elapsed="0.002763"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.549984" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.549516" elapsed="0.000495"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.550060" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:52:34.542893" elapsed="0.007291"/>
</kw>
<msg time="2026-04-10T00:52:34.550238" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:34.529997" elapsed="0.020292"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.563125" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.575789" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.588491" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.588702" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.588881" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.589248" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.589103" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:34.589088" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.589468" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.589652" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.589821" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:52:34.589059" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.588959" elapsed="0.000940"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.590045" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.590120" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:34.590387" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:52:34.525520" elapsed="0.064902"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.592109" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:34.591865" elapsed="0.000309">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:34.592266" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:34.591499" elapsed="0.000791"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.592617" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.592359" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.593156" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.592868" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.592699" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.592341" elapsed="0.000896"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.595634" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:34.593385" elapsed="0.002275"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:52:34.595710" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:34.596012" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:34.591045" elapsed="0.005001"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.597717" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:34.597457" elapsed="0.000323">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:34.597872" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:34.597118" elapsed="0.000779"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:52:34.598102" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:34.597968" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.597949" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.598330" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.598501" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.598582" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:34.600868" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:34.596683" elapsed="0.004221"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.602698" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.602425" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.603145" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.602904" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:34.653592" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:34.654530" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:52:34.655024" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:34.605422" elapsed="0.049662"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.603255" elapsed="0.051926"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.655644" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.655240" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.603237" elapsed="0.052606"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.662896" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.658176" elapsed="0.005176"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.657684" elapsed="0.005717"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.657640" elapsed="0.005796"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.667224" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.663881" elapsed="0.003406"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.663562" elapsed="0.003773"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.663518" elapsed="0.003849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.668068" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.667650" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.668401" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.668166" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.668958" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.668659" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.668482" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.668148" elapsed="0.000893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.669573" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.669201" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.669907" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.669671" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.670438" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.670146" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.669987" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.669652" elapsed="0.000866"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:34.670683" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:34.671471" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.671188" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.671690" elapsed="0.002514"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:34.656708" elapsed="0.017559"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.674440" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:34.674336" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.674318" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:34.682813" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:34.674667" elapsed="0.008176"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:34.682895" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:52:34.683216" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:34.601486" elapsed="0.081767"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.683344" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:52:34.683733" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:52:34.499912" elapsed="0.183863"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.684712" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.683968" elapsed="0.000904"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.683949" elapsed="0.000963"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.685002" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:52:34.489037" elapsed="0.196159"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.484675" elapsed="0.200567"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.484657" elapsed="0.200610"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.685989" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:34.685861" elapsed="0.000221"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:52:34.686226" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:34.686107" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.685844" elapsed="0.000515"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.686508" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:52:34.686645" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:52:34.685572" elapsed="0.001099"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.687416" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.686842" elapsed="0.000601"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.688231" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.687653" elapsed="0.000606"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.695372" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.694679" elapsed="0.000893"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.696515" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.695835" elapsed="0.000882"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:34.704725" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:34.704785" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":54,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":54,"Leader":"member-1-shard-topology-operational","LastIndex":55,"RaftState":"Follower","LastApplied":55,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":55,"LastLeadershipChangeTime":"2026-04-10 00:51:03.906","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"278.5 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":55,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":1842},"timestamp":1775782354,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:34.704996" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:34.699252" elapsed="0.005779"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.696834" elapsed="0.008254"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.705461" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.705148" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.696802" elapsed="0.009798"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.712823" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":54,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":54,"Leader":"member-1-shard-topology-operational","LastIndex":55,"RaftState":"Follower","LastApplied":55,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":55,"LastLeadershipChangeTime":"2026-04-10 00:51:03.906","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"278.5 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":55,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":1842},"timestamp":1775782354,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.709087" elapsed="0.003820"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.708768" elapsed="0.004188"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.708704" elapsed="0.004316"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.716810" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.713530" elapsed="0.003330"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.713211" elapsed="0.003685"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.713149" elapsed="0.003792"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.717647" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.717200" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.718097" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.717854" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.718685" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.718362" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.718197" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.717807" elapsed="0.000980"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.719457" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.719040" elapsed="0.000537"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.720010" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.719761" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.720589" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.720272" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.720109" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.719713" elapsed="0.000978"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:34.720936" elapsed="0.000421"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:34.721960" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.721631" elapsed="0.000379"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.722259" elapsed="0.002506"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:34.707407" elapsed="0.017465"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.725224" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:34.725003" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.724970" elapsed="0.000403"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:34.729134" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:34.725618" elapsed="0.003610"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:34.729330" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:52:34.729703" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:34.689293" elapsed="0.040438"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.729853" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:34.730006" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:52:34.688481" elapsed="0.041551"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.731331" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757823...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.730636" elapsed="0.000725"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:34.731410" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:34.731615" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757823...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:34.730255" elapsed="0.001388"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:34.732026" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 55, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.731801" elapsed="0.000253"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:34.732447" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.732210" elapsed="0.000263"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:52:34.732520" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:52:34.732695" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:34.482851" elapsed="0.249868"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:52:34.732776" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:52:34.732926" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:34.482122" elapsed="0.250828"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.733249" elapsed="0.000189"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.733031" elapsed="0.000444"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.733715" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.733499" elapsed="0.000275"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.733939" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.733796" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.733014" elapsed="0.000997"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:52:34.481951" elapsed="0.252083"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:34.273703" elapsed="0.460363"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:52:34.734109" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:52:34.734311" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:52:34.734357" level="INFO">${follower_list} = [2]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:52:34.269038" elapsed="0.465342"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.734836" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:52:34.734911" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:52:34.734569" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.735217" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.735003" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.734985" elapsed="0.000309"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.737515" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:52:34.735431" elapsed="0.002192"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:52:34.738017" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.737827" elapsed="0.000216"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:52:34.738091" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:52:34.265764" elapsed="0.472480"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:52:34.265370" elapsed="0.472919"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.742789" level="INFO">${return_list_reference} = [1, 2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:34.742400" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.743270" level="INFO">${return_list_copy} = [1, 2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:34.742976" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:34.743340" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:34.743509" level="INFO">${index_list} = [1, 2]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:34.742027" elapsed="0.001507"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:52:34.743707" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.744352" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:34.744022" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.744793" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:34.744536" elapsed="0.000283"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.745199" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:34.744968" elapsed="0.000256"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.747871" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.747350" elapsed="0.000548"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:34.747944" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:34.748091" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:34.746984" elapsed="0.001132"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.808115" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.807735" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.808918" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:34.808668" elapsed="0.000326">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:34.809087" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:34.808312" elapsed="0.000800"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.809676" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:34.809277" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.810004" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:52:34.810158" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:52:34.809865" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.810644" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.810339" elapsed="0.000350"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.811669" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.811378" elapsed="0.000335"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.812148" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.811881" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.812497" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.812722" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.812902" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:52:34.812360" elapsed="0.000600"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.812225" elapsed="0.000766"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:52:34.813035" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:34.813196" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:52:34.811054" elapsed="0.002168"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.810761" elapsed="0.002493"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.813426" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.813279" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.810741" elapsed="0.002761"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.814094" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.813662" elapsed="0.000459"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.814170" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:52:34.807078" elapsed="0.007216"/>
</kw>
<msg time="2026-04-10T00:52:34.814348" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:34.794241" elapsed="0.020158"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.827399" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.840056" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.852682" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.852880" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.853057" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.853470" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.853321" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:34.853306" 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-04-10T00:52:34.853712" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.853881" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.854047" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:52:34.853274" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.853135" elapsed="0.000992"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.854273" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.854349" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:34.854637" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:52:34.789815" elapsed="0.064859"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.856379" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:34.856110" elapsed="0.000333">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:34.856536" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:34.855765" elapsed="0.000821"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.856906" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.856660" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.857457" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.857159" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.856988" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.856642" elapsed="0.000898"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.859952" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:34.857718" elapsed="0.002261"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:52:34.860030" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:34.860335" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:34.855273" elapsed="0.005096"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:34.862072" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:34.861825" elapsed="0.000310">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:34.862228" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:34.861398" elapsed="0.000854"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:52:34.862458" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:34.862323" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.862305" elapsed="0.000253"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.862708" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.862878" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.862943" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:34.865259" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:34.860964" elapsed="0.004332"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.867129" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.866874" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.867615" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.867330" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:34.883239" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:34.884254" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:52:34.884749" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:34.869815" elapsed="0.014995"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.867726" elapsed="0.017181"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.885308" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.884966" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.867708" elapsed="0.017789"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.892872" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.887855" elapsed="0.005337"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.887295" elapsed="0.005934"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.887254" elapsed="0.005999"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.896146" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.893537" elapsed="0.002655"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.893310" elapsed="0.002917"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.893292" elapsed="0.002960"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.896822" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.896417" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.897152" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.896918" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.897710" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.897394" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.897235" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.896900" elapsed="0.000892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.898312" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.897955" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.898655" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.898408" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.899189" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.898897" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.898737" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.898390" elapsed="0.000880"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:34.899418" elapsed="0.000397"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:34.900264" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.899981" elapsed="0.000308"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.900442" elapsed="0.002445"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:34.886323" elapsed="0.016628"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.903125" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:34.903020" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.903002" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:34.911746" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:34.903339" elapsed="0.008442"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:34.911834" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:52:34.912150" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:34.865892" elapsed="0.046295"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.912277" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:52:34.912640" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:52:34.764966" elapsed="0.147716"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.913621" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.912872" elapsed="0.000912"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.912853" elapsed="0.000971"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.913912" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:52:34.753732" elapsed="0.160374"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.748184" elapsed="0.165968"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.748166" elapsed="0.166011"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.914897" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:34.914770" elapsed="0.000222"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:52:34.915136" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:34.915017" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.914752" elapsed="0.000520"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.915419" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:52:34.915586" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:52:34.914464" elapsed="0.001149"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.916197" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.915790" elapsed="0.000434"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.916961" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.916382" elapsed="0.000608"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.924174" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.923425" elapsed="0.000914"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.925425" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.924617" elapsed="0.001037"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:34.936875" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:34.936955" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":40,"SnapshotIndex":256,"InMemoryJournalLogSize":9,"ReplicatedToAllIndex":256,"Leader":"member-1-shard-default-operational","LastIndex":265,"RaftState":"Leader","LastApplied":264,"LastCommittedTransactionTime":"2026-04-10 00:51:05.746","LastLogIndex":265,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:15.156","active":false,"matchIndex":256,"voting":true,"id":"member-3-shard-default-operational","nextIndex":257},{"timeSinceLastActivity":"00:00:00.072","active":true,"matchIndex":264,"voting":true,"id":"member-2-shard-default-operational","nextIndex":265}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"1.508 ms","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":3,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":264,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":39,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":7715},"timestamp":1775782354,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:34.937248" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:34.928181" elapsed="0.009117"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.925775" elapsed="0.011603"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.937995" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.937464" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.925742" elapsed="0.012527"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.944930" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":40,"SnapshotIndex":256,"InMemoryJournalLogSize":9,"ReplicatedToAllIndex":256,"Leader":"member-1-shard-default-operational","LastIndex":265,"RaftState":"Leader","LastApplied":264,"LastCommittedTransactionTime":"2026-04-10 00:51:05.746","LastLogIndex":265,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:15.156","active":false,"matchIndex":256,"voting":true,"id":"member-3-shard-default-operational","nextIndex":257},{"timeSinceLastActivity":"00:00:00.072","active":true,"matchIndex":264,"voting":true,"id":"member-2-shard-default-operational","nextIndex":265}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"1.508 ms","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":3,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":264,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":39,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":7715},"timestamp":1775782354,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.941259" elapsed="0.003755"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.940944" elapsed="0.004119"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.940878" elapsed="0.004247"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.949126" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:34.945658" elapsed="0.003533"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.945314" elapsed="0.003925"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.945251" elapsed="0.004049"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.950278" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.949677" elapsed="0.000672"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.951014" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.950670" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.951870" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.951388" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.951155" elapsed="0.000778"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.950494" elapsed="0.001479"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.952665" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.952228" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.953111" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.952871" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.953691" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.953374" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.953210" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.952825" elapsed="0.000967"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:34.954034" elapsed="0.000421"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:34.955066" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.954737" elapsed="0.000379"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.955361" elapsed="0.002518"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:34.939435" elapsed="0.018697"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:34.958484" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:34.958263" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.958230" elapsed="0.000434"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:34.962435" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:34.958894" elapsed="0.003636"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:34.962724" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:52:34.963006" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:34.918009" elapsed="0.045025"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:34.963092" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:34.963244" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:52:34.917206" elapsed="0.046064"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.964595" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578235...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:34.963894" elapsed="0.000731"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:34.964674" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:34.964849" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578235...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:34.963492" elapsed="0.001384"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:34.965258" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 264, 'CommittedTransactionsCount': 3, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.965033" elapsed="0.000252"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:34.965694" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.965442" elapsed="0.000278"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:52:34.965768" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:34.965921" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:34.746368" elapsed="0.219577"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:52:34.966001" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:52:34.966147" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:34.745660" elapsed="0.220511"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.966469" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.966252" elapsed="0.000274"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:34.966822" elapsed="0.000189"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.966609" elapsed="0.000439"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:34.967219" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:34.967072" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.966234" elapsed="0.001059"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:34.745476" elapsed="0.221840"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:34.969867" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:34.969385" elapsed="0.000509"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:34.969940" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:34.970087" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:34.969017" elapsed="0.001095"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.029648" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.029256" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.030482" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:35.030228" elapsed="0.000342">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:35.030666" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:35.029890" elapsed="0.000801"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.031241" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:35.030858" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.031612" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:52:35.031861" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:52:35.031431" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.032303" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.032055" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.033317" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.033061" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.033807" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.033524" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.034159" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.034364" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.034539" elapsed="0.000036"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:52:35.034022" elapsed="0.000591"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.033885" elapsed="0.000758"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:52:35.034686" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:35.034845" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:52:35.032734" elapsed="0.002136"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.032418" elapsed="0.002484"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.035075" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.034926" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.032399" elapsed="0.002752"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.035782" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.035320" elapsed="0.000490"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.035858" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:52:35.028638" elapsed="0.007356"/>
</kw>
<msg time="2026-04-10T00:52:35.036050" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:35.015793" elapsed="0.020308"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.049108" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.061873" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.074526" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.074740" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.074917" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.075287" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.075141" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:35.075127" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.075507" elapsed="0.000060"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.075730" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.075900" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:52:35.075097" elapsed="0.000856"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.074996" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.076125" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.076201" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:35.076474" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:52:35.011274" elapsed="0.065236"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.078217" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:35.077961" elapsed="0.000323">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:35.078377" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:35.077613" elapsed="0.000788"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.078736" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.078470" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.079284" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.078991" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.078821" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.078452" elapsed="0.000914"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.081800" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:35.079574" elapsed="0.002253"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:52:35.081876" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:35.082184" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:35.077150" elapsed="0.005069"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.083973" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:35.083714" elapsed="0.000322">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:35.084131" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:35.083327" elapsed="0.000829"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:52:35.084363" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:35.084228" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.084210" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.084641" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.084817" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.084881" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:35.087126" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:35.082888" elapsed="0.004276"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.089078" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.088766" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.089528" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.089285" elapsed="0.000347"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:35.108196" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:35.109131" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:52:35.109618" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:35.091826" elapsed="0.017855"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.089701" elapsed="0.020079"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.110189" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.109842" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.089682" elapsed="0.020701"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.117218" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.112738" elapsed="0.004802"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.112210" elapsed="0.005381"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.112167" elapsed="0.005449"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.120336" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.117902" elapsed="0.002480"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.117675" elapsed="0.002742"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.117657" elapsed="0.002784"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.121005" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.120624" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.121342" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.121104" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.121904" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.121602" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.121424" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.121086" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.122508" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.122149" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.122855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.122621" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.123386" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.123095" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.122935" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.122603" elapsed="0.000864"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:35.123653" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:35.124448" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.124166" elapsed="0.000308"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.124644" elapsed="0.002534"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:35.111208" elapsed="0.016034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.127416" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:35.127312" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.127293" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:35.135760" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:35.127680" elapsed="0.008115"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:35.135849" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:35.136164" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:35.087825" elapsed="0.048376"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.136290" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:52:35.136656" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:52:34.985993" elapsed="0.150706"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.137734" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.136893" elapsed="0.001004"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.136874" elapsed="0.001064"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.138034" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:52:34.974606" elapsed="0.163627"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:34.970181" elapsed="0.168097"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:34.970163" elapsed="0.168139"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.139042" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:35.138915" elapsed="0.000222"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:52:35.139281" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:35.139162" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.138897" elapsed="0.000520"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.139612" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:52:35.139735" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:52:35.138614" elapsed="0.001146"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.140337" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.139930" elapsed="0.000433"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.141111" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.140521" elapsed="0.000618"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.148342" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.147655" elapsed="0.000851"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.149463" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.148783" elapsed="0.000899"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:35.158938" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:35.159081" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:35 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:35 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":256,"InMemoryJournalLogSize":8,"ReplicatedToAllIndex":256,"Leader":"member-1-shard-default-operational","LastIndex":264,"RaftState":"Follower","LastApplied":264,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":264,"LastLeadershipChangeTime":"2026-04-10 00:51:03.908","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"207.1 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":264,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":3615},"timestamp":1775782355,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:35.159701" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:35.152192" elapsed="0.007601"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.149811" elapsed="0.010124"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.160889" elapsed="0.000112"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.160083" elapsed="0.001055"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.149768" elapsed="0.011504"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.170045" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":256,"InMemoryJournalLogSize":8,"ReplicatedToAllIndex":256,"Leader":"member-1-shard-default-operational","LastIndex":264,"RaftState":"Follower","LastApplied":264,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":264,"LastLeadershipChangeTime":"2026-04-10 00:51:03.908","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"207.1 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":264,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":3615},"timestamp":1775782355,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.166670" elapsed="0.003437"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.166086" elapsed="0.004057"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.165975" elapsed="0.004213"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.173013" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.170572" elapsed="0.002488"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.170326" elapsed="0.002768"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.170280" elapsed="0.002859"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.173911" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.173437" elapsed="0.000555"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.174411" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.174159" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.175036" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.174723" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.174513" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.174111" elapsed="0.001028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.175869" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.175395" elapsed="0.000524"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.176307" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.176069" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.176944" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.176587" elapsed="0.000385"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.176407" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.176024" elapsed="0.001026"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:35.177296" elapsed="0.000442"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:35.178324" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.177995" elapsed="0.000378"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.178635" elapsed="0.002523"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:35.163349" elapsed="0.017916"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.181631" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:35.181394" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.181362" elapsed="0.000419"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:35.185454" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:35.182009" elapsed="0.003553"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:35.185654" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:52:35.185935" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:35.142158" elapsed="0.043805"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.186058" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:35.186212" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:52:35.141355" elapsed="0.044883"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.187628" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578235...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.186862" elapsed="0.000799"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:35.187712" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:35.187890" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578235...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:35.186467" elapsed="0.001449"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:35.188298" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 264, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.188075" elapsed="0.000251"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:35.188773" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.188481" elapsed="0.000317"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:52:35.188846" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:35.189000" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:34.968393" elapsed="0.220632"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:52:35.189081" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:52:35.189229" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:34.967683" elapsed="0.221571"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.189584" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.189335" elapsed="0.000479"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.189982" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.189838" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.190201" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.190059" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.189316" elapsed="0.000958"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:52:34.967475" elapsed="0.222823"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:34.745276" elapsed="0.445054"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:52:35.190373" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:52:35.190591" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:52:35.190638" level="INFO">${follower_list} = [2]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:52:34.741281" elapsed="0.449380"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.191104" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:52:35.191179" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:52:35.190837" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.191480" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.191269" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.191252" elapsed="0.000347"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.193901" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:52:35.191738" elapsed="0.002211"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:52:35.194378" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.194170" elapsed="0.000235"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:52:35.194453" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:52:34.738617" elapsed="0.456010"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:52:34.738379" elapsed="0.456295"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:52:33.797460" elapsed="1.397246"/>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:52:33.797062" elapsed="1.397700"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.200052" level="INFO">${return_list_reference} = [1, 2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:35.199670" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.200538" level="INFO">${return_list_copy} = [1, 2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:35.200239" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:35.200626" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:35.200781" level="INFO">${index_list} = [1, 2]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:35.199222" elapsed="0.001583"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:52:35.200959" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.201616" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:35.201270" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.202041" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:35.201805" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.202446" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:35.202214" elapsed="0.000257"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.205306" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.204840" elapsed="0.000493"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:35.205378" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:35.205525" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:35.204449" elapsed="0.001123"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.267355" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.266970" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.268227" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:35.267963" elapsed="0.000344">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:35.268401" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:35.267620" elapsed="0.000805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.268994" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:35.268606" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.269324" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:52:35.269533" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:52:35.269183" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.269986" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.269736" 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-04-10T00:52:35.271000" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.270745" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.271474" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.271207" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.272696" elapsed="0.000088"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.273066" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.273254" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:52:35.271790" elapsed="0.001522"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.271621" elapsed="0.001723"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:52:35.273389" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:52:35.273593" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:52:35.270403" elapsed="0.003217"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.270105" elapsed="0.003547"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.273829" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.273677" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.270082" elapsed="0.003824"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.274516" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.274054" elapsed="0.000503"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.274607" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:52:35.266342" elapsed="0.008389"/>
</kw>
<msg time="2026-04-10T00:52:35.274788" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:35.253401" elapsed="0.021439"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.289361" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.302048" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.314847" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.315052" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.315305" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.315725" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.315576" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:35.315522" 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-04-10T00:52:35.315949" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.316119" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.316285" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:52:35.315491" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.315387" elapsed="0.000978"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.316512" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.316605" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:52:35.316890" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:52:35.248807" elapsed="0.068118"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.318642" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:35.318351" elapsed="0.000360">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:35.318803" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:35.317999" elapsed="0.000828"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.319147" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.318898" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.319754" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.319403" elapsed="0.000381"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.319229" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.318880" elapsed="0.000969"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.322341" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:35.320000" elapsed="0.002373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:52:35.322424" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:35.322786" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:35.317535" elapsed="0.005286"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.324463" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:35.324220" elapsed="0.000306">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:35.324636" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:35.323878" elapsed="0.000783"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:52:35.324863" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:35.324731" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.324713" elapsed="0.000233"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.325094" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.325265" elapsed="0.000054"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.325367" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:52:35.374236" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:35.323404" elapsed="0.050903"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.377038" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.376633" elapsed="0.000474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.377665" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.377321" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:35.390380" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:35.390999" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:52:35.391319" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:35.380783" elapsed="0.010575"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.377831" elapsed="0.013589"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.391727" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.391461" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.377797" elapsed="0.014060"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.397224" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.393301" elapsed="0.004388"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.392987" elapsed="0.004754"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.392961" elapsed="0.004814"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.401627" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.398172" elapsed="0.003522"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.397855" elapsed="0.003888"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.397831" elapsed="0.003945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.402583" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.402019" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.403057" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.402725" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.403869" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.403401" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.403172" elapsed="0.000785"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.402698" elapsed="0.001289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.404741" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.404213" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.405202" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.404877" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.405978" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.405562" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.405316" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.404852" elapsed="0.001242"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:35.406307" elapsed="0.000502"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:35.407444" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.407042" elapsed="0.000439"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.407736" elapsed="0.003648"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:35.392367" elapsed="0.019109"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.411784" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:35.411628" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.411598" elapsed="0.000260"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:35.420222" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:35.412007" elapsed="0.008246"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:35.420305" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:52:35.420667" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:35.375265" elapsed="0.045439"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.420795" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:52:35.421319" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:52:35.222303" elapsed="0.199059"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.422321" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.421572" elapsed="0.000913"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.421536" elapsed="0.000990"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.422634" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:52:35.209960" elapsed="0.212876"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.205642" elapsed="0.217240"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.205624" elapsed="0.217283"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:52:35.423671" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:35.423487" elapsed="0.000299"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.423852" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:35.423813" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.423469" elapsed="0.000637"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.424260" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:52:35.424382" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:52:35.423197" elapsed="0.001210"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.425002" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.424593" elapsed="0.000436"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.425777" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.425188" elapsed="0.000618"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.432934" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.432212" elapsed="0.000889"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.434108" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.433363" elapsed="0.000907"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:35.443445" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:35.443516" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:35 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:35 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":30002,"SnapshotIndex":100038,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":100038,"Leader":"member-1-shard-inventory-config","LastIndex":100039,"RaftState":"Leader","LastApplied":100039,"LastCommittedTransactionTime":"2026-04-10 00:51:58.144","LastLogIndex":100039,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.215","active":true,"matchIndex":100039,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":100040},{"timeSinceLastActivity":"00:00:15.289","active":false,"matchIndex":100039,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":100040}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"577.5 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":2,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":100039,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":2,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":42104},"timestamp":1775782355,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:35.443800" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:35.436965" elapsed="0.006872"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.434390" elapsed="0.009539"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.444477" elapsed="0.000084"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.444020" elapsed="0.000626"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.434357" elapsed="0.010427"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.451410" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":30002,"SnapshotIndex":100038,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":100038,"Leader":"member-1-shard-inventory-config","LastIndex":100039,"RaftState":"Leader","LastApplied":100039,"LastCommittedTransactionTime":"2026-04-10 00:51:58.144","LastLogIndex":100039,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.215","active":true,"matchIndex":100039,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":100040},{"timeSinceLastActivity":"00:00:15.289","active":false,"matchIndex":100039,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":100040}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"577.5 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":2,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":100039,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":2,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":42104},"timestamp":1775782355,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.447877" elapsed="0.003621"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.447515" elapsed="0.004086"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.447449" elapsed="0.004219"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.454503" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.452082" elapsed="0.002480"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.451852" elapsed="0.002746"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.451797" elapsed="0.002845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.455354" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.454908" elapsed="0.000497"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.455908" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.455653" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.456487" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.456178" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.456010" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.455511" elapsed="0.001097"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.457284" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.456862" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.457740" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.457483" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.458303" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.458002" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.457840" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.457437" elapsed="0.000967"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:35.458671" elapsed="0.000427"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:35.459733" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.459355" elapsed="0.000428"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.460031" elapsed="0.002527"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:35.446074" elapsed="0.016594"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.463021" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:35.462800" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.462766" elapsed="0.000406"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:35.467033" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:35.463402" elapsed="0.003727"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:35.467275" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:52:35.467601" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:35.426795" elapsed="0.040835"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.467690" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:35.467843" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:52:35.426021" elapsed="0.041848"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.469198" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782355, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.468463" elapsed="0.000764"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:35.469276" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:35.469457" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782355, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:35.468098" elapsed="0.001385"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:35.469902" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 100039, 'CommittedTransactionsCount': 2, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': Fals...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.469666" elapsed="0.000264"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:35.470462" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.470088" elapsed="0.000400"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:52:35.470536" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:52:35.470710" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:35.203678" elapsed="0.267056"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:52:35.470793" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:35.470941" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:35.202900" elapsed="0.268065"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.471266" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.471047" elapsed="0.000275"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.471601" elapsed="0.000195"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.471345" elapsed="0.000489"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.472005" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.471858" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.471029" elapsed="0.001050"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:35.202732" elapsed="0.269371"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.474877" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.474391" elapsed="0.000513"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:35.474950" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:35.475098" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:35.474022" elapsed="0.001100"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.534051" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.533675" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.534901" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:35.534644" elapsed="0.000333">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:35.535072" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:35.534288" elapsed="0.000808"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.535700" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:35.535264" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.536030" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:52:35.536199" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:52:35.535892" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.536643" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.536384" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.537801" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.537527" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.538276" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.538010" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.538646" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.538855" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.539032" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:52:35.538493" elapsed="0.000598"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.538355" elapsed="0.000766"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:52:35.539165" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:35.539325" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:52:35.537056" elapsed="0.002295"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.536758" elapsed="0.002627"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.539579" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.539409" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.536738" elapsed="0.002921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.540233" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.539803" elapsed="0.000457"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.540308" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:52:35.532868" elapsed="0.007564"/>
</kw>
<msg time="2026-04-10T00:52:35.540486" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:35.520064" elapsed="0.020473"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.553112" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.565655" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.578434" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.578643" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.578821" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.579189" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.579043" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:35.579029" elapsed="0.000239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.579408" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.579621" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.579793" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:52:35.579000" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.578899" elapsed="0.000972"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.580017" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.580092" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:52:35.580357" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:52:35.515642" elapsed="0.064750"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.582115" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:35.581870" elapsed="0.000310">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:35.582271" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:35.581508" elapsed="0.000787"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.582627" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.582364" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.583168" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.582880" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.582708" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.582346" elapsed="0.000904"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.585803" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:35.583400" elapsed="0.002430"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:52:35.585882" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:35.586191" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:35.581069" elapsed="0.005157"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.587910" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:35.587670" elapsed="0.000302">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:35.588064" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:35.587303" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:52:35.588291" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:35.588159" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.588141" elapsed="0.000233"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.588520" 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-04-10T00:52:35.588712" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.588778" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:52:35.590896" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:35.586870" elapsed="0.004062"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.592755" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.592483" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.593199" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.592960" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:35.611797" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:35.612384" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:52:35.612691" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:35.595410" elapsed="0.017320"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.593307" elapsed="0.019484"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.613047" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.612829" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.593290" elapsed="0.019878"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.620197" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.614601" elapsed="0.006043"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.614272" elapsed="0.006411"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.614245" elapsed="0.006464"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.623455" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.620997" elapsed="0.002504"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.620768" elapsed="0.002768"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.620750" elapsed="0.002843"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.624154" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.623764" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.624490" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.624252" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.625073" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.624755" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.624590" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.624234" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.625704" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.625324" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.626036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.625801" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.626589" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.626280" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.626119" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.625783" elapsed="0.000891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:35.626824" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:35.627656" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.627337" elapsed="0.000346"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.627839" elapsed="0.002463"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:35.613682" elapsed="0.016683"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.630539" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:35.630436" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.630417" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:35.639264" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:35.630772" elapsed="0.008523"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:35.639349" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:52:35.639744" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:35.591513" elapsed="0.048270"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.639882" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:52:35.640227" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:52:35.490570" elapsed="0.149700"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.641264" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.640469" elapsed="0.000970"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.640450" elapsed="0.001030"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.641587" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:52:35.479366" elapsed="0.162419"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.475190" elapsed="0.166641"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.475172" elapsed="0.166684"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:52:35.642597" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:52:35.642454" elapsed="0.000256"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.642776" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:35.642737" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.642437" elapsed="0.000455"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.643052" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:52:35.643172" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:52:35.642150" elapsed="0.001049"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.643839" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.643376" elapsed="0.000493"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.644620" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.644029" elapsed="0.000619"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.652118" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.651379" elapsed="0.000905"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.653284" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.652599" 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-04-10T00:52:35.662326" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:35.662389" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:35 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:35 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":100038,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":100038,"Leader":"member-1-shard-inventory-config","LastIndex":100039,"RaftState":"Follower","LastApplied":100039,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":100039,"LastLeadershipChangeTime":"2026-04-10 00:51:04.372","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"292.9 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":100039,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":42104},"timestamp":1775782355,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:35.662618" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:35.655973" elapsed="0.006682"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.653584" elapsed="0.009128"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.663094" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.662776" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.653532" elapsed="0.009721"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.667946" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":100038,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":100038,"Leader":"member-1-shard-inventory-config","LastIndex":100039,"RaftState":"Follower","LastApplied":100039,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":100039,"LastLeadershipChangeTime":"2026-04-10 00:51:04.372","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"292.9 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":100039,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":42104},"timestamp":1775782355,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.665417" elapsed="0.002671"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.665188" elapsed="0.002950"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.665142" elapsed="0.003059"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.672161" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.668747" elapsed="0.003479"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.668391" elapsed="0.003883"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.668329" elapsed="0.004007"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.673444" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.672826" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.674094" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.673746" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.674918" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.674465" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.674233" elapsed="0.000772"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.673681" elapsed="0.001379"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.676004" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.675412" elapsed="0.000643"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.676445" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.676207" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.677066" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.676765" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.676597" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.676160" elapsed="0.001008"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:35.677415" elapsed="0.000450"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:35.678472" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.678124" elapsed="0.000398"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.678787" elapsed="0.002599"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:35.664093" elapsed="0.017402"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.681874" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:35.681648" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.681614" elapsed="0.000413"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:35.685724" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:35.682259" elapsed="0.003561"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:35.685909" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:52:35.686208" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:35.645645" elapsed="0.040591"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.686328" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:35.686482" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:52:35.644864" elapsed="0.041644"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.687879" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782355, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.687135" elapsed="0.000773"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:35.687957" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:35.688134" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782355, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:35.686769" elapsed="0.001392"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:35.688631" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 100039, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerIni...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.688345" elapsed="0.000316"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:35.689057" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.688820" elapsed="0.000262"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:52:35.689129" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:35.689283" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:35.473354" elapsed="0.215954"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:52:35.689365" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:52:35.689514" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:35.472625" elapsed="0.216914"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.689860" elapsed="0.000189"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.689640" elapsed="0.000447"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.690256" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.690110" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.690473" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.690332" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.689622" elapsed="0.000938"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:52:35.472270" elapsed="0.218316"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:35.202518" elapsed="0.488100"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:52:35.690661" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:52:35.690861" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:52:35.690907" level="INFO">${follower_list} = [2]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:52:35.198420" elapsed="0.492510"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.691582" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:52:35.691717" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:52:35.691103" elapsed="0.000640"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.692032" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.691813" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.691795" elapsed="0.000315"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.694223" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:52:35.692247" elapsed="0.002022"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:52:35.694755" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.694506" elapsed="0.000279"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:52:35.694833" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:52:35.195791" elapsed="0.499198"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:52:35.195521" elapsed="0.499514"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.699933" level="INFO">${return_list_reference} = [1, 2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:35.699486" elapsed="0.000476"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.700429" level="INFO">${return_list_copy} = [1, 2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:35.700124" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:35.700499" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:52:35.700684" level="INFO">${index_list} = [1, 2]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:35.699081" elapsed="0.001627"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:52:35.700863" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.701509" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:35.701179" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.701947" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:35.701711" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.702382" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:35.702123" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.705109" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.704642" elapsed="0.000493"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:35.705181" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:35.705329" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:35.704249" elapsed="0.001104"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.764506" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.764115" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.765342" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:35.765071" elapsed="0.000353">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:35.765518" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:35.764727" elapsed="0.000830"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.766110" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:35.765725" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.766441" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:52:35.766622" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:52:35.766301" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.767052" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.766807" elapsed="0.000347"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.768170" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.767909" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.768666" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.768380" elapsed="0.000312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.769022" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.769231" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.769407" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:52:35.768886" elapsed="0.000579"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.768745" elapsed="0.000751"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:52:35.769557" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:52:35.769727" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:52:35.767557" elapsed="0.002195"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.767234" elapsed="0.002551"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.769958" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.769810" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.767211" elapsed="0.002822"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.770630" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.770176" elapsed="0.000481"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.770704" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:52:35.763460" elapsed="0.007372"/>
</kw>
<msg time="2026-04-10T00:52:35.770885" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:35.750711" elapsed="0.020226"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.783726" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.796480" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.809791" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.810066" 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-04-10T00:52:35.810306" elapsed="0.000028"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.810838" elapsed="0.000093"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.810636" elapsed="0.000345"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:35.810615" elapsed="0.000401"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.811210" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.811438" 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-04-10T00:52:35.811707" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:52:35.810570" elapsed="0.001211"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.810414" elapsed="0.001402"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.812018" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.812121" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:52:35.812515" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:52:35.746266" elapsed="0.066326"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.814832" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:35.814519" elapsed="0.000391">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:35.815005" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:35.814053" elapsed="0.000977"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.815366" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.815104" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.815993" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.815689" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.815447" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.815085" elapsed="0.000996"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.818715" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:35.816263" elapsed="0.002479"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:52:35.818796" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:52:35.819115" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:35.813422" elapsed="0.005729"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.820870" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:35.820618" elapsed="0.000317">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:35.821028" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:35.820261" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:52:35.821261" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:52:35.821125" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.821107" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.821492" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.821742" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.821810" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:35.824092" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:35.819820" elapsed="0.004355"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.826010" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.825747" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.826456" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.826214" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:35.837184" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:35.837641" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:52:35.837844" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:35.828736" elapsed="0.009138"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.826627" elapsed="0.011292"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.838103" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.837946" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.826607" elapsed="0.011582"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.842576" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.839212" elapsed="0.003814"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.838988" elapsed="0.004089"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.838970" elapsed="0.004141"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.847384" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.843560" elapsed="0.003923"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.843190" elapsed="0.004345"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.843166" elapsed="0.005279"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.849981" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.848802" elapsed="0.001247"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.851009" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.850225" elapsed="0.000981"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.852741" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.851895" elapsed="0.000913"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.851283" elapsed="0.001575"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.850181" elapsed="0.002699"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.853417" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.853046" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.853805" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.853519" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.854347" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.854052" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.853893" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.853500" elapsed="0.000929"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:35.854606" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:35.855421" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.855127" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.855654" elapsed="0.003811"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:35.838565" elapsed="0.020970"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.859768" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:35.859650" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.859630" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:35.868691" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:35.859989" elapsed="0.008734"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:35.868778" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:52:35.869137" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:35.824797" elapsed="0.044378"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.869267" elapsed="0.000076"/>
</return>
<msg time="2026-04-10T00:52:35.869638" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:52:35.721126" elapsed="0.148556"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.870645" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.869884" elapsed="0.000943"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.869863" elapsed="0.001022"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.870980" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:52:35.709850" elapsed="0.161325"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.705422" elapsed="0.165799"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.705404" elapsed="0.165841"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:52:35.872032" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:35.871901" elapsed="0.000243"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.872210" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:35.872171" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.871882" elapsed="0.000445"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.872480" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:52:35.872622" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:52:35.871537" elapsed="0.001111"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.873264" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.872822" elapsed="0.000470"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.874052" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.873452" elapsed="0.000631"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.881421" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.880700" elapsed="0.000906"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.882625" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.881873" elapsed="0.000917"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:35.891744" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:35.891808" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:35 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:35 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:52:30.281","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"255.6 μs","Voting":true,"CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782355,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:35.892029" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:35.885377" elapsed="0.006689"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.882913" elapsed="0.009214"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.892527" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.892199" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.882878" elapsed="0.009831"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.899756" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:52:30.281","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"255.6 μs","Voting":true,"CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782355,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.895753" elapsed="0.004149"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.895377" elapsed="0.004564"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.895308" elapsed="0.004680"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.902865" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.900367" elapsed="0.002557"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.900126" elapsed="0.002834"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.900080" elapsed="0.002924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.903793" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.903273" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.904251" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.903999" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.904927" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.904533" elapsed="0.000423"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.904354" elapsed="0.000640"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.903952" elapsed="0.001085"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.905771" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.905302" elapsed="0.000523"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.906227" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.905981" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.906854" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.906518" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.906331" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.905933" elapsed="0.001028"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:35.907213" elapsed="0.000490"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:35.908321" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.907970" elapsed="0.000401"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.908670" elapsed="0.002520"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:35.893867" elapsed="0.017434"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.911746" elapsed="0.000054"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:35.911435" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.911402" elapsed="0.000505"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:35.915650" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:35.912143" elapsed="0.003613"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:35.915849" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:52:35.916134" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:35.875128" elapsed="0.041034"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.916220" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:35.916372" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:52:35.874302" elapsed="0.042097"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.917775" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782355, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.917045" elapsed="0.000762"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:35.917893" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:52:35.918074" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782355, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:35.916662" elapsed="0.001440"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:35.918487" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.918260" elapsed="0.000255"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:35.918943" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.918692" elapsed="0.000279"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:52:35.919018" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:35.919174" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:35.703641" elapsed="0.215558"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:52:35.919257" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:52:35.919406" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:35.702876" elapsed="0.216555"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.919796" elapsed="0.000199"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.919513" elapsed="0.000521"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.920208" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.920059" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.920431" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.920287" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.919496" elapsed="0.001009"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:35.702704" elapsed="0.217826"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.923181" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.922696" elapsed="0.000512"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:35.923254" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:35.923404" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:35.922309" elapsed="0.001120"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.983769" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:35.983345" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.984594" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:35.984313" elapsed="0.000357">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:35.984766" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:35.983973" elapsed="0.000818"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.985351" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:35.984960" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:52:35.985702" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:52:35.985859" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:52:35.985558" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.986350" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.986101" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.987569" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:35.987300" elapsed="0.000351"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.988081" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:52:35.987814" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.988443" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.988668" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.988847" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:52:35.988304" elapsed="0.000602"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:52:35.988162" elapsed="0.000775"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:52:35.988984" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:52:35.989153" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:52:35.986803" elapsed="0.002375"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.986473" elapsed="0.002737"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:35.989385" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:35.989236" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.986450" elapsed="0.003012"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:35.990066" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:35.989622" elapsed="0.000471"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:52:35.990141" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:52:35.982727" elapsed="0.007538"/>
</kw>
<msg time="2026-04-10T00:52:35.990319" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:35.969673" elapsed="0.020701"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.003496" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.016240" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.028800" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.029006" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.029185" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.029649" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.029485" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:36.029469" 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-04-10T00:52:36.029872" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.030040" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.030208" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:52:36.029436" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.029328" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.030436" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.030512" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:52:36.030830" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:52:35.965098" elapsed="0.065768"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:36.032629" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:36.032332" elapsed="0.000373">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:36.032798" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:36.031967" elapsed="0.000855"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.033145" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.032892" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.033714" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.033404" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.033226" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.032874" elapsed="0.000923"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.036180" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:36.033947" elapsed="0.002259"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:52:36.036257" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:36.036624" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:36.031479" elapsed="0.005182"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:36.038294" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:36.038048" elapsed="0.000308">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:36.038450" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:36.037706" elapsed="0.000768"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:52:36.038697" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:36.038559" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.038527" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.038929" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.039101" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.039209" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:52:36.041477" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:36.037251" elapsed="0.004264"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.043345" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.043085" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.043822" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.043561" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:36.066007" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:36.066680" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:52:36.067041" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:36.046114" elapsed="0.020971"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.043940" elapsed="0.023221"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.067463" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.067206" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.043921" elapsed="0.023740"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.074222" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.069473" elapsed="0.005267"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.069122" elapsed="0.005687"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.069091" elapsed="0.005757"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.079132" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.075285" elapsed="0.003916"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.074939" elapsed="0.004316"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.074912" elapsed="0.004380"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.080331" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.079578" elapsed="0.000793"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.080861" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.080480" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.081422" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.081113" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.080949" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.080453" elapsed="0.001054"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.082076" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.081686" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.082412" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.082177" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.082992" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.082674" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.082494" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.082158" elapsed="0.000919"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:36.083231" elapsed="0.000443"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:36.084175" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.083874" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.084359" elapsed="0.002611"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:36.068245" elapsed="0.018793"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.087221" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.087110" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.087091" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:36.101195" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:36.087439" elapsed="0.013791"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:36.101289" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:52:36.101691" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:36.042132" elapsed="0.059598"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:36.101826" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:52:36.102178" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:52:35.939330" elapsed="0.162890"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.103216" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.102422" elapsed="0.000972"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.102402" elapsed="0.001033"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:36.103525" 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="PASS" start="2026-04-10T00:52:35.927987" elapsed="0.175766"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:35.923499" elapsed="0.180300"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:35.923481" elapsed="0.180347"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:52:36.104612" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:36.104462" elapsed="0.000261"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.104789" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.104749" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.104444" elapsed="0.000457"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.105063" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:52:36.105212" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:52:36.104124" elapsed="0.001114"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.105875" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.105420" elapsed="0.000482"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.106642" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.106060" elapsed="0.000611"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.113859" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.113153" elapsed="0.000869"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.114981" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.114281" elapsed="0.000860"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:36.125873" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:36.125934" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:36 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:36 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:52:30.268","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.134","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-3-shard-topology-config","nextIndex":-1}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"629.3 μs","CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782356,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:36.126148" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:36.117652" elapsed="0.008531"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.115260" elapsed="0.010981"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.126632" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.126301" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.115228" elapsed="0.011563"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.136278" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:52:30.268","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.134","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.000","active":false,"matchIndex":-1,"voting":true,"id":"member-3-shard-topology-config","nextIndex":-1}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"629.3 μs","CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782356,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.130700" elapsed="0.005642"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.130119" elapsed="0.006258"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.130011" elapsed="0.006411"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.139250" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.136827" elapsed="0.002469"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.136594" elapsed="0.002737"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.136515" elapsed="0.002862"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.140117" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.139670" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.140605" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.140320" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.141188" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.140877" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.140708" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.140274" elapsed="0.001017"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.141978" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.141556" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.142414" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.142176" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.143014" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.142692" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.142513" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.142132" elapsed="0.000987"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:36.143369" elapsed="0.000489"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:36.144465" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.144119" elapsed="0.000405"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.144797" elapsed="0.002488"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:36.127725" elapsed="0.019668"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.147801" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.147524" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.147491" elapsed="0.000465"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:36.151858" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:36.148189" elapsed="0.003765"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:36.152045" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:52:36.152369" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:36.107804" elapsed="0.044594"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:36.152457" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:36.152674" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:52:36.106895" elapsed="0.045807"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.154069" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782356, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.153304" elapsed="0.000795"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:36.154151" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:36.154337" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782356, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:36.152934" elapsed="0.001432"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:36.154783" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.154528" elapsed="0.000287"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:36.155222" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.154979" elapsed="0.000270"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:52:36.155297" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:36.155453" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:35.921683" elapsed="0.233796"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:52:36.155537" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:52:36.155729" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:35.920941" elapsed="0.234814"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.156065" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.155840" elapsed="0.000284"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.156361" elapsed="0.000276"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.156147" elapsed="0.000531"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.156861" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.156702" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.155821" elapsed="0.001119"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:52:35.920760" elapsed="0.236204"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:35.702468" elapsed="0.454529"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:52:36.157041" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:36.157249" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:52:36.157296" level="INFO">${follower_list} = [1]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:52:35.698217" elapsed="0.459105"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.157793" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:52:36.157871" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:52:36.157502" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.158187" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.157968" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.157950" elapsed="0.000349"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.160693" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:52:36.158444" elapsed="0.002298"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:52:36.161100" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.160911" elapsed="0.000215"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:52:36.161174" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:52:35.695367" elapsed="0.465963"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:52:35.695138" elapsed="0.466239"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.165883" level="INFO">${return_list_reference} = [1, 2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:36.165487" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.166365" level="INFO">${return_list_copy} = [1, 2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:36.166070" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:36.166434" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:36.166603" level="INFO">${index_list} = [1, 2]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:36.165113" elapsed="0.001516"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:52:36.166784" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.167421" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:36.167095" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.167874" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:36.167636" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.168282" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:36.168048" elapsed="0.000259"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.170941" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.170446" elapsed="0.000522"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:36.171015" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:36.171163" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:36.170076" elapsed="0.001112"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.234149" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.233747" elapsed="0.000435"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:36.235035" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:36.234736" elapsed="0.000381">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:36.235214" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:36.234360" elapsed="0.000879"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.235865" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:36.235422" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:52:36.236203" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:52:36.236437" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:52:36.236060" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.236911" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.236646" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.237964" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.237700" elapsed="0.000310"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.238458" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.238179" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.238844" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.239057" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.239265" elapsed="0.000030"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:52:36.238701" elapsed="0.000640"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.238539" elapsed="0.000834"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:52:36.239422" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:52:36.239635" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:52:36.237354" elapsed="0.002309"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.237041" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.239878" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.239723" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.237018" elapsed="0.002940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.240572" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.240104" elapsed="0.000496"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:52:36.240659" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:52:36.233068" elapsed="0.007719"/>
</kw>
<msg time="2026-04-10T00:52:36.240842" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:36.219962" elapsed="0.020932"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.254860" elapsed="0.000175"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.269472" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.282267" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.282498" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.282797" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.283221" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.283066" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:36.283048" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.283446" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.283703" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.283893" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:52:36.283009" elapsed="0.000938"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.282892" elapsed="0.001083"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.284126" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.284207" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:52:36.284572" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:52:36.215294" elapsed="0.069318"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:36.286427" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:36.286131" elapsed="0.000370">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:36.286613" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:36.285726" elapsed="0.000912"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.286976" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.286711" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.287531" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.287233" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.287057" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.286693" elapsed="0.000960"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.290018" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:36.287805" elapsed="0.002240"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:52:36.290098" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:36.290402" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:36.285232" elapsed="0.005205"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:36.292106" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:36.291863" elapsed="0.000307">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:36.292261" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:36.291473" elapsed="0.000812"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:52:36.292488" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:36.292354" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.292336" elapsed="0.000253"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.292736" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.292912" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.293016" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:36.295315" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:36.291039" elapsed="0.004314"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.297243" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.296968" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.297718" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.297443" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:36.309137" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:36.310229" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:52:36.310808" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:36.300020" elapsed="0.010858"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.297828" elapsed="0.013167"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.311484" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.311069" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.297809" elapsed="0.013982"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.321420" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.314601" elapsed="0.007190"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.313969" elapsed="0.007862"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.313911" elapsed="0.007947"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.324672" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.322168" elapsed="0.002551"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.321923" elapsed="0.002830"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.321904" elapsed="0.002873"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.325447" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.324979" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.325838" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.325575" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.326400" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.326094" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.325927" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.325537" elapsed="0.000948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.327026" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.326663" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.327357" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.327125" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.327974" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.327670" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.327439" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.327107" elapsed="0.000949"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:36.328221" elapsed="0.000374"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:36.329078" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.328766" elapsed="0.000338"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.329269" elapsed="0.002597"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:36.312746" elapsed="0.019188"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.332110" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.332003" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.331985" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:36.340755" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:36.332324" elapsed="0.008463"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:36.340841" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:52:36.341213" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:36.296016" elapsed="0.045236"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:36.341344" elapsed="0.000087"/>
</return>
<msg time="2026-04-10T00:52:36.341740" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:52:36.186738" elapsed="0.155045"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.342778" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.341984" elapsed="0.000978"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.341964" elapsed="0.001040"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:36.343097" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:52:36.175591" elapsed="0.167703"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.171256" elapsed="0.172085"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.171238" elapsed="0.172129"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:52:36.344208" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:36.344079" elapsed="0.000241"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.344386" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.344347" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.344060" elapsed="0.000453"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.344695" elapsed="0.000024"/>
</kw>
<msg time="2026-04-10T00:52:36.344823" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:52:36.343758" elapsed="0.001092"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.345470" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.345030" elapsed="0.000469"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.346249" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.345678" elapsed="0.000601"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.353695" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.352936" elapsed="0.000931"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.354987" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.354134" elapsed="0.001019"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:36.364766" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:36.364883" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:36 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:36 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":2,"SnapshotIndex":95,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":95,"Leader":"member-1-shard-default-config","LastIndex":96,"RaftState":"Leader","LastApplied":96,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":96,"LastLeadershipChangeTime":"2026-04-10 00:49:56.029","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:16.587","active":false,"matchIndex":96,"voting":true,"id":"member-3-shard-default-config","nextIndex":97},{"timeSinceLastActivity":"00:00:00.466","active":true,"matchIndex":96,"voting":true,"id":"member-2-shard-default-config","nextIndex":97}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"365.2 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":96,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":9,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":11483},"timestamp":1775782356,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:36.365313" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:36.357792" elapsed="0.007597"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.355301" elapsed="0.010214"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.366391" elapsed="0.000104"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.365688" elapsed="0.000968"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.355265" elapsed="0.011514"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.376102" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":2,"SnapshotIndex":95,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":95,"Leader":"member-1-shard-default-config","LastIndex":96,"RaftState":"Leader","LastApplied":96,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":96,"LastLeadershipChangeTime":"2026-04-10 00:49:56.029","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:16.587","active":false,"matchIndex":96,"voting":true,"id":"member-3-shard-default-config","nextIndex":97},{"timeSinceLastActivity":"00:00:00.466","active":true,"matchIndex":96,"voting":true,"id":"member-2-shard-default-config","nextIndex":97}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"365.2 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":96,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":9,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":11483},"timestamp":1775782356,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.370970" elapsed="0.005215"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.370587" elapsed="0.005644"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.370476" elapsed="0.005823"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.379358" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.376746" elapsed="0.002663"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.376456" elapsed="0.002990"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.376404" elapsed="0.003090"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.380350" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.379856" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.380845" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.380578" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.381716" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.381244" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.380991" elapsed="0.000817"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.380513" elapsed="0.001353"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.382892" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.382259" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.383662" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.383195" elapsed="0.000560"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.384505" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.384055" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.383818" elapsed="0.000803"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.383126" elapsed="0.001552"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:36.384972" elapsed="0.000458"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:36.386073" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.385711" elapsed="0.000419"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.386390" elapsed="0.002619"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:36.368672" elapsed="0.020454"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.389512" elapsed="0.000068"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.389280" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.389243" elapsed="0.000446"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:36.393597" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757823...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:36.389925" elapsed="0.003772"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:36.393807" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:52:36.394169" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757823...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:36.347316" elapsed="0.046882"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:36.394269" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:36.394429" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757823...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:52:36.346505" elapsed="0.047952"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.395927" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782356, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.395115" elapsed="0.000843"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:36.396009" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:52:36.396198" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782356, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:36.394719" elapsed="0.001507"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:36.396672" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 96, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': False, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.396396" elapsed="0.000305"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:36.397106" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.396865" elapsed="0.000268"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:52:36.397182" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:36.397350" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:36.169457" elapsed="0.227920"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:52:36.397436" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:36.397607" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:36.168748" elapsed="0.228884"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.397936" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.397715" elapsed="0.000280"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.398227" elapsed="0.000201"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.398018" elapsed="0.000450"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.398662" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.398493" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.397698" elapsed="0.001043"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:36.168576" elapsed="0.230189"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.401474" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.400993" elapsed="0.000508"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:36.401563" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:52:36.401718" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:36.400535" elapsed="0.001209"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.464113" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.463689" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:36.465160" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:36.464868" elapsed="0.000370">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:36.465337" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:36.464358" elapsed="0.001005"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.465954" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:36.465534" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:52:36.466296" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:52:36.466511" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:52:36.466150" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.466997" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.466725" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.468138" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.467869" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.468719" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.468352" 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-04-10T00:52:36.469101" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.469311" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.469490" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:52:36.468959" elapsed="0.000605"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.468806" elapsed="0.000791"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:52:36.469648" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:52:36.469819" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:52:36.467471" elapsed="0.002374"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.467130" elapsed="0.002753"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.470057" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.469909" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.467106" elapsed="0.003029"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.470753" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.470287" elapsed="0.000495"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:52:36.470832" elapsed="0.000035"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:52:36.462961" elapsed="0.008032"/>
</kw>
<msg time="2026-04-10T00:52:36.471052" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:36.449164" elapsed="0.021945"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.484316" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.497518" elapsed="0.000081"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.510253" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.510459" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.510654" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.511037" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.510890" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:36.510874" 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-04-10T00:52:36.511260" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.511428" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.511610" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:52:36.510842" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.510736" elapsed="0.000966"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.511852" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.511929" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:52:36.512234" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:52:36.444230" elapsed="0.068040"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:36.513999" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:36.513729" elapsed="0.000341">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:36.514163" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:36.513356" elapsed="0.000832"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.514507" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.514257" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.515081" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.514786" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.514606" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.514239" elapsed="0.000923"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.517654" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:36.515313" elapsed="0.002369"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:52:36.517733" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:52:36.518101" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:36.512908" elapsed="0.005230"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:52:36.520054" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:52:36.519719" elapsed="0.000404">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:52:36.520221" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:52:36.519326" elapsed="0.000919"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:52:36.520485" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:36.520345" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.520325" elapsed="0.000283"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.520758" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.520967" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.521045" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:52:36.523384" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:52:36.518824" elapsed="0.004598"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.525432" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.525162" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.525906" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.525653" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:36.545165" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:36.546162" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:52:36.546704" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:36.528260" elapsed="0.018509"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.526073" elapsed="0.020807"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.547339" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.546948" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.526013" elapsed="0.021573"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.555184" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.550108" elapsed="0.005588"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.549576" elapsed="0.006177"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.549490" elapsed="0.006298"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.559559" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.556190" elapsed="0.003465"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.555871" elapsed="0.003834"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.555846" elapsed="0.003892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.560521" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.559982" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.561014" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.560681" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.561796" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.561355" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.561127" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.560655" elapsed="0.001261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.562665" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.562139" elapsed="0.000563"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.563129" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.562799" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.563944" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.563464" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.563241" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.562774" elapsed="0.001286"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:36.564271" elapsed="0.000503"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:36.565258" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.564963" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.565440" elapsed="0.002581"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:36.548488" elapsed="0.019599"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.568265" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.568158" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.568139" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:36.576759" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:36.568482" elapsed="0.008307"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:36.576841" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:52:36.577191" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:36.524145" elapsed="0.053084"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:36.577322" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:52:36.577694" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:52:36.417973" elapsed="0.159764"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.578707" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.577935" elapsed="0.000938"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.577915" elapsed="0.000998"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:36.579003" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:52:36.406438" elapsed="0.172761"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.401815" elapsed="0.177430"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.401797" elapsed="0.177472"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:52:36.580017" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:36.579889" elapsed="0.000241"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.580196" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.580157" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.579871" elapsed="0.000437"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.580461" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:52:36.580600" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:52:36.579573" elapsed="0.001054"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.581216" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.580798" elapsed="0.000446"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.582020" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.581425" elapsed="0.000624"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.589355" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.588645" elapsed="0.000892"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.590600" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.589828" elapsed="0.000946"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:36.600844" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:36.600918" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:36 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:36 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":95,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":95,"Leader":"member-1-shard-default-config","LastIndex":96,"RaftState":"Follower","LastApplied":96,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":96,"LastLeadershipChangeTime":"2026-04-10 00:51:04.137","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"262.5 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":96,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":11483},"timestamp":1775782356,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:36.601159" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:36.593355" elapsed="0.007842"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.590898" elapsed="0.010365"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.601700" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.601331" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.590864" elapsed="0.011012"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.608304" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":95,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":95,"Leader":"member-1-shard-default-config","LastIndex":96,"RaftState":"Follower","LastApplied":96,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":96,"LastLeadershipChangeTime":"2026-04-10 00:51:04.137","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"262.5 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":96,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":11483},"timestamp":1775782356,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.604213" elapsed="0.004251"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.603970" elapsed="0.004547"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.603922" elapsed="0.004680"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.612883" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.609196" elapsed="0.003762"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.608806" elapsed="0.004217"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.608734" elapsed="0.004365"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.614185" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.613503" elapsed="0.000754"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.614845" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.614474" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.615838" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.615260" elapsed="0.000618"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.614986" elapsed="0.000946"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.614407" elapsed="0.001583"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.616936" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.616355" elapsed="0.000633"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.617422" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.617150" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.618046" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:36.617741" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.617567" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.617094" elapsed="0.001063"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:36.618422" elapsed="0.000501"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:36.619573" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.619198" elapsed="0.000449"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.619905" elapsed="0.002552"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:36.602832" elapsed="0.019798"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.623000" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.622767" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.622733" elapsed="0.000424"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:36.627013" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757823...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:36.623397" elapsed="0.003711"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:36.627196" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:52:36.627488" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757823...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:36.583097" elapsed="0.044418"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:36.627594" elapsed="0.000059"/>
</return>
<msg time="2026-04-10T00:52:36.627803" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757823...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:52:36.582267" elapsed="0.045568"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.629183" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782356, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:36.628467" elapsed="0.000745"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:36.629307" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:52:36.629488" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782356, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:36.628088" elapsed="0.001427"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:36.629925" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 96, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.629692" elapsed="0.000260"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:36.630377" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.630139" elapsed="0.000264"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:52:36.630450" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:36.630636" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:36.399912" elapsed="0.230749"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:52:36.630720" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:52:36.630870" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:52:36.399117" elapsed="0.231778"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.631195" elapsed="0.000231"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.630977" 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-04-10T00:52:36.631714" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.631491" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.631952" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.631807" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.630960" elapsed="0.001064"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:52:36.398942" elapsed="0.233106"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:36.168357" elapsed="0.463730"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:52:36.632145" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:52:36.632397" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:52:36.632456" level="INFO">${follower_list} = [2]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:52:36.164363" elapsed="0.468123"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.632964" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:52:36.633039" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:52:36.632693" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.633377" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.633140" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.633121" elapsed="0.000348"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.636487" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:52:36.633624" elapsed="0.002952"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:52:36.637076" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.636814" elapsed="0.000297"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:52:36.637176" elapsed="0.000040"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:52:36.161707" elapsed="0.475686"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:52:36.161466" elapsed="0.475990"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:52:35.195388" elapsed="1.442111"/>
</for>
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:52:35.194998" elapsed="1.442599"/>
</kw>
<arg>${Active_Nodes}</arg>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:52:33.774865" elapsed="2.862873"/>
</kw>
<arg>${operation_timeout}</arg>
<arg>2s</arg>
<arg>ClusterOpenFlow.Check OpenFlow Shards Status</arg>
<arg>${Active_Nodes}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:52:33.774272" elapsed="2.863534"/>
</kw>
<doc>Wait for node convergence and check status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:52:23.445169" elapsed="13.192806"/>
</test>
<test id="s1-s2-t20" name="Start Mininet Connect To Follower Node" line="185">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:52:36.642463" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:52:36.642195" elapsed="0.000554"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.643810" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.643680" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.643657" elapsed="0.000235"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.649281" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.649148" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.649130" elapsed="0.000236"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.650385" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:36.650004" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.650891" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:36.650588" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:36.650961" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:36.651116" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:36.649625" elapsed="0.001515"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.656921" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.656815" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.656797" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.658151" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.658045" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.658028" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:36.658680" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.658363" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.659225" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:36.658869" elapsed="0.000382"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.692833" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:36.659810" elapsed="0.033163"/>
</kw>
<msg time="2026-04-10T00:52:36.693179" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:36.693226" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.659412" elapsed="0.033851"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.763285" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:36.693903" elapsed="0.069597"/>
</kw>
<msg time="2026-04-10T00:52:36.763773" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:36.763824" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.693478" elapsed="0.070384"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.764285" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.763976" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.763943" elapsed="0.000510"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.765001" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.764627" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.765394" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.765166" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.765148" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:36.765509" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:36.767153" elapsed="0.000872"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.768318" elapsed="0.000501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:36.769097" elapsed="0.000371"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:36.766465" elapsed="0.003130"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:36.765879" elapsed="0.003784"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:36.657743" elapsed="0.112022"/>
</kw>
<msg time="2026-04-10T00:52:36.769862" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:36.769906" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.657140" elapsed="0.112804"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:36.770132" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:36.770023" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.770003" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.770643" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.770989" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.771061" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:36.656459" elapsed="0.114713"/>
</kw>
<msg time="2026-04-10T00:52:36.771271" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:36.771315" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.651516" elapsed="0.119837"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.771739" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.771429" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.771412" elapsed="0.000409"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:36.651371" elapsed="0.120473"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.777831" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.777711" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.777525" 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-04-10T00:52:36.779173" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.779053" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.779030" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:36.779785" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.779390" elapsed="0.000424"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.780206" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:36.779979" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.816514" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:36.780816" elapsed="0.035899"/>
</kw>
<msg time="2026-04-10T00:52:36.816912" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:36.816960" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.780452" elapsed="0.036546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.893438" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:36.817640" elapsed="0.076061"/>
</kw>
<msg time="2026-04-10T00:52:36.893922" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:36.893972" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.817212" elapsed="0.076798"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.894443" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.894121" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.894091" elapsed="0.000436"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.895065" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.894696" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.895444" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.895224" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.895206" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:36.895577" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:36.897195" elapsed="0.000805"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.898281" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:36.899038" 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-04-10T00:52:36.896511" elapsed="0.002985"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:36.895937" elapsed="0.003638"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:36.778671" elapsed="0.121031"/>
</kw>
<msg time="2026-04-10T00:52:36.899797" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:36.899842" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.778060" elapsed="0.121820"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:36.900064" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:36.899958" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.899940" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.900584" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.900925" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.900997" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:36.777184" elapsed="0.123984"/>
</kw>
<msg time="2026-04-10T00:52:36.901268" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:36.901314" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.772145" elapsed="0.129207"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.901697" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.901429" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.901412" elapsed="0.000363"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:52:36.771980" elapsed="0.129819"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.907996" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.907889" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.907871" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.909201" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.909095" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.909078" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:36.909737" level="INFO">${karaf_connection_index} = 191</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.909415" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.910140" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:36.909923" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.910945" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:52:36.910684" elapsed="0.000976">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:52:36.911847" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:52:36.911893" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.910327" elapsed="0.001590"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.912690" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:52:36.912431" elapsed="0.000903">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:52:36.913517" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:52:36.913580" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.912088" elapsed="0.001517"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.914509" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Start Mininet Connect To Follower Node"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:52:36.913900" elapsed="0.000696">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Start Mininet Connect To Follower Node"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:52:36.913680" elapsed="0.000989">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Start Mininet Connect To Follower Node"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:52:36.913661" elapsed="0.001040">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Start Mininet Connect To Follower Node"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.914866" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.915093" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.914951" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:36.914935" elapsed="0.000233"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.915200" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:36.916666" elapsed="0.000770"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.917733" elapsed="0.000447"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:36.918484" elapsed="0.000385"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:36.916039" elapsed="0.002929"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:36.915460" elapsed="0.003572"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:52:36.908793" elapsed="0.010328">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Start Mininet Connect To Follower Node"</status>
</kw>
<msg time="2026-04-10T00:52:36.919224" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:52:36.919269" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Start Mininet Connect To Follower Node"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.908216" elapsed="0.011077"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.919477" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.919370" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.919352" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.920356" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:36.920252" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.920235" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.920883" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:36.920591" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.921431" level="INFO">{1: 88, 2: 153, 3: 191}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.921172" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.921887" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.921645" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.922448" elapsed="0.000324"/>
</kw>
<msg time="2026-04-10T00:52:36.922872" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:36.922918" level="INFO">${old_connection_index} = 191</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.922090" elapsed="0.000851"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:36.923798" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.925053" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:52:36.924656" elapsed="0.001250">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.924163" elapsed="0.001840"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:36.926761" elapsed="0.000271"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.926176" elapsed="0.000938"/>
</kw>
<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="PASS" start="2026-04-10T00:52:36.923237" elapsed="0.003923"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:36.923017" elapsed="0.004192"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.922999" elapsed="0.004234"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:36.928091" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.927789" elapsed="0.000329"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:52:36.928166" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:36.928317" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:36.927438" elapsed="0.000903"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.928496" elapsed="0.000419"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.929207" level="INFO">index=196
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:36.929086" elapsed="0.000285"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.929525" elapsed="0.002337"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.932293" level="INFO">Logging into '10.30.171.151:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:52:36.933296" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</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="FAIL" start="2026-04-10T00:52:36.932031" elapsed="0.001725">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:36.948417" elapsed="0.000563"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.949154" elapsed="0.000180"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:36.949489" elapsed="0.000168"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:36.934560" elapsed="0.015155"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:36.934033" elapsed="0.015733"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:52:36.919964" elapsed="0.029909">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.950262" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:36.950340" 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="FAIL" start="2026-04-10T00:52:36.907495" elapsed="0.042957">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<msg time="2026-04-10T00:52:36.950913" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:52:36.950976" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.902076" elapsed="0.048928"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.951353" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.951091" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.951071" elapsed="0.000361"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:52:36.901932" elapsed="0.049524"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:36.651197" elapsed="0.300293"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:52:36.648784" elapsed="0.302783"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:52:36.643342" elapsed="0.308288"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:36.642911" elapsed="0.308821"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:52:36.639567" elapsed="0.312223"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.954894" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.954647" elapsed="0.000298"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:36.957469" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:36.957201" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:36.957184" elapsed="0.000481"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.957956" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:36.957821" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.958693" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:36.958294" elapsed="0.000446"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.959304" level="INFO">${conn_id} = 198</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:36.958925" elapsed="0.000406"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:52:36.960298" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:52:36.960376" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:52:36.960020" elapsed="0.000379"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:36.960621" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:52:36.961811" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:52:37.410878" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:51:55 UTC 2026

  System load:  0.01               Processes:             187
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:51:57 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:52:36.961478" elapsed="0.449581"/>
</kw>
<msg time="2026-04-10T00:52:37.411150" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:36.961122" elapsed="0.450116"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:52:36.959569" elapsed="0.451787"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:52:37.412000" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:52:38.573200" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:52:38.573629" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:52:38.573740" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:52:37.411641" elapsed="1.162158"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:38.574269" elapsed="0.000737"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:38.576145" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:38.575436" elapsed="0.000835"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:52:38.576779" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:38.576452" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:38.576399" elapsed="0.000541"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:52:38.577297" elapsed="0.000067"/>
</return>
<status status="PASS" start="2026-04-10T00:52:38.577059" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:38.577025" elapsed="0.000472"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:52:38.577605" elapsed="0.000035"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:38.584337" elapsed="0.000654"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:38.585162" elapsed="0.000164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:38.585477" elapsed="0.000118"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:38.578319" elapsed="0.007330"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:52:36.956666" elapsed="1.629149"/>
</kw>
<msg time="2026-04-10T00:52:38.585872" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:36.956046" elapsed="1.629880"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:52:36.955511" elapsed="1.630495"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:38.588131" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:38.587851" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:38.587831" elapsed="0.000382"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:38.588503" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:38.588366" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:38.589193" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:38.588810" elapsed="0.000430"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:38.589781" level="INFO">${conn_id} = 200</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:38.589400" elapsed="0.000408"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:52:38.590721" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:52:38.590798" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:52:38.590425" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:38.590987" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:52:38.592191" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:52:38.905661" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:51:55 UTC 2026

  System load:  0.01               Processes:             187
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:52:37 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:52:38.591873" elapsed="0.313939"/>
</kw>
<msg time="2026-04-10T00:52:38.905898" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:38.591473" elapsed="0.314506"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:52:38.590027" elapsed="0.316066"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:52:38.906587" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:52:38.938917" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:52:38.939164" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:52:38.939261" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:52:38.906333" elapsed="0.032979"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:38.939764" elapsed="0.000474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:38.941299" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:38.940690" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:52:38.941995" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:38.941598" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:38.941519" elapsed="0.000645"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:52:38.942528" elapsed="0.000093"/>
</return>
<status status="PASS" start="2026-04-10T00:52:38.942286" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:38.942250" elapsed="0.000505"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:52:38.942834" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:38.947833" elapsed="0.000443"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:38.948510" elapsed="0.000241"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:38.948962" elapsed="0.000136"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:38.943531" elapsed="0.005639"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:52:38.587271" elapsed="0.362029"/>
</kw>
<msg time="2026-04-10T00:52:38.949376" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:38.586707" elapsed="0.362739"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:52:38.586187" elapsed="0.363392"/>
</kw>
<arg>${mininet}</arg>
<status status="PASS" start="2026-04-10T00:52:36.955151" elapsed="1.994510"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:38.957108" level="INFO">${tools_connection} = 202</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:38.956661" elapsed="0.000475"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:52:38.959006" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:52:38.959085" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:52:38.958707" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:38.959272" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:52:38.960488" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:52:39.322302" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:51:55 UTC 2026

  System load:  0.01               Processes:             187
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:52:38 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:52:38.960171" elapsed="0.362298"/>
</kw>
<msg time="2026-04-10T00:52:39.322574" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:38.959806" elapsed="0.362855"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:52:38.958119" elapsed="0.364663"/>
</kw>
<msg time="2026-04-10T00:52:39.322835" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:38.957724" elapsed="0.365159"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:52:38.957326" elapsed="0.365642"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-10T00:52:39.323021" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:52:39.323243" level="INFO">${mininet_conn_id} = 202</msg>
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-10T00:52:38.955936" elapsed="0.367333"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.324027" level="INFO">${mininet_conn_id} = 202</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:52:39.323563" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.326507" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:39.324247" elapsed="0.002333"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.324223" elapsed="0.002383"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.327072" level="INFO">Start mininet --topo linear,1 to 10.30.170.169</msg>
<arg>Start mininet ${options} to ${controller}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.326768" elapsed="0.000351"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.329655" level="INFO">sudo mn --controller 'remote,ip=10.30.170.169,port=6633' --topo linear,1 --switch ovsk,protocols=OpenFlow13</msg>
<arg>sudo mn --controller 'remote,ip=${controller},port=${ofport}' ${options} --switch ovsk,protocols=OpenFlow${ofversion}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:39.327287" elapsed="0.002427"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.502885" level="INFO">[?2004l*** Creating network
*** Adding controller
*** Adding hosts:
h1 
*** Adding switches:
s1 
*** Adding links:
(h1, s1) 
*** Configuring hosts
h1 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:52:39.329877" elapsed="0.173081"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.503380" level="INFO">Check OVS configuratiom</msg>
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.503146" elapsed="0.000280"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.504895" level="INFO">sh ovs-vsctl show</msg>
<arg>sh ovs-vsctl show</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:39.503605" elapsed="0.001352"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.512244" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Bridge s1
        Controller "tcp:10.30.170.169:6633"
        Controller "ptcp:6654"
        fail_mode: secure
        Port s1
            Interface s1
                type: internal
        Port s1-eth1
            Interface s1-eth1
    ovs_version: "2.17.11"
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:52:39.505118" elapsed="0.007189"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="PASS" start="2026-04-10T00:52:39.512356" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:52:39.512534" level="INFO">${mininet_conn_id} = 202</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${Follower_Node_1}_IP}</arg>
<arg>--topo linear,${switch_count}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="PASS" start="2026-04-10T00:52:36.952108" elapsed="2.560472"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.513101" level="INFO">${mininet_conn_id} = 202</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:52:39.512782" elapsed="0.000361"/>
</kw>
<doc>Start mininet with connection to Follower Node1.</doc>
<status status="PASS" start="2026-04-10T00:52:36.638738" elapsed="2.874519"/>
</test>
<test id="s1-s2-t21" name="Add Bulk Flow From Follower Node1" line="193">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:52:39.516826" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:52:39.516537" elapsed="0.000557"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.518123" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:39.518005" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.517986" elapsed="0.000205"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.523343" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:39.523236" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.523218" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.524449" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:39.524066" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.524964" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:39.524656" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:39.525034" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:39.525189" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:39.523657" elapsed="0.001557"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.530982" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:39.530874" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.530854" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.532254" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:39.532147" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.532129" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:39.532855" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:39.532528" elapsed="0.000355"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.533279" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:39.533045" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.566685" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:39.533847" elapsed="0.033005"/>
</kw>
<msg time="2026-04-10T00:52:39.567100" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:39.567171" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.533468" elapsed="0.033759"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.631443" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:39.568084" elapsed="0.063505"/>
</kw>
<msg time="2026-04-10T00:52:39.631770" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:39.631817" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.567491" elapsed="0.064363"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.632163" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:39.631934" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.631914" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.632718" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.632387" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.633094" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:39.632875" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.632857" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:39.633206" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:39.635760" elapsed="0.000155"/>
</kw>
<msg time="2026-04-10T00:52:39.635977" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:39.634659" elapsed="0.001449"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.636387" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.636757" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:39.634023" elapsed="0.002918"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:39.633470" elapsed="0.003539"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:39.531845" elapsed="0.105262"/>
</kw>
<msg time="2026-04-10T00:52:39.637198" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:39.637242" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.531206" elapsed="0.106074"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:39.637464" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:39.637357" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.637339" elapsed="0.000232"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.637976" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.638356" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.638428" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:39.530510" elapsed="0.108027"/>
</kw>
<msg time="2026-04-10T00:52:39.638647" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:39.638696" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.525610" elapsed="0.113123"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.639059" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:39.638809" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.638792" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:39.525448" elapsed="0.113711"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.644924" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:39.644817" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.644798" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.646155" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:39.646049" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.646032" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:39.646675" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:39.646367" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.647090" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:39.646867" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.677285" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:39.647628" elapsed="0.029762"/>
</kw>
<msg time="2026-04-10T00:52:39.677571" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:39.677620" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.647276" elapsed="0.030380"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.745531" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:39.678171" elapsed="0.067499"/>
</kw>
<msg time="2026-04-10T00:52:39.745830" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:39.745875" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.677830" elapsed="0.068082"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.746212" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:39.745989" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.745970" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.746749" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.746431" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.747117" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:39.746902" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.746884" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:39.747226" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:39.749792" elapsed="0.000154"/>
</kw>
<msg time="2026-04-10T00:52:39.750006" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:39.748742" elapsed="0.001390"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.750404" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.750762" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:39.748112" elapsed="0.002838"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:39.747520" elapsed="0.003493"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:39.645749" elapsed="0.105361"/>
</kw>
<msg time="2026-04-10T00:52:39.751201" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:39.751244" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.645147" elapsed="0.106134"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:39.751463" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:52:39.751359" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.751340" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.751976" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.752312" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.752385" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:39.644448" elapsed="0.108044"/>
</kw>
<msg time="2026-04-10T00:52:39.752601" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:39.752647" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.639423" elapsed="0.113261"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.753007" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:39.752759" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.752742" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:52:39.639282" elapsed="0.113823"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.758887" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:39.758780" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.758761" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.760188" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:39.760082" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.760065" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:39.760716" level="INFO">${karaf_connection_index} = 196</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:39.760398" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.761124" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:39.760900" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.761908" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:52:39.761659" elapsed="0.000941">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:52:39.762784" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:52:39.762830" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.761309" elapsed="0.001544"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.763672" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:52:39.763416" elapsed="0.000942">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:52:39.764556" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:52:39.764605" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.763072" elapsed="0.001556"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.765522" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Add Bulk Flow From Follower Node1"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:52:39.764924" elapsed="0.000686">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Add Bulk Flow From Follower Node1"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:52:39.764705" elapsed="0.000976">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Add Bulk Flow From Follower Node1"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:52:39.764686" elapsed="0.001027">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Add Bulk Flow From Follower Node1"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.765875" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.766102" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:39.765961" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:39.765944" elapsed="0.000232"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.766209" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:39.768769" elapsed="0.000158"/>
</kw>
<msg time="2026-04-10T00:52:39.768989" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:39.767653" elapsed="0.001460"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.769381" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.769744" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:39.767033" elapsed="0.002891"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:39.766468" elapsed="0.003524"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:52:39.759782" elapsed="0.010296">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Add Bulk Flow From Follower Node1"</status>
</kw>
<msg time="2026-04-10T00:52:39.770179" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:52:39.770223" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Add Bulk Flow From Follower Node1"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.759159" elapsed="0.011089"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.770431" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:39.770325" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.770307" elapsed="0.000190"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.771472" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:39.771368" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.771351" elapsed="0.000202"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.771873" level="INFO">index=202
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:39.771739" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.772417" level="INFO">{1: 88, 2: 153, 3: 196}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.772158" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.772876" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.772629" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:39.773437" elapsed="0.000358"/>
</kw>
<msg time="2026-04-10T00:52:39.773896" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:39.773943" level="INFO">${old_connection_index} = 196</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.773081" elapsed="0.000885"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:39.774797" elapsed="0.000208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.776070" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:52:39.775664" elapsed="0.001252">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.775175" elapsed="0.001842"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:39.777756" elapsed="0.000275"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.777189" elapsed="0.000923"/>
</kw>
<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="PASS" start="2026-04-10T00:52:39.774262" elapsed="0.003895"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:39.774041" elapsed="0.004165"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.774023" elapsed="0.004207"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:39.779074" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:39.778774" elapsed="0.000326"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:52:39.779147" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:39.779298" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:39.778435" elapsed="0.000888"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:39.779476" elapsed="0.000472"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.780236" level="INFO">index=203
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:39.780118" elapsed="0.000243"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:52:39.780508" elapsed="0.002416"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:52:39.783356" level="INFO">Logging into '10.30.171.151:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:52:39.784589" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</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="FAIL" start="2026-04-10T00:52:39.783097" elapsed="0.001907">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:39.799708" elapsed="0.000410"/>
</kw>
<msg time="2026-04-10T00:52:39.800209" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:39.797960" elapsed="0.002399"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.800523" elapsed="0.000038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.800706" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:39.785911" elapsed="0.014877"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:39.785313" elapsed="0.015520"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:52:39.770904" elapsed="0.030010">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.801252" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.801368" 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="FAIL" start="2026-04-10T00:52:39.758365" elapsed="0.043117">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<msg time="2026-04-10T00:52:39.801608" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:52:39.801653" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.753367" elapsed="0.048310"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.802019" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:39.801759" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.801740" elapsed="0.000354"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:52:39.753226" elapsed="0.048892"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:39.525271" elapsed="0.276879"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:52:39.522875" elapsed="0.279337"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:52:39.517711" elapsed="0.284561"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:39.517249" elapsed="0.285079"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:52:39.514297" elapsed="0.288089"/>
</kw>
<kw name="Add Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Add Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.813404" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:39.813099" elapsed="0.000332"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:39.813475" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:39.813641" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:39.812750" elapsed="0.000916"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.827614" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.827348" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.828078" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.827838" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.828518" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.828276" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.828968" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.828731" elapsed="0.000280"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:39.829819" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:52:39.829623" elapsed="0.000222"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:52:39.830172" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:52:39.830003" elapsed="0.000194"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:52:39.830345" elapsed="0.000210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.830960" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.830712" elapsed="0.000292"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:52:39.831045" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:39.831200" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:52:39.829208" elapsed="0.002016"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:39.871676" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Content-Length': '403', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:52:39.871913" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:39.872153" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:39.833539" elapsed="0.038672"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:39.831294" elapsed="0.041020"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.872757" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:39.872374" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.831277" elapsed="0.041680"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.878965" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.875287" elapsed="0.003739"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:39.874793" elapsed="0.004283"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.874754" elapsed="0.004356"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.882898" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.879495" elapsed="0.003468"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:39.879188" elapsed="0.003824"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.879165" elapsed="0.003880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.883861" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:39.883276" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.884327" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:39.883999" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.885104" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:39.884687" elapsed="0.000455"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:39.884440" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.883974" elapsed="0.001247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.885969" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:39.885443" elapsed="0.000563"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.886425" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:39.886103" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.887201" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:39.886787" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:39.886537" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.886078" elapsed="0.001237"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:39.887521" elapsed="0.000526"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:39.888496" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:39.888213" elapsed="0.000309"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:39.888704" elapsed="0.002548"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:39.873786" elapsed="0.017530"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.891493" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:39.891389" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.891371" elapsed="0.000203"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:39.894169" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:39.891741" elapsed="0.002455"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:39.894245" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:39.894400" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:39.824469" elapsed="0.069955"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:39.894526" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:52:39.894699" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:52:39.821866" elapsed="0.072858"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:39.894773" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:52:39.894917" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:39.812292" elapsed="0.082648"/>
</kw>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Add Bulk Flow in member 2 according to ${json_body_add}.</doc>
<status status="PASS" start="2026-04-10T00:52:39.807722" elapsed="0.087279"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.901901" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:39.901602" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:39.901973" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:39.902119" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:39.901243" elapsed="0.000899"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.908891" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.908643" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.909340" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.909093" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:39.916666" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:39.916801" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:39 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:39 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782359,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:39.917021" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:39.911584" elapsed="0.005497"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:39.909449" elapsed="0.007740"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.917688" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:39.917269" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.909432" elapsed="0.008464"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.926854" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782359,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.920423" elapsed="0.006540"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:39.919890" elapsed="0.007153"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.919847" elapsed="0.007252"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.930359" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:39.927892" elapsed="0.002514"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:39.927250" elapsed="0.003191"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.927202" elapsed="0.003264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.931026" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:39.930649" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.931363" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:39.931125" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.931955" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:39.931624" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:39.931445" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.931107" elapsed="0.000968"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.932629" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:39.932242" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.932962" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:39.932726" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.933503" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:39.933206" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:39.933044" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.932708" elapsed="0.000895"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:39.933753" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:39.934560" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:39.934271" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:39.934747" elapsed="0.002454"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:39.918771" elapsed="0.018496"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:39.937443" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:39.937338" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:39.937320" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:39.937694" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:39.937766" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:39.940168" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782359,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:39.902473" elapsed="0.037724"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:39.940248" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:39.940398" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782359,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:39.900793" elapsed="0.039630"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.941496" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782359, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:39.941083" elapsed="0.000442"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:39.941593" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:39.941756" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782359, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:39.940733" elapsed="0.001050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:39.942142" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:39.941961" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.942671" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:39.942347" elapsed="0.000350"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.943134" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:39.942870" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:39.943727" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:39.943331" elapsed="0.000471">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:39.896230" elapsed="0.047680">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:40.960276" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:40.959710" elapsed="0.000615"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:40.960507" elapsed="0.000084"/>
</return>
<msg time="2026-04-10T00:52:40.960799" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:40.959123" elapsed="0.001717"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:40.971570" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:40.971121" elapsed="0.000531"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:40.972306" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:40.971919" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:40.979877" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:40.979938" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:40 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:40 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782360,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:40.980033" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:40.975359" elapsed="0.004700"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:40.972497" elapsed="0.007607"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:40.980302" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:40.980133" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:40.972463" elapsed="0.007929"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:40.983901" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782360,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:40.981449" elapsed="0.002504"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:40.981213" elapsed="0.002775"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:40.981194" elapsed="0.002819"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:40.986734" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:40.984296" elapsed="0.002485"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:40.984070" elapsed="0.002746"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:40.984053" elapsed="0.002787"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:40.987417" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:40.987024" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:40.987811" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:40.987515" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:40.988532" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:40.988111" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:40.987895" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:40.987497" elapsed="0.001173"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:40.989397" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:40.988893" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:40.989885" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:40.989531" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:40.990908" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:40.990407" elapsed="0.000541"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:40.990001" elapsed="0.000997"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:40.989506" elapsed="0.001523"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:40.991254" elapsed="0.000572"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:40.992474" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:40.992066" elapsed="0.000445"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:40.992861" elapsed="0.005234"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:40.980787" elapsed="0.017404"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:40.998413" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:52:40.998291" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:40.998263" elapsed="0.000251"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:40.998729" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:40.998806" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:52:41.001824" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782360,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:40.961379" elapsed="0.040486"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:41.001936" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:52:41.002129" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782360,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:40.958368" elapsed="0.043789"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.003497" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782360, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:41.002937" elapsed="0.000592"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:41.003602" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:52:41.003838" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782360, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:41.002471" elapsed="0.001394"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:41.004270" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:41.004066" elapsed="0.000233"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.004824" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:41.004482" elapsed="0.000369"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.005303" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:41.005030" elapsed="0.000300"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:52:41.005505" elapsed="0.000344"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:52:40.944966" elapsed="0.060952"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:52:39.895626" elapsed="1.110347"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 2.</doc>
<status status="PASS" start="2026-04-10T00:52:39.895219" elapsed="1.110820"/>
</kw>
<arg>${temp_json_config_add}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Add Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:52:39.807202" elapsed="1.198893"/>
</kw>
<doc>10000 Flows added via Follower Node1 and verify it gets applied in all instances.</doc>
<status status="PASS" start="2026-04-10T00:52:39.513675" elapsed="1.492549"/>
</test>
<test id="s1-s2-t22" name="Get Bulk Flows And Verify In Leader Before Follower Restart" line="197">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:52:41.010211" elapsed="0.000264"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:52:41.009902" elapsed="0.000665"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.011758" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:41.011574" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.011527" elapsed="0.000309"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.017526" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:41.017379" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.017352" elapsed="0.000283"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.018946" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:41.018407" elapsed="0.000666"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.019689" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:41.019267" elapsed="0.000455"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:41.019777" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:52:41.019967" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:41.017937" elapsed="0.002055"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.026708" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:41.026508" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.026470" elapsed="0.000333"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.028302" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:41.028170" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.028152" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:41.028892" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:41.028523" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:41.029381" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:41.029115" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:41.077494" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:41.029961" elapsed="0.047719"/>
</kw>
<msg time="2026-04-10T00:52:41.077885" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:41.077933" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.029604" elapsed="0.048367"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:41.169814" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "A "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:41.078642" elapsed="0.091344"/>
</kw>
<msg time="2026-04-10T00:52:41.170175" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:41.170224" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.078201" elapsed="0.092060"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.170677" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:41.170372" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.170344" elapsed="0.000431"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.171256" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "A "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:41.170925" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.171719" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:41.171430" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.171412" elapsed="0.000396"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:41.171845" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:41.174594" elapsed="0.000167"/>
</kw>
<msg time="2026-04-10T00:52:41.174834" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:41.173436" elapsed="0.001597"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.175319" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.175794" 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-04-10T00:52:41.172767" elapsed="0.003237"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:41.172171" elapsed="0.003898"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:41.027850" elapsed="0.148320"/>
</kw>
<msg time="2026-04-10T00:52:41.176268" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:41.176313" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.027020" elapsed="0.149331"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:41.176540" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-10T00:52:41.176431" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.176413" elapsed="0.000232"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.177066" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.177409" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.177483" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:41.025939" elapsed="0.151675"/>
</kw>
<msg time="2026-04-10T00:52:41.177714" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:41.177760" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.020457" elapsed="0.157344"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.178143" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:41.177888" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.177870" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:41.020275" elapsed="0.157968"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.184422" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:41.184311" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.184291" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.185710" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:41.185599" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.185578" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:41.186248" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:41.185929" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:41.186696" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:41.186441" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:41.216257" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:52:41.187251" elapsed="0.029274"/>
</kw>
<msg time="2026-04-10T00:52:41.216816" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:52:41.216868" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.186888" elapsed="0.030031"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:41.344855" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "A "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:52:41.217710" elapsed="0.127611"/>
</kw>
<msg time="2026-04-10T00:52:41.345615" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:52:41.345672" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.217202" elapsed="0.128509"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.346215" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:41.345855" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.345809" elapsed="0.000497"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.346890" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "A "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:41.346455" elapsed="0.000538"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.347288" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:41.347063" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.347044" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:52:41.347405" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:41.350104" elapsed="0.000162"/>
</kw>
<msg time="2026-04-10T00:52:41.350332" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:41.349067" elapsed="0.001404"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.350779" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.351115" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:41.348389" elapsed="0.002911"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:41.347789" elapsed="0.003578"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:52:41.185261" elapsed="0.166208"/>
</kw>
<msg time="2026-04-10T00:52:41.351588" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:41.351635" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.184668" elapsed="0.167027"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:52:41.351893" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:52:41.351780" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.351760" elapsed="0.000219"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.352407" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.352776" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.352850" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:52:41.183948" elapsed="0.169016"/>
</kw>
<msg time="2026-04-10T00:52:41.353063" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:41.353108" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.178520" elapsed="0.174630"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.353481" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:41.353228" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.353211" elapsed="0.000365"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:52:41.178376" elapsed="0.175224"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.359777" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:41.359624" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.359598" elapsed="0.000260"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.361196" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:41.361086" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.361068" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:41.361865" level="INFO">${karaf_connection_index} = 203</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:41.361411" elapsed="0.000482"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:41.362294" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:41.362060" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:41.363120" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:52:41.362844" elapsed="0.001056">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:52:41.364092" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:52:41.364138" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.362483" elapsed="0.001678"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:52:41.364943" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:52:41.364694" elapsed="0.000908">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:52:41.365788" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:52:41.365834" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.364333" elapsed="0.001525"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.366793" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Get Bulk Flows And Verify In Leader Before Follower Restart"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:52:41.366169" elapsed="0.000687">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Get Bulk Flows And Verify In Leader Before Follower Restart"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:52:41.365938" elapsed="0.000990">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Get Bulk Flows And Verify In Leader Before Follower Restart"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:52:41.365920" elapsed="0.001042">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Get Bulk Flows And Verify In Leader Before Follower Restart"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.367126" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.367353" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:41.367213" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:52:41.367196" elapsed="0.000232"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.367461" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:41.370046" elapsed="0.000158"/>
</kw>
<msg time="2026-04-10T00:52:41.370273" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:41.368963" elapsed="0.001440"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.370695" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.371027" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:41.368330" elapsed="0.002884"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:41.367791" elapsed="0.003486"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:52:41.360783" elapsed="0.010580">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Get Bulk Flows And Verify In Leader Before Follower Restart"</status>
</kw>
<msg time="2026-04-10T00:52:41.371464" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:52:41.371609" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Get Bulk Flows And Verify In Leader Before Fo...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.360048" elapsed="0.011588"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.371839" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:41.371731" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.371712" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.372916" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:41.372810" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.372792" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:41.373281" level="INFO">index=202
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:41.373145" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.373905" level="INFO">{1: 88, 2: 153, 3: 203}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:41.373639" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.374367" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:41.374123" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:41.374953" elapsed="0.000260"/>
</kw>
<msg time="2026-04-10T00:52:41.375313" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:52:41.375359" level="INFO">${old_connection_index} = 203</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.374591" elapsed="0.000790"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:41.376243" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:52:41.377688" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:52:41.377186" elapsed="0.001332">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.376636" elapsed="0.001999"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:52:41.379272" elapsed="0.000293"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.378808" elapsed="0.000862"/>
</kw>
<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="PASS" start="2026-04-10T00:52:41.375731" elapsed="0.003987"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:41.375457" elapsed="0.004310"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.375439" elapsed="0.004353"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:41.380650" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:41.380329" elapsed="0.000348"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:52:41.380726" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:41.380877" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:41.379999" elapsed="0.000902"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:52:41.381056" elapsed="0.000421"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:52:41.381786" level="INFO">index=204
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:52:41.381663" elapsed="0.000248"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:52:41.382066" elapsed="0.002595"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:52:41.385091" level="INFO">Logging into '10.30.171.151:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:52:41.386232" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</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="FAIL" start="2026-04-10T00:52:41.384830" elapsed="0.001835">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:52:41.401076" elapsed="0.000397"/>
</kw>
<msg time="2026-04-10T00:52:41.401575" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:41.399298" elapsed="0.002426"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.401886" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.402048" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:52:41.387451" elapsed="0.014679"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:52:41.386942" elapsed="0.015235"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:52:41.372306" elapsed="0.029950">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.402606" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.402680" 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="FAIL" start="2026-04-10T00:52:41.359165" elapsed="0.043618">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<msg time="2026-04-10T00:52:41.402889" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:52:41.402933" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.353883" elapsed="0.049073"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.403285" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:41.403034" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.403016" elapsed="0.000345"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:52:41.353735" elapsed="0.049650"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:41.020058" elapsed="0.383361"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:52:41.016834" elapsed="0.386642"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:52:41.011228" elapsed="0.392306"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:52:41.010754" elapsed="0.393064"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:52:41.007496" elapsed="0.396380"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.413982" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:52:41.413608" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.414461" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:52:41.414169" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:52:41.414529" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:52:41.414700" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:52:41.413215" elapsed="0.001510"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.425214" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:41.424915" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:41.425287" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:41.425474" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:41.424562" elapsed="0.000937"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.439668" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:41.439379" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.440112" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:41.439873" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.440571" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:41.440311" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.441008" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:41.440769" elapsed="0.000282"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:41.441870" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:52:41.441673" elapsed="0.000222"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:52:41.442223" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:52:41.442054" elapsed="0.000194"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:52:41.442397" elapsed="0.000203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.443005" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:41.442757" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:52:41.443091" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:41.443244" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:52:41.441253" elapsed="0.002016"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:41.457229" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:52:41.457351" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:41.457614" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:41.445457" elapsed="0.012221"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:41.443341" elapsed="0.014446"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.458227" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:41.457851" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.443323" elapsed="0.015101"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.467082" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:41.460830" elapsed="0.006356"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:41.460306" elapsed="0.006964"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.460266" elapsed="0.007062"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.470402" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:41.468014" elapsed="0.002433"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:41.467460" elapsed="0.003022"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.467419" elapsed="0.003087"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.471099" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:41.470700" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.471433" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:41.471195" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.472019" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:41.471719" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:41.471514" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.471177" elapsed="0.000923"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.472693" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:41.472312" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.473022" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:41.472789" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.473570" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:41.473262" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:41.473103" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.472771" elapsed="0.000883"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:41.473808" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:41.474618" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:41.474315" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:41.474799" elapsed="0.002440"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:41.459260" elapsed="0.018043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.477483" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:52:41.477376" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.477358" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:52:41.480199" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:52:41.477715" elapsed="0.002512"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:52:41.480275" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:52:41.480433" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:41.436667" elapsed="0.043790"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:41.480522" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:52:41.480690" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:52:41.433917" elapsed="0.046796"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:41.480765" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:52:41.480908" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:41.424112" elapsed="0.056820"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:52:41.419556" elapsed="0.061437"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:41.414910" elapsed="0.066117"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:41.414780" elapsed="0.066280"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.492720" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:41.492405" elapsed="0.000342"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:41.492792" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:41.492939" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:41.492058" elapsed="0.000905"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.499865" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:41.499580" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.500438" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:41.500071" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:41.506687" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:41.506742" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:41 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:41 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782361,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:41.506834" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:41.502720" elapsed="0.004140"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:41.500565" elapsed="0.006337"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.507083" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:41.506929" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.500531" elapsed="0.006637"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.511833" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782361,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:41.508338" elapsed="0.003564"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:41.508033" elapsed="0.003930"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.508006" elapsed="0.003999"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.516688" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:41.512473" elapsed="0.004267"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:41.512098" elapsed="0.004681"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.512070" elapsed="0.004735"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.517441" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:41.517009" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.517846" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:41.517582" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.518397" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:41.518096" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:41.517929" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.517532" elapsed="0.000948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.519019" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:41.518657" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.519349" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:41.519116" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.519921" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:41.519604" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:41.519428" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.519098" elapsed="0.000905"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:41.520150" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:41.520946" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:41.520675" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:41.521125" elapsed="0.002431"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:41.507517" elapsed="0.016102"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:41.523877" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:52:41.523769" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:41.523748" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:41.524114" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:41.524251" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:52:41.526606" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782361,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:41.493296" elapsed="0.033339"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:41.526687" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:41.526839" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782361,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:41.491527" elapsed="0.035338"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.527869" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782361, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:41.527426" elapsed="0.000472"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:41.527946" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:41.528099" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782361, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:41.527087" elapsed="0.001038"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:41.528485" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:41.528304" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.529008" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:41.528705" elapsed="0.000329"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.529467" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:41.529205" elapsed="0.000288"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:41.530043" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:41.529681" elapsed="0.000439">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:41.486957" elapsed="0.043277">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:42.541816" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:42.541289" elapsed="0.000572"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:42.541943" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T00:52:42.542178" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:42.540788" elapsed="0.001425"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:42.549585" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:42.549309" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:42.550034" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:42.549791" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:42.557874" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:42.557934" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:42 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:42 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782362,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:42.558027" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:42.552470" elapsed="0.005583"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:42.550154" elapsed="0.007941"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:42.558276" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:42.558122" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:42.550132" elapsed="0.008292"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:42.561995" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782362,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:42.559469" elapsed="0.002578"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:42.559242" elapsed="0.002840"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:42.559224" elapsed="0.002882"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:42.565391" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:42.562384" elapsed="0.003073"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:42.562162" elapsed="0.003343"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:42.562145" elapsed="0.003394"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:42.566387" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:42.565840" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:42.566889" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:42.566524" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:42.567686" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:42.567228" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:42.567003" elapsed="0.000771"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:42.566498" elapsed="0.001305"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:42.568536" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:42.568028" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:42.569023" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:42.568695" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:42.569794" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:42.569360" elapsed="0.000470"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:42.569135" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:42.568669" elapsed="0.001240"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:42.570122" elapsed="0.000507"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:42.571260" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:42.570864" elapsed="0.000432"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:42.571515" elapsed="0.002681"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:42.558808" elapsed="0.015453"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:42.574444" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:52:42.574336" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:42.574316" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:42.574706" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:42.574780" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:42.577193" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782362,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:42.542720" elapsed="0.034502"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:42.577276" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:42.577430" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782362,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:42.540098" elapsed="0.037358"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:42.578463" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782362, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:42.578059" elapsed="0.000432"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:42.578590" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:42.578748" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782362, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:42.577696" elapsed="0.001078"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:42.579130" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:42.578951" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:42.579662" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:42.579331" elapsed="0.000357"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:42.580124" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:42.579863" elapsed="0.000287"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:42.580681" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:42.580321" elapsed="0.000431">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:42.531238" elapsed="0.049622">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:43.595001" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:43.594084" elapsed="0.000981"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:43.595180" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:52:43.595521" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:43.593274" elapsed="0.002377"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:43.603043" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:43.602783" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:43.603492" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:43.603248" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:43.609295" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:43.609353" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:43 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782363,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:43.609448" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:43.605763" elapsed="0.003712"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:43.603647" elapsed="0.005871"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:43.609720" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:43.609562" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:43.603626" elapsed="0.006183"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:43.613344" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782363,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:43.610828" elapsed="0.002565"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:43.610606" elapsed="0.002822"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:43.610587" elapsed="0.002866"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:43.616330" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:43.613747" elapsed="0.002652"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:43.613509" elapsed="0.002940"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:43.613492" elapsed="0.002994"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:43.617331" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:43.616763" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:43.617854" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:43.617476" elapsed="0.000530"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:43.618769" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:43.618297" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:43.618047" elapsed="0.000815"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:43.617449" elapsed="0.001445"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:43.619874" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:43.619135" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:43.620369" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:43.620021" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:43.621194" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:43.620751" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:43.620489" elapsed="0.000797"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:43.619995" elapsed="0.001322"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:43.621583" elapsed="0.000526"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:43.622805" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:43.622356" elapsed="0.000488"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:43.623079" elapsed="0.003764"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:43.610170" elapsed="0.016777"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:43.627230" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-10T00:52:43.627067" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:43.627036" elapsed="0.000330"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:43.627671" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:43.627779" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:52:43.630390" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782363,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:43.596378" elapsed="0.034041"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:43.630473" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:52:43.630642" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782363,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:43.592222" elapsed="0.038446"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:43.631781" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782363, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:43.631315" elapsed="0.000495"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:43.631859" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:43.632014" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782363, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:43.630921" elapsed="0.001119"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:43.632409" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:43.632227" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:43.632939" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:43.632629" elapsed="0.000335"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:43.633397" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:43.633136" elapsed="0.000287"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:43.633966" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:43.633612" elapsed="0.000426">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:43.581733" elapsed="0.052540">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:44.650166" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:44.649785" elapsed="0.000425"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:44.650287" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:52:44.650464" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:44.649404" elapsed="0.001086"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:44.657479" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:44.657217" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:44.657963" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:44.657709" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:44.664630" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:44.664693" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:44 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782364,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:44.664802" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:44.660297" elapsed="0.004532"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:44.658084" elapsed="0.006791"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:44.665060" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:44.664902" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:44.658062" elapsed="0.007084"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:44.669213" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782364,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:44.666244" elapsed="0.003039"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:44.666010" elapsed="0.003322"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:44.665992" elapsed="0.003374"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:44.673366" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:44.669787" elapsed="0.003646"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:44.669447" elapsed="0.004036"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:44.669422" elapsed="0.004094"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:44.674500" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:44.673792" elapsed="0.000768"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:44.674998" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:44.674666" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:44.676062" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:44.675624" elapsed="0.000467"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:44.675113" elapsed="0.001015"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:44.674640" elapsed="0.001510"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:44.676727" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:44.676311" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:44.677065" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:44.676829" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:44.677654" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:44.677307" elapsed="0.000377"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:44.677146" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:44.676811" elapsed="0.000987"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:44.677961" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:44.678822" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:44.678495" elapsed="0.000355"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:44.679010" elapsed="0.002725"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:44.665570" elapsed="0.016234"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:44.681994" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:52:44.681878" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:44.681859" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:44.682242" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:44.682315" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:44.684802" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782364,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:44.650856" elapsed="0.033975"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:44.684885" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:44.685039" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782364,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:44.648909" elapsed="0.036159"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:44.686115" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782364, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:44.685717" elapsed="0.000427"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:44.686196" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:52:44.686385" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782364, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:44.685344" elapsed="0.001069"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:44.686828" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:44.686636" elapsed="0.000219"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:44.687337" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:44.687032" elapsed="0.000331"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:44.687853" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:44.687588" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:44.688416" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:44.688050" elapsed="0.000439">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:44.635199" elapsed="0.053426">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:45.701461" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:45.700879" elapsed="0.000637"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:45.701647" elapsed="0.000066"/>
</return>
<msg time="2026-04-10T00:52:45.701899" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:45.700232" elapsed="0.001703"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:45.712171" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:45.711811" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:45.712663" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:45.712390" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:45.719594" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:45.719658" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782365,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:45.719774" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:45.715045" elapsed="0.004757"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:45.712787" elapsed="0.007061"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:45.720036" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:45.719877" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:45.712766" elapsed="0.007382"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:45.725258" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782365,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:45.721662" elapsed="0.003669"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:45.721319" elapsed="0.004062"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:45.721293" elapsed="0.004123"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:45.728990" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:45.725839" elapsed="0.003201"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:45.725496" elapsed="0.003581"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:45.725472" elapsed="0.003630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:45.729744" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:45.729298" elapsed="0.000474"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:45.730096" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:45.729846" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:45.730684" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:45.730353" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:45.730185" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:45.729828" elapsed="0.000963"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:45.731446" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:45.730999" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:45.731810" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:45.731563" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:45.732357" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:45.732056" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:45.731894" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:45.731529" elapsed="0.000913"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:45.732621" elapsed="0.000378"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:45.733586" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:45.733196" elapsed="0.000419"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:45.733777" elapsed="0.002531"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:45.720706" elapsed="0.015679"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:45.736604" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-10T00:52:45.736463" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:45.736443" elapsed="0.000282"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:45.736916" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:45.737086" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:52:45.739762" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782365,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:45.702431" elapsed="0.037362"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:45.739850" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:45.740011" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782365,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:45.699474" elapsed="0.040565"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:45.741120" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782365, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:45.740668" elapsed="0.000485"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:45.741202" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:52:45.741363" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782365, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:45.740282" elapsed="0.001108"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:45.741777" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:45.741590" elapsed="0.000214"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:45.742294" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:45.741983" elapsed="0.000338"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:45.742779" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:45.742494" elapsed="0.000311"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:45.743406" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:45.742980" elapsed="0.000502">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:45.689669" elapsed="0.053948">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:46.755932" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:46.755280" elapsed="0.000701"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:46.756066" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T00:52:46.756314" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:46.754687" elapsed="0.001666"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:46.764864" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:46.764578" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:46.765328" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:46.765077" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:46.772241" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:46.772302" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:46 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:46 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782366,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:46.772398" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:46.767644" elapsed="0.004780"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:46.765453" elapsed="0.007014"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:46.772672" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:46.772496" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:46.765430" elapsed="0.007406"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:46.776624" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782366,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:46.773914" elapsed="0.002781"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:46.773687" elapsed="0.003057"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:46.773668" elapsed="0.003110"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:46.780846" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:46.777177" elapsed="0.003736"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:46.776856" elapsed="0.004106"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:46.776832" elapsed="0.004164"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:46.781820" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:46.781246" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:46.782295" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:46.781959" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:46.783087" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:46.782660" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:46.782409" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:46.781933" elapsed="0.001271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:46.783983" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:46.783446" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:46.784448" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:46.784119" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:46.785238" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:46.784820" elapsed="0.000455"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:46.784590" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:46.784094" elapsed="0.001262"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:46.785594" elapsed="0.000491"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:46.786747" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:46.786319" elapsed="0.000465"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:46.787002" elapsed="0.002867"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:46.773233" elapsed="0.016705"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:46.790123" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:52:46.790011" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:46.789992" 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-04-10T00:52:46.790402" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:46.790477" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:52:46.792872" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782366,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:46.756991" elapsed="0.035910"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:46.792955" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:46.793109" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782366,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:46.753770" elapsed="0.039365"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:46.794148" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782366, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:46.793745" elapsed="0.000432"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:46.794265" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:52:46.794437" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782366, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:46.793369" elapsed="0.001094"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:46.794846" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:46.794662" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:46.795407" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:46.795049" elapsed="0.000384"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:46.795902" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:46.795629" elapsed="0.000299"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:46.796476" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:46.796105" elapsed="0.000462">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:46.744692" elapsed="0.051994">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:47.810540" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:47.810109" elapsed="0.000489"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:47.810665" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:52:47.810848" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:47.809668" elapsed="0.001205"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:47.818446" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:47.818170" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:47.818937" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:47.818680" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:47.825763" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:47.825830" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:47 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:47 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782367,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:47.825938" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:47.821261" elapsed="0.004706"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:47.819063" elapsed="0.006963"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:47.826237" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:47.826059" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:47.819040" elapsed="0.007296"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:47.831443" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782367,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:47.827512" elapsed="0.004005"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:47.827268" elapsed="0.004325"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:47.827245" elapsed="0.004385"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:47.835651" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:47.832070" elapsed="0.003649"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:47.831712" elapsed="0.004056"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:47.831687" elapsed="0.004115"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:47.836493" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:47.836055" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:47.836856" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:47.836612" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:47.837497" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:47.837179" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:47.837006" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:47.836593" elapsed="0.001011"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:47.838153" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:47.837770" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:47.838497" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:47.838253" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:47.839079" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:47.838768" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:47.838599" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:47.838235" elapsed="0.000958"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:47.839355" elapsed="0.000382"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:47.840236" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:47.839933" elapsed="0.000331"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:47.840425" elapsed="0.002433"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:47.826758" elapsed="0.016169"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:47.843173" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:52:47.843014" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:47.842989" 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-04-10T00:52:47.843650" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:47.843728" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:47.846142" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782367,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:47.811276" elapsed="0.034896"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:47.846228" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:47.846406" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782367,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:47.809093" elapsed="0.037353"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:47.847536" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782367, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:47.847084" elapsed="0.000497"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:47.847633" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:47.847791" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782367, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:47.846729" elapsed="0.001088"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:47.848180" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:47.847996" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:47.848707" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:47.848384" elapsed="0.000348"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:47.849164" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:47.848902" elapsed="0.000287"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:47.849730" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:47.849360" elapsed="0.000442">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:47.797625" elapsed="0.052363">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:48.863413" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:48.863017" elapsed="0.000430"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:48.863510" elapsed="0.000061"/>
</return>
<msg time="2026-04-10T00:52:48.863704" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:48.862507" elapsed="0.001222"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:48.870590" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:48.870304" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:48.871096" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:48.870800" elapsed="0.000352"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:48.878784" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:48.878847" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:48 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:48 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782368,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:48.878947" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:48.873881" elapsed="0.005093"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:48.871249" elapsed="0.007832"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:48.879322" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:48.879122" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:48.871222" elapsed="0.008192"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:48.885077" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782368,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:48.880692" elapsed="0.004456"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:48.880301" elapsed="0.004897"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:48.880267" elapsed="0.004972"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:48.889019" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:48.885687" elapsed="0.003380"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:48.885338" elapsed="0.003764"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:48.885312" elapsed="0.003814"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:48.889815" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:48.889362" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:48.890164" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:48.889917" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:48.890936" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:48.890621" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:48.890260" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:48.889898" elapsed="0.001150"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:48.891643" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:48.891219" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:48.891984" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:48.891745" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:48.892578" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:48.892240" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:48.892065" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:48.891727" elapsed="0.000998"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:48.892893" elapsed="0.000373"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:48.893822" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:48.893478" elapsed="0.000373"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:48.894015" elapsed="0.003369"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:48.879815" elapsed="0.017657"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:48.897730" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-04-10T00:52:48.897580" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:48.897537" elapsed="0.000330"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:48.898047" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:48.898122" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:48.900891" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782368,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:48.864088" elapsed="0.036847"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:48.901011" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:52:48.901233" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782368,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:48.861819" elapsed="0.039453"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:48.902711" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782368, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:48.902163" elapsed="0.000578"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:48.902799" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:52:48.903038" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782368, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:48.901663" elapsed="0.001415"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:48.903532" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:48.903334" elapsed="0.000243"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:48.904105" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:48.903762" elapsed="0.000369"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:48.904635" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:48.904340" elapsed="0.000321"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:48.905205" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:48.904839" elapsed="0.000449">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:48.851139" elapsed="0.054267">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:49.917431" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:49.917055" elapsed="0.000407"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:49.917521" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T00:52:49.917707" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:49.916687" elapsed="0.001045"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:49.924521" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:49.924264" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:49.925010" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:49.924757" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:49.931867" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:49.931926" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:49 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:49 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782369,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:49.932020" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:49.927410" elapsed="0.004636"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:49.925130" elapsed="0.006959"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:49.932279" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:49.932117" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:49.925109" elapsed="0.007257"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:49.936229" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782369,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:49.933385" elapsed="0.002913"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:49.933161" elapsed="0.003185"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:49.933143" elapsed="0.003238"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:49.940375" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:49.936793" elapsed="0.003647"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:49.936458" elapsed="0.004031"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:49.936434" elapsed="0.004088"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:49.941330" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:49.940794" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:49.941819" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:49.941464" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:49.942599" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:49.942157" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:49.941932" elapsed="0.000755"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:49.941440" elapsed="0.001277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:49.943489" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:49.942975" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:49.944000" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:49.943659" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:49.944794" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:49.944343" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:49.944115" elapsed="0.000767"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:49.943633" elapsed="0.001278"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:49.945129" elapsed="0.000514"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:49.946281" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:49.945880" elapsed="0.000438"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:49.946533" elapsed="0.002666"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:49.932738" elapsed="0.016529"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:49.949442" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:52:49.949337" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:49.949319" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:49.949702" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:49.949815" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:52:49.952184" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782369,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:49.918076" elapsed="0.034138"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:49.952269" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:52:49.952418" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782369,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:49.916170" elapsed="0.036274"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:49.953408" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782369, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:49.953018" elapsed="0.000418"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:49.953484" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:49.953654" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782369, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:49.952681" elapsed="0.001000"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:49.954044" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:49.953858" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:49.954555" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:49.954244" elapsed="0.000340"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:49.955050" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:49.954757" elapsed="0.000319"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:49.955609" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:49.955247" elapsed="0.000436">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:49.906321" elapsed="0.049474">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:50.968636" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:50.968233" elapsed="0.000437"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:50.968734" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:52:50.968909" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:50.967861" elapsed="0.001073"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:50.976099" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:50.975828" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:50.976579" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:50.976313" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:50.982764" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:50.982832" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:50 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:50 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782370,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:50.982941" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:50.978901" elapsed="0.004074"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:50.976705" elapsed="0.006316"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:50.983211" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:50.983051" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:50.976682" elapsed="0.006888"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:50.987267" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782370,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:50.984644" elapsed="0.002701"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:50.984399" elapsed="0.003001"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:50.984381" elapsed="0.003057"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:50.991707" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:50.987890" elapsed="0.003895"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:50.987524" elapsed="0.004318"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:50.987498" elapsed="0.004383"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:50.992801" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:50.992173" elapsed="0.000669"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:50.993313" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:50.992954" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:50.994152" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:50.993698" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:50.993435" elapsed="0.000810"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:50.992925" elapsed="0.001353"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:50.995324" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:50.994747" elapsed="0.000617"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:50.995851" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:50.995469" elapsed="0.000467"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:50.996678" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:50.996210" elapsed="0.000508"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:50.995972" elapsed="0.000799"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:50.995443" elapsed="0.001360"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:50.997040" elapsed="0.000577"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:50.998299" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:50.997868" elapsed="0.000469"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:50.998890" elapsed="0.002866"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:50.983957" elapsed="0.017876"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:51.002036" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:52:51.001921" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:51.001898" elapsed="0.000234"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:51.002291" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:51.002362" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:51.004824" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782370,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:50.969293" elapsed="0.035562"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:51.004911" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:51.005069" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782370,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:50.967336" elapsed="0.037760"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:51.006216" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782370, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:51.005768" elapsed="0.000477"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:51.006368" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:51.006528" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782370, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:51.005347" elapsed="0.001224"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:51.006985" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:51.006794" elapsed="0.000217"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:51.007507" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:51.007192" elapsed="0.000341"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:51.007993" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:51.007727" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:51.008564" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:51.008193" elapsed="0.000445">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:50.956722" elapsed="0.052029">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:52.021351" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:52.020969" elapsed="0.000415"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:52.021446" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:52:52.021637" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:52.020604" elapsed="0.001058"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:52.028735" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:52.028433" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:52.029185" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:52.028942" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:52.040046" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:52.040130" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:52 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:52 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782372,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:52.040264" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:52.031522" elapsed="0.008777"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:52.029311" elapsed="0.011049"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:52.040638" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:52.040399" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:52.029286" elapsed="0.011474"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:52.048005" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782372,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:52.042208" elapsed="0.005867"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:52.041898" elapsed="0.006229"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:52.041872" elapsed="0.006289"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:52.051903" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:52.048577" elapsed="0.003373"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:52.048240" elapsed="0.003745"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:52.048216" elapsed="0.003793"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:52.052608" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:52.052190" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:52.052944" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:52.052707" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:52.053563" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:52.053245" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:52.053082" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:52.052688" elapsed="0.000959"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:52.054168" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:52.053806" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:52.054501" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:52.054264" elapsed="0.000339"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:52.055142" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:52.054836" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:52.054633" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:52.054245" elapsed="0.000982"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:52.055384" elapsed="0.000389"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:52.056238" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:52.055941" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:52.056416" elapsed="0.002500"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:52.041277" elapsed="0.017706"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:52.059165" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:52:52.059056" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:52.059038" elapsed="0.000240"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:52.059432" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:52.059504" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:52:52.061878" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782372,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:52.022014" elapsed="0.039893"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:52.061958" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:52.062107" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782372,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:52.020104" elapsed="0.042028"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:52.063210" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782372, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:52.062789" elapsed="0.000450"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:52.063288" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:52.063444" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782372, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:52.062353" elapsed="0.001116"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:52.063846" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:52.063665" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:52.064353" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:52.064047" elapsed="0.000331"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:52.064833" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:52.064566" elapsed="0.000293"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:52.065381" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:52.065032" elapsed="0.000422">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:52.009717" elapsed="0.055900">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:53.078457" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:53.077910" elapsed="0.000593"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:53.078604" elapsed="0.000059"/>
</return>
<msg time="2026-04-10T00:52:53.078843" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:53.077374" elapsed="0.001503"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:53.088755" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:53.088353" elapsed="0.000472"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:53.089404" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:53.089045" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:53.098017" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:53.098093" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:53 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:53 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782373,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:53.098218" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:53.092332" elapsed="0.005914"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:53.089594" elapsed="0.008704"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:53.098587" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:53.098338" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:53.089561" elapsed="0.009118"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:53.102913" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782373,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:53.099864" elapsed="0.003100"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:53.099619" elapsed="0.003380"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:53.099598" elapsed="0.003425"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:53.106787" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:53.103306" elapsed="0.003549"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:53.103080" elapsed="0.003823"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:53.103063" elapsed="0.003873"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:53.107790" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:53.107194" elapsed="0.000634"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:53.108262" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:53.107928" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:53.109052" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:53.108625" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:53.108377" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:53.107902" elapsed="0.001267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:53.109935" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:53.109395" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:53.110452" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:53.110073" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:53.111238" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:53.110821" elapsed="0.000455"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:53.110590" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:53.110047" elapsed="0.001384"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:53.111626" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:53.112452" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:53.112151" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:53.112651" elapsed="0.002526"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:53.099111" elapsed="0.016139"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:53.115436" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:52:53.115326" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:53.115307" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:53.115707" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:53.115780" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:53.118181" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782373,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:53.079377" elapsed="0.038834"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:53.118266" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:53.118454" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782373,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:53.076691" elapsed="0.041790"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:53.119576" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782373, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:53.119137" elapsed="0.000469"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:53.119661" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:52:53.119828" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782373, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:53.118757" elapsed="0.001097"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:53.120214" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:53.120032" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:53.120756" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:53.120420" elapsed="0.000362"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:53.121218" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:53.120954" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:53.121879" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:53.121422" elapsed="0.000534">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:53.066584" elapsed="0.055489">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:54.133835" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:54.133307" elapsed="0.000572"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:54.133959" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:52:54.134288" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:54.132799" elapsed="0.001551"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:54.141998" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:54.141721" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:54.142518" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:54.142261" 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-04-10T00:52:54.149877" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:54.149940" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:54 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:54 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782374,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:54.150048" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:54.145085" elapsed="0.004992"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:54.142755" elapsed="0.007367"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:54.150355" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:54.150151" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:54.142732" elapsed="0.007715"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:54.155304" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782374,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:54.151941" elapsed="0.003434"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:54.151704" elapsed="0.003721"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:54.151683" elapsed="0.003776"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:54.159671" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:54.155897" elapsed="0.003853"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:54.155538" elapsed="0.004263"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:54.155514" elapsed="0.004321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:54.160634" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:54.160083" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:54.160996" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:54.160747" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:54.161565" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:54.161240" elapsed="0.000422"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:54.161078" elapsed="0.000628"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:54.160727" elapsed="0.001000"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:54.162310" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:54.161894" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:54.162714" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:54.162411" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:54.163270" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:54.162967" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:54.162805" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:54.162392" elapsed="0.000965"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:54.163514" elapsed="0.000430"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:54.164415" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:54.164116" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:54.164662" elapsed="0.002730"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:54.151073" elapsed="0.016387"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:54.167663" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:52:54.167531" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:54.167512" 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-04-10T00:52:54.167911" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:54.168027" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:52:54.170440" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782374,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:54.134935" elapsed="0.035534"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:54.170524" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:52:54.170712" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782374,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:54.132092" elapsed="0.038647"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:54.171907" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782374, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:54.171321" elapsed="0.000626"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:54.172014" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:52:54.172232" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782374, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:54.170965" elapsed="0.001304"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:54.172802" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:54.172520" elapsed="0.000318"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:54.173506" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:54.173083" elapsed="0.000481"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:54.174220" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:54.173823" elapsed="0.000435"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:54.175011" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:54.174501" elapsed="0.000608">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:54.123124" elapsed="0.052141">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:55.187967" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:55.187583" elapsed="0.000416"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:55.188061" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:52:55.188237" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:55.187198" elapsed="0.001063"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:55.195437" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:55.195143" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:55.195918" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:55.195666" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:55.202817" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:55.202881" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:55 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:55 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782375,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:55.202981" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:55.198287" elapsed="0.004721"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:55.196042" elapsed="0.007011"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:55.203245" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:55.203083" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:55.196019" elapsed="0.007385"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:55.207643" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782375,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:55.204518" elapsed="0.003204"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:55.204271" elapsed="0.003504"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:55.204252" elapsed="0.003560"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:55.212280" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:55.208264" elapsed="0.004084"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:55.207898" elapsed="0.004501"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:55.207871" elapsed="0.004563"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:55.213292" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:55.212728" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:55.213803" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:55.213432" elapsed="0.000456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:55.214635" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:55.214177" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:55.213923" elapsed="0.000811"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:55.213406" elapsed="0.001358"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:55.215508" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:55.214992" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:55.216025" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:55.215685" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:55.216824" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:55.216366" elapsed="0.000496"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:55.216140" elapsed="0.000772"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:55.215651" elapsed="0.001292"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:55.217191" elapsed="0.000551"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:55.218438" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:55.218040" elapsed="0.000425"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:55.218644" elapsed="0.002483"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:55.203825" elapsed="0.017372"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:55.221385" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:52:55.221273" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:55.221254" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:55.221650" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:55.221724" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:52:55.224121" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782375,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:55.188643" elapsed="0.035507"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:55.224229" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:52:55.224430" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782375,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:55.186704" elapsed="0.037756"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:55.225585" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782375, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:55.225154" elapsed="0.000462"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:55.225717" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:52:55.225877" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782375, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:55.224774" elapsed="0.001129"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:55.226292" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:55.226107" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:55.226823" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:55.226494" elapsed="0.000355"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:55.227289" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:55.227024" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:55.227859" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:55.227488" elapsed="0.000446">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:55.176250" elapsed="0.051797">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:56.240890" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:56.240487" elapsed="0.000437"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:56.240985" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:52:56.241174" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:56.240115" elapsed="0.001086"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:56.248328" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:56.248060" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:56.248800" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:56.248536" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:56.256058" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:56.256146" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:56 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:56 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782376,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:56.256288" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:56.251305" elapsed="0.005018"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:56.248921" elapsed="0.007467"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:56.256708" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:56.256434" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:56.248899" elapsed="0.007933"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:56.261057" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782376,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:56.258237" elapsed="0.002893"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:56.257920" elapsed="0.003253"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:56.257897" elapsed="0.003312"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:56.264417" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:56.261570" elapsed="0.002897"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:56.261289" elapsed="0.003214"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:56.261255" elapsed="0.003273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:56.265204" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:56.264752" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:56.265625" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:56.265315" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:56.266406" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:56.266051" elapsed="0.000383"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:56.265854" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:56.265295" elapsed="0.001201"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:56.267171" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:56.266717" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:56.267530" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:56.267285" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:56.268125" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:56.267815" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:56.267634" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:56.267263" elapsed="0.000948"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:56.268376" elapsed="0.000432"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:56.269306" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:56.268997" elapsed="0.000344"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:56.269504" elapsed="0.002710"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:56.257326" elapsed="0.014963"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:56.272481" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:52:56.272366" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:56.272346" 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-04-10T00:52:56.272812" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:56.272888" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:52:56.275444" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782376,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:56.241604" elapsed="0.033872"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:56.275532" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:52:56.275713" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782376,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:56.239603" elapsed="0.036137"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:56.276903" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782376, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:56.276426" elapsed="0.000520"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:56.277019" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:52:56.277191" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782376, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:56.276005" elapsed="0.001218"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:56.277628" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:56.277412" elapsed="0.000242"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:56.278247" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:56.277920" elapsed="0.000353"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:56.278740" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:56.278448" elapsed="0.000318"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:56.279301" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:56.278941" elapsed="0.000435">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:56.229113" elapsed="0.050471">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:57.292034" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:57.291656" elapsed="0.000411"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:57.292129" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:52:57.292304" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:57.291272" elapsed="0.001056"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:57.299391" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:57.299127" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:57.299860" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:57.299611" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:57.307715" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:57.307777" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:57 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:57 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782377,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:57.307874" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:57.302148" elapsed="0.005752"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:57.299979" elapsed="0.007966"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:57.308134" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:57.307972" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:57.299958" elapsed="0.008264"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:57.312472" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782377,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:57.309282" elapsed="0.003305"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:57.309055" elapsed="0.003586"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:57.309037" elapsed="0.003639"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:57.316632" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:57.313074" elapsed="0.003630"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:57.312757" elapsed="0.003997"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:57.312732" elapsed="0.004058"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:57.317656" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:57.317040" elapsed="0.000662"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:57.318142" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:57.317804" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:57.318949" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:57.318486" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:57.318259" elapsed="0.000778"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:57.317778" elapsed="0.001288"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:57.319831" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:57.319290" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:57.320296" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:57.319967" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:57.321099" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:57.320664" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:57.320409" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:57.319943" elapsed="0.001342"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:57.321511" elapsed="0.000609"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:57.322750" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:57.322358" elapsed="0.000424"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:57.322942" elapsed="0.002499"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:57.308622" elapsed="0.016892"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:57.325740" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:52:57.325628" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:57.325607" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:57.325990" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:57.326062" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:52:57.328415" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782377,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:57.292704" elapsed="0.035741"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:57.328502" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:52:57.328672" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782377,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:57.290787" elapsed="0.037911"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:57.329723" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782377, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:57.329275" elapsed="0.000477"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:57.329800" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:52:57.329965" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782377, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:57.328931" elapsed="0.001060"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:57.330351" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:57.330170" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:57.330884" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:57.330566" elapsed="0.000348"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:57.331355" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:57.331090" elapsed="0.000291"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:57.331934" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:57.331575" elapsed="0.000435">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:57.280492" elapsed="0.051635">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:58.344843" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:58.344451" elapsed="0.000425"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:58.344935" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:52:58.345104" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:58.344080" elapsed="0.001050"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:58.351994" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:58.351713" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:58.352453" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:58.352206" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:58.359151" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:58.359211" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:58 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:58 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782378,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:58.359310" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:58.354862" elapsed="0.004475"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:58.352594" elapsed="0.006787"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:58.359612" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:58.359411" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:58.352571" elapsed="0.007158"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:58.363808" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782378,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:58.360836" elapsed="0.003043"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:58.360608" elapsed="0.003320"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:58.360588" elapsed="0.003377"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:58.368081" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:58.364359" elapsed="0.003790"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:58.364045" elapsed="0.004155"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:58.364021" elapsed="0.004213"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:58.369066" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:58.368488" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:58.369621" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:58.369202" elapsed="0.000506"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:58.370412" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:58.369972" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:58.369742" elapsed="0.000771"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:58.369177" elapsed="0.001385"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:58.371130" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:58.370751" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:58.371468" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:58.371231" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:58.372032" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:58.371733" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:58.371569" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:58.371213" elapsed="0.000903"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:58.372274" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:58.373111" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:58.372814" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:58.373298" elapsed="0.002494"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:58.360134" elapsed="0.015728"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:58.376044" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:52:58.375934" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:58.375915" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:58.376293" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:58.376421" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:52:58.378840" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782378,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:58.345500" elapsed="0.033371"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:58.378924" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:52:58.379082" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782378,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:58.343584" elapsed="0.035524"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:58.380124" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782378, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:58.379719" elapsed="0.000433"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:58.380202" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:52:58.380359" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782378, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:58.379346" elapsed="0.001039"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:58.380767" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:58.380582" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:58.381279" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:58.380971" elapsed="0.000334"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:58.381818" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:58.381529" elapsed="0.000315"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:58.382373" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:58.382019" elapsed="0.000427">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:58.333193" elapsed="0.049382">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:59.394709" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:59.394143" elapsed="0.000613"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:52:59.394838" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T00:52:59.395110" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:52:59.393621" elapsed="0.001531"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:59.404533" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:59.404211" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:59.405029" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:59.404775" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:52:59.411927" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:52:59.411989" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:52:59 GMT', 'Expires': 'Thu, 09 Apr 2026 23:52:59 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782379,"status":200} 
 </msg>
<msg time="2026-04-10T00:52:59.412111" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:52:59.407402" elapsed="0.004748"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:59.405158" elapsed="0.007038"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:59.412393" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:59.412227" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:59.405132" elapsed="0.007442"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:59.416387" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782379,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:59.413767" elapsed="0.002672"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:59.413487" elapsed="0.002987"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:59.413466" elapsed="0.003033"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:52:59.419465" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:52:59.416812" elapsed="0.002702"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:59.416581" elapsed="0.002989"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:59.416562" elapsed="0.003034"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:59.420196" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:59.419787" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:59.420536" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:59.420295" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:59.421113" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:59.420806" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:59.420640" elapsed="0.000635"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:59.420276" elapsed="0.001024"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:59.422027" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:59.421476" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:59.422493" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:52:59.422165" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:52:59.423276" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:52:59.422859" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-04-10T00:52:59.422631" elapsed="0.000731"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:59.422139" elapsed="0.001252"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:52:59.423637" elapsed="0.000486"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:52:59.424793" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:59.424356" elapsed="0.000473"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:52:59.425048" elapsed="0.003532"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:52:59.412991" elapsed="0.015686"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:52:59.428936" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-10T00:52:59.428780" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-10T00:52:59.428753" elapsed="0.000313"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:52:59.429417" elapsed="0.000039"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:52:59.429533" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:52:59.432840" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782379,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:52:59.395742" elapsed="0.037138"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:52:59.432955" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:52:59.433198" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782379,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:59.392849" elapsed="0.040386"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:52:59.434670" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782379, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:52:59.434085" elapsed="0.000625"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:52:59.434854" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:52:59.435076" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782379, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:52:59.433586" elapsed="0.001526"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:52:59.435638" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:52:59.435358" elapsed="0.000317"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:59.436340" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:59.435919" elapsed="0.000457"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:52:59.437004" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:52:59.436636" elapsed="0.000403"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:52:59.437889" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:52:59.437366" elapsed="0.000621">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:52:59.383461" elapsed="0.054681">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:00.447638" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:00.447224" elapsed="0.000449"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:00.447738" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:53:00.447912" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:00.446827" elapsed="0.001110"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:00.455964" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:00.455683" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:00.456437" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:00.456185" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:00.463920" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:00.464000" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:00 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782380,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:00.464137" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:00.458842" elapsed="0.005333"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:00.456583" elapsed="0.007655"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:00.464559" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:00.464283" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:00.456558" elapsed="0.008116"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:00.470335" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782380,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:00.465997" elapsed="0.004392"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:00.465751" elapsed="0.004677"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:00.465729" elapsed="0.004724"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:00.473336" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:00.470767" elapsed="0.002621"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:00.470512" elapsed="0.002912"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:00.470494" elapsed="0.002955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:00.474311" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:00.473723" elapsed="0.000628"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:00.474841" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:00.474456" elapsed="0.000543"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:00.475767" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:00.475280" elapsed="0.000528"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:00.475037" elapsed="0.000825"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:00.474428" elapsed="0.001465"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:00.476696" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:00.476130" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:00.477239" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:00.476840" elapsed="0.000487"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:00.478065" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:00.477622" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:00.477362" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:00.476813" elapsed="0.001379"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:00.478424" elapsed="0.000552"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:00.479677" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:00.479223" elapsed="0.000493"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:00.479949" elapsed="0.003803"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:00.465202" elapsed="0.018658"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:00.484148" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:53:00.483982" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:00.483951" elapsed="0.000336"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:00.484518" elapsed="0.000060"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:00.484654" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:53:00.488198" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782380,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:00.448304" elapsed="0.039937"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:00.488318" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:53:00.488560" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782380,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:00.446248" elapsed="0.042352"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:00.490007" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782380, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:00.489568" elapsed="0.000468"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:00.490085" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:00.490241" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782380, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:00.489004" elapsed="0.001263"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:00.490647" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:00.490447" elapsed="0.000226"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:00.491154" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:00.490850" elapsed="0.000329"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:00.491626" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:00.491348" elapsed="0.000303"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:00.492177" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:00.491823" elapsed="0.000427">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:00.439060" elapsed="0.053378">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.501623" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:01.501125" elapsed="0.000540"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:01.501739" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:53:01.501955" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:01.500599" elapsed="0.001388"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.511846" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:01.511465" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.512445" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:01.512126" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:01.521446" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:01.521531" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:01 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:01 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782381,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:01.521695" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:01.516012" elapsed="0.005716"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:01.512625" elapsed="0.009164"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.522056" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:01.521830" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.512596" elapsed="0.009572"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.527244" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782381,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:01.523630" elapsed="0.003686"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:01.523302" elapsed="0.004064"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.523277" elapsed="0.004125"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.531343" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:01.527829" elapsed="0.003584"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:01.527483" elapsed="0.003978"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.527459" elapsed="0.004038"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.532346" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:01.531813" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.532850" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:01.532477" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.533591" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:01.533181" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:01.532959" elapsed="0.000713"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.532452" elapsed="0.001249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.534386" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:01.533915" elapsed="0.000505"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.534854" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:01.534513" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.535576" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:01.535175" elapsed="0.000437"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:01.534959" elapsed="0.000700"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.534488" elapsed="0.001278"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:01.535992" elapsed="0.000453"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:01.537141" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:01.536686" elapsed="0.000489"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:01.537388" elapsed="0.003456"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:01.522720" elapsed="0.018217"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:01.541174" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-10T00:53:01.541031" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.541008" elapsed="0.000291"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.541505" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.541615" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:53:01.544910" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782381,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:01.502458" elapsed="0.042489"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:01.545017" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:53:01.545214" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782381,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:01.499845" elapsed="0.045404"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.546608" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782381, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:01.546070" elapsed="0.000575"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:01.546709" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:53:01.546908" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782381, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:01.545588" elapsed="0.001353"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:01.547409" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:01.547180" elapsed="0.000261"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.548086" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:01.547695" elapsed="0.000424"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.548708" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:01.548350" elapsed="0.000442"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:53:01.549029" elapsed="0.000402"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:53:01.493176" elapsed="0.056334"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:52:41.486365" elapsed="20.063231"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:52:41.485964" elapsed="20.063718"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:52:41.481254" elapsed="20.068471"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:52:41.481115" elapsed="20.068656"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.563137" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:01.562823" elapsed="0.000343"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:01.563214" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:53:01.563388" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:01.562443" elapsed="0.000971"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.570641" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:01.570324" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.571110" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:01.570860" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:01.578879" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:01.578945" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:01 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:01 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782381,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:01.579052" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:01.573474" elapsed="0.005605"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:01.571237" elapsed="0.007888"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.579329" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:01.579158" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.571213" elapsed="0.008203"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.584267" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782381,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:01.580623" elapsed="0.003721"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:01.580363" elapsed="0.004034"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.580343" elapsed="0.004091"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.588695" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:01.584965" elapsed="0.003881"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:01.584520" elapsed="0.004394"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.584495" elapsed="0.004467"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.589867" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:01.589319" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.590251" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:01.589978" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.590892" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:01.590570" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:01.590357" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.589956" elapsed="0.001021"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.591510" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:01.591139" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.591876" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:01.591636" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.592421" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:01.592121" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:01.591959" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.591617" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:01.592689" elapsed="0.000423"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:01.593612" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:01.593285" elapsed="0.000353"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:01.593800" elapsed="0.002612"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:01.579841" elapsed="0.016649"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:01.596832" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T00:53:01.596673" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.596650" elapsed="0.000305"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.597145" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.597220" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:01.599639" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782381,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:01.563775" elapsed="0.035896"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:01.599726" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:01.599887" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782381,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:01.561979" elapsed="0.037934"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:53:01.599962" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:53:01.600111" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782381,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 1. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:53:01.557352" elapsed="0.042785"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.601372" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782381, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:01.600922" elapsed="0.000479"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:01.601450" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:01.601625" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782381, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:01.600400" elapsed="0.001251"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:01.602022" level="INFO">${value} = 10000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:01.601836" elapsed="0.000212"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.602520" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:53:01.602230" elapsed="0.000368"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 10000.</doc>
<status status="PASS" start="2026-04-10T00:53:01.556897" elapsed="0.045765"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:01.550028" elapsed="0.052670"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:01.549848" elapsed="0.052889"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:52:41.412651" elapsed="20.190147"/>
</kw>
<doc>Initiate get operation and check flow count 10000 only across active cluster nodes</doc>
<status status="PASS" start="2026-04-10T00:52:41.006767" elapsed="20.596164"/>
</test>
<test id="s1-s2-t23" name="Verify Flows In Switch Before Follower Restart" line="205">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:53:01.606611" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:53:01.606308" elapsed="0.000585"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.607973" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:01.607847" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.607824" 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-04-10T00:53:01.614451" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:01.614306" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.614281" elapsed="0.000261"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.615952" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:01.615293" elapsed="0.000688"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.616472" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:01.616151" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:01.616560" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:53:01.616798" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:01.614887" elapsed="0.002046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.622956" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:01.622828" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.622803" elapsed="0.000233"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.624465" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:01.624351" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.624331" elapsed="0.000205"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:01.625260" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:01.624866" elapsed="0.000426"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:01.625753" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:01.625477" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:01.659569" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:01.626313" elapsed="0.033508"/>
</kw>
<msg time="2026-04-10T00:53:01.660072" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:01.660122" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.625945" elapsed="0.034216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:01.741530" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:01.661020" elapsed="0.080794"/>
</kw>
<msg time="2026-04-10T00:53:01.742056" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:01.742104" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.660434" elapsed="0.081709"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.742637" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:01.742270" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.742232" elapsed="0.000499"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.743312" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:01.742883" elapsed="0.000527"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.743723" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:01.743480" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.743461" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:01.743840" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:01.746661" elapsed="0.000161"/>
</kw>
<msg time="2026-04-10T00:53:01.746884" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:01.745485" elapsed="0.001534"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.747533" elapsed="0.000099"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.747897" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:01.744815" elapsed="0.003269"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:01.744173" elapsed="0.003977"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:01.624026" elapsed="0.124281"/>
</kw>
<msg time="2026-04-10T00:53:01.748401" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:01.748446" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.623212" elapsed="0.125272"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:01.748717" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:53:01.748582" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.748560" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.749230" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.749591" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.749666" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:01.622381" elapsed="0.127393"/>
</kw>
<msg time="2026-04-10T00:53:01.749869" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:01.749913" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.617389" elapsed="0.132560"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.750276" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:01.750025" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.750008" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:01.617233" elapsed="0.133143"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.756110" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:01.756002" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.755983" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.757368" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:01.757261" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.757243" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:01.757910" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:01.757606" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:01.758317" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:01.758093" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:01.795218" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:01.759016" elapsed="0.036316"/>
</kw>
<msg time="2026-04-10T00:53:01.795500" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:01.795569" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.758503" elapsed="0.037105"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:01.882413" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:01.796146" elapsed="0.086559"/>
</kw>
<msg time="2026-04-10T00:53:01.882947" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:01.882999" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.795791" elapsed="0.087248"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.883631" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:01.883273" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.883226" elapsed="0.000497"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.884277" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:01.883871" elapsed="0.000501"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.884757" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:01.884451" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.884427" elapsed="0.000413"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:01.884879" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:01.888167" elapsed="0.000186"/>
</kw>
<msg time="2026-04-10T00:53:01.888435" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:01.886892" elapsed="0.001720"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.888931" elapsed="0.000086"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.889286" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:01.886195" elapsed="0.003284"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:01.885556" elapsed="0.004220"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:01.756956" elapsed="0.132951"/>
</kw>
<msg time="2026-04-10T00:53:01.890019" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:01.890076" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.756329" elapsed="0.133788"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:01.890665" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:53:01.890220" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.890192" elapsed="0.000573"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.891224" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.891822" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.891901" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:01.755653" elapsed="0.136359"/>
</kw>
<msg time="2026-04-10T00:53:01.892122" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:01.892168" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.750668" elapsed="0.141537"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.892557" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:01.892284" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.892267" elapsed="0.000432"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:01.750507" elapsed="0.142219"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.901095" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:01.900942" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.900901" 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-04-10T00:53:01.902772" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:01.902625" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.902607" elapsed="0.000325"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:01.903469" level="INFO">${karaf_connection_index} = 204</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:01.903093" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:01.903947" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:01.903692" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:01.904924" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:53:01.904535" elapsed="0.001223">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:53:01.905957" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:53:01.906005" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.904152" elapsed="0.001878"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:01.906993" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:53:01.906672" elapsed="0.001116">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:53:01.908000" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:53:01.908049" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.906203" elapsed="0.001869"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.909111" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Verify Flows In Switch Before Follower Restart"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:53:01.908388" elapsed="0.000790">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Verify Flows In Switch Before Follower Restart"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:53:01.908152" elapsed="0.001098">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Verify Flows In Switch Before Follower Restart"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:53:01.908132" elapsed="0.001160">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Verify Flows In Switch Before Follower Restart"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.909566" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.909817" elapsed="0.000219"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:01.909670" elapsed="0.000402"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:01.909652" elapsed="0.000446"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.910133" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:01.912788" elapsed="0.000160"/>
</kw>
<msg time="2026-04-10T00:53:01.913018" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:01.911729" elapsed="0.001422"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.913442" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.913819" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:01.911047" elapsed="0.002960"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:01.910443" elapsed="0.003631"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:53:01.902291" elapsed="0.011871">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Verify Flows In Switch Before Follower Restart"</status>
</kw>
<msg time="2026-04-10T00:53:01.914268" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:53:01.914325" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Verify Flows In Switch Before Follower Restar...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.901532" elapsed="0.012819"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.914566" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:01.914435" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.914413" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.915727" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:01.915508" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.915483" elapsed="0.000315"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:01.916109" level="INFO">index=202
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:01.915956" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.916762" level="INFO">{1: 88, 2: 153, 3: 204}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:01.916411" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.917213" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:01.916966" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:01.917851" elapsed="0.000272"/>
</kw>
<msg time="2026-04-10T00:53:01.918247" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:01.918329" level="INFO">${old_connection_index} = 204</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.917432" elapsed="0.000925"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:01.919321" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:01.920840" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:53:01.920355" elapsed="0.001486">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.919845" elapsed="0.002098"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:01.922658" elapsed="0.000287"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.922121" elapsed="0.000910"/>
</kw>
<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="PASS" start="2026-04-10T00:53:01.918744" elapsed="0.004333"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:01.918440" elapsed="0.004688"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.918419" elapsed="0.004740"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:01.924104" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:01.923785" elapsed="0.000346"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:53:01.924182" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:53:01.924357" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:01.923406" elapsed="0.000976"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:01.924560" elapsed="0.000515"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:01.925470" level="INFO">index=205
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:01.925298" elapsed="0.000335"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:53:01.925790" elapsed="0.002766"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:53:01.929105" level="INFO">Logging into '10.30.171.151:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:53:01.931125" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</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="FAIL" start="2026-04-10T00:53:01.928818" elapsed="0.002789">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:01.945908" elapsed="0.000418"/>
</kw>
<msg time="2026-04-10T00:53:01.946428" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:01.944193" elapsed="0.002412"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.946846" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.947013" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:01.932525" elapsed="0.014573"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:01.931941" elapsed="0.015210"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:53:01.915134" elapsed="0.032109">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.947888" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.947969" elapsed="0.000026"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-10T00:53:01.900138" elapsed="0.047954">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<msg time="2026-04-10T00:53:01.948211" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:53:01.948256" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.894180" elapsed="0.054100"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:01.948689" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:01.948369" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.948347" elapsed="0.000423"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:01.892863" elapsed="0.055932"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:01.617014" elapsed="0.331819"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:53:01.613774" elapsed="0.335126"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:53:01.607521" elapsed="0.341440"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.607054" elapsed="0.341956"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:53:01.603963" elapsed="0.345104"/>
</kw>
<kw name="Verify Aggregate Flow From Mininet Session" owner="MininetKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:01.951010" elapsed="0.000155"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:01.950790" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.950772" elapsed="0.000453"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.952043" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:01.951392" elapsed="0.000680"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:01.952957" elapsed="0.000150"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:01.952738" elapsed="0.000405"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.952720" elapsed="0.000447"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:01.957033" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:01.953307" elapsed="0.003786"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:53:01.979748" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<msg time="2026-04-10T00:53:01.979972" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:53:01.957255" elapsed="0.022746"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:53:01.980097" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:53:01.980339" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 202 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:53:01.952397" elapsed="0.027971"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:53:01.981134" level="INFO">${flows} = ['10000']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:53:01.980791" elapsed="0.000369"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.981818" level="INFO">${total_flows} = 10000</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:01.981330" elapsed="0.000516"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.982376" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-04-10T00:53:01.982083" elapsed="0.000355"/>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="PASS" start="2026-04-10T00:53:01.950459" elapsed="0.032043"/>
</kw>
<arg>${time_out}</arg>
<arg>2s</arg>
<arg>MininetKeywords.Check Flows In Mininet</arg>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:53:01.949823" elapsed="0.032749"/>
</kw>
<arg>${mininet_conn_id}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${operation_timeout}</arg>
<doc>Verify flow count per switch</doc>
<status status="PASS" start="2026-04-10T00:53:01.949286" elapsed="0.033355"/>
</kw>
<doc>Verify flows are installed in switch before follower restart.</doc>
<status status="PASS" start="2026-04-10T00:53:01.603328" elapsed="0.379444"/>
</test>
<test id="s1-s2-t24" name="Restart Follower From Cluster Node" line="212">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:53:01.986440" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:53:01.986171" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.987759" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:01.987640" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.987617" elapsed="0.000214"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:01.993200" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:01.993094" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:01.993076" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.994271" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:01.993889" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:01.994793" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:01.994462" elapsed="0.000357"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:01.994864" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:53:01.995023" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:01.993495" elapsed="0.001552"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.000575" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.000451" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.000432" elapsed="0.000227"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.001839" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.001732" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.001715" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:02.002356" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.002053" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.002791" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.002556" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.034385" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:02.003316" elapsed="0.031182"/>
</kw>
<msg time="2026-04-10T00:53:02.034692" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:02.034738" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.002980" elapsed="0.031795"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.101006" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "R "e "s "t "a "r "t "[C "[78CF "[A[78Co
 "l "l "o "w "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:02.035309" elapsed="0.066066"/>
</kw>
<msg time="2026-04-10T00:53:02.101660" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:02.101726" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.034955" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.102313" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.101916" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.101878" elapsed="0.000552"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.103093" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "R "e "s "t "a "r "t "[C "[78CF "[A[78Co
 "l "l "o "w "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:02.102649" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.103618" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.103308" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.103284" elapsed="0.000438"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:02.103770" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.106769" elapsed="0.000159"/>
</kw>
<msg time="2026-04-10T00:53:02.106991" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:02.105702" elapsed="0.001424"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.107409" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.107778" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:02.104956" elapsed="0.003006"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:02.104184" elapsed="0.003844"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:02.001408" elapsed="0.106718"/>
</kw>
<msg time="2026-04-10T00:53:02.108222" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:02.108267" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.000813" elapsed="0.107493"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:02.108493" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:02.108385" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.108365" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.109039" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.109377" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.109449" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:02.000116" elapsed="0.109458"/>
</kw>
<msg time="2026-04-10T00:53:02.109674" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:02.109719" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.995432" elapsed="0.114326"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.110084" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.109833" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.109816" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:01.995284" elapsed="0.114899"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.116034" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.115921" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.115900" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.117403" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.117289" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.117272" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:02.117997" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.117672" elapsed="0.000353"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.118426" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.118190" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.157347" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:02.118985" elapsed="0.038502"/>
</kw>
<msg time="2026-04-10T00:53:02.157707" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:02.157755" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.118637" elapsed="0.039156"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.230430" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "R "e "s "t "a "r "t "[C "[78CF "[A[78Co
 "l "l "o "w "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:02.158352" elapsed="0.072340"/>
</kw>
<msg time="2026-04-10T00:53:02.230912" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:02.230963" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.157983" elapsed="0.073019"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.231431" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.231116" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.231083" elapsed="0.000440"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.232080" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "R "e "s "t "a "r "t "[C "[78CF "[A[78Co
 "l "l "o "w "e "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:02.231701" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.232471" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.232247" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.232228" elapsed="0.000384"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:02.232658" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.235316" elapsed="0.000159"/>
</kw>
<msg time="2026-04-10T00:53:02.235538" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:02.234242" elapsed="0.001560"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.236092" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.236434" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:02.233587" elapsed="0.003097"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:02.232988" elapsed="0.003765"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:02.116962" elapsed="0.119889"/>
</kw>
<msg time="2026-04-10T00:53:02.236947" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:02.236993" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.116270" elapsed="0.120816"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:02.237278" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:02.237168" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.237149" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.237797" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.238136" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.238209" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:02.115350" elapsed="0.122972"/>
</kw>
<msg time="2026-04-10T00:53:02.238420" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:02.238465" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.110460" elapsed="0.128042"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.238867" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.238595" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.238577" elapsed="0.000369"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:02.110312" elapsed="0.128658"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.244688" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.244556" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.244521" elapsed="0.000247"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.245945" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.245837" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.245818" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:02.246474" level="INFO">${karaf_connection_index} = 205</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.246163" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.246932" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.246680" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.247763" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.247462" elapsed="0.003117">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:53:02.250777" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:53:02.250827" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.247122" elapsed="0.003738"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.251667" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.251397" elapsed="0.000926">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:53:02.252510" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:53:02.252741" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.251042" elapsed="0.001748"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.253812" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Restart Follower From Cluster Node"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.253156" elapsed="0.000722">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Restart Follower From Cluster Node"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:53:02.252900" elapsed="0.001061">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Restart Follower From Cluster Node"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:53:02.252873" elapsed="0.001123">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Restart Follower From Cluster Node"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.254232" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.254464" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.254321" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:02.254304" elapsed="0.000235"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.254591" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.257274" elapsed="0.000162"/>
</kw>
<msg time="2026-04-10T00:53:02.257502" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:02.256120" elapsed="0.001533"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.257934" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.258288" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:02.255453" elapsed="0.003025"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:02.254881" elapsed="0.003680"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.245505" elapsed="0.013146">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Restart Follower From Cluster Node"</status>
</kw>
<msg time="2026-04-10T00:53:02.258753" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:53:02.258797" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Restart Follower From Cluster Node"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.244927" elapsed="0.013894"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.259015" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.258899" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.258880" elapsed="0.000203"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.259901" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.259794" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.259777" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.260276" level="INFO">index=202
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:02.260136" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.260939" level="INFO">{1: 88, 2: 153, 3: 205}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:02.260667" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.261401" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:02.261153" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.261996" elapsed="0.000276"/>
</kw>
<msg time="2026-04-10T00:53:02.262373" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:02.262419" level="INFO">${old_connection_index} = 205</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.261625" elapsed="0.000817"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.263294" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.264738" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.264194" elapsed="0.001668">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.263694" elapsed="0.002270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:02.266650" elapsed="0.000284"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.266149" elapsed="0.000870"/>
</kw>
<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="PASS" start="2026-04-10T00:53:02.262762" elapsed="0.004304"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:02.262519" elapsed="0.004660"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.262500" elapsed="0.004709"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:02.268092" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.267781" elapsed="0.000337"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:53:02.268179" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:53:02.268340" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:02.267425" elapsed="0.000940"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.268524" elapsed="0.000534"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.269373" level="INFO">index=206
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:02.269244" elapsed="0.000257"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.269671" elapsed="0.002454"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.272691" level="INFO">Logging into '10.30.171.151:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:53:02.273816" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</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="FAIL" start="2026-04-10T00:53:02.272374" elapsed="0.001835">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.288754" elapsed="0.000416"/>
</kw>
<msg time="2026-04-10T00:53:02.289262" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:02.287282" elapsed="0.002132"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.289609" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.289782" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:02.275141" elapsed="0.014725"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:02.274516" elapsed="0.015399"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.259479" elapsed="0.030520">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.290352" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.290428" 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="FAIL" start="2026-04-10T00:53:02.244177" elapsed="0.046385">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<msg time="2026-04-10T00:53:02.290679" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:53:02.290724" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.239248" elapsed="0.051499"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.291087" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.290828" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.290808" elapsed="0.000358"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:02.239102" elapsed="0.052087"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:01.995107" elapsed="0.296116"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:53:01.992551" elapsed="0.298732"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:53:01.987323" elapsed="0.304067"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:01.986880" elapsed="0.304560"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:53:01.983517" elapsed="0.307979"/>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<kw name="ClusterManagement__Build_List" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.295257" level="INFO">${member_int} = 3</msg>
<var>${member_int}</var>
<arg>${member}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:53:02.294942" elapsed="0.000341"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.295767" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>${member_int}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:02.295440" elapsed="0.000354"/>
</kw>
<return>
<value>${index_list}</value>
<status status="PASS" start="2026-04-10T00:53:02.295839" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:02.295995" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>${member}</arg>
<status status="PASS" start="2026-04-10T00:53:02.294616" elapsed="0.001404"/>
</kw>
<kw name="Return_Member_IP" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.296895" level="INFO">${member_int} = 3</msg>
<var>${member_int}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:53:02.296533" elapsed="0.000389"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:02.297343" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_int}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.297078" elapsed="0.000292"/>
</kw>
<return>
<value>${member_ip}</value>
<status status="PASS" start="2026-04-10T00:53:02.297418" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:02.297666" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>${member}</arg>
<doc>Return the IP address of the member given the member_index.</doc>
<status status="PASS" start="2026-04-10T00:53:02.296214" elapsed="0.001481"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.300174" level="INFO">${msg} = Starting ODL3 10.30.171.151</msg>
<var>${msg}</var>
<arg>"${msg}" == "${EMPTY}"</arg>
<arg>Starting ODL${member} ${member_ip}</arg>
<arg>Starting ODL${member} ${member_ip}, ${msg}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:02.297862" elapsed="0.002340"/>
</kw>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.307638" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.307507" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.307489" elapsed="0.000221"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.308777" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:02.308329" elapsed="0.000484"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.309289" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:02.308979" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:02.309360" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:02.309517" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:02.307950" elapsed="0.001608"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.315338" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.315227" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.315209" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.316524" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.316417" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.316400" elapsed="0.000241"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:02.317020" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.316788" elapsed="0.000259"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.317425" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.317210" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.367366" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "1 ". "1 "5 "1 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:02.318017" elapsed="0.049613"/>
</kw>
<msg time="2026-04-10T00:53:02.367898" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:02.368030" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.317639" elapsed="0.050498"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.372240" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:02.369698" elapsed="0.002659"/>
</kw>
<msg time="2026-04-10T00:53:02.372521" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:02.372647" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.368808" elapsed="0.003881"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.373260" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.372826" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.372788" elapsed="0.000625"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.374227" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:02.373752" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.375079" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.374455" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.374418" elapsed="0.000821"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:02.375310" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.378498" elapsed="0.000368"/>
</kw>
<msg time="2026-04-10T00:53:02.379016" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:02.377398" elapsed="0.001731"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.379472" elapsed="0.000050"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.379777" elapsed="0.000031"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:02.376723" elapsed="0.003178"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:02.375805" elapsed="0.004164"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:02.316115" elapsed="0.063993"/>
</kw>
<msg time="2026-04-10T00:53:02.380242" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:02.380316" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.315581" elapsed="0.064776"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:02.380694" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:53:02.380471" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.380444" elapsed="0.000370"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.381460" elapsed="0.000038"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.381872" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.381947" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:02.314879" elapsed="0.067182"/>
</kw>
<msg time="2026-04-10T00:53:02.382159" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:02.382202" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.309954" elapsed="0.072276"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.382598" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.382319" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.382299" elapsed="0.000381"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:02.309798" elapsed="0.072906"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.389000" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.388890" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.388872" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.390175" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.390068" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.390051" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:02.390652" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.390404" elapsed="0.000276"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.391025" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.390840" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.425179" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "1 ". "1 "5 "1 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:02.391607" elapsed="0.033680"/>
</kw>
<msg time="2026-04-10T00:53:02.425407" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:02.425454" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.391213" elapsed="0.034278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.428179" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:02.426083" elapsed="0.002160"/>
</kw>
<msg time="2026-04-10T00:53:02.428361" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:02.428408" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.425710" elapsed="0.002725"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.428819" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.428575" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.428500" elapsed="0.000399"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.429312" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:02.429044" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.429670" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.429433" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.429415" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:02.429786" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.431810" elapsed="0.000223"/>
</kw>
<msg time="2026-04-10T00:53:02.432135" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:02.431020" elapsed="0.001185"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.432377" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.432587" elapsed="0.000023"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:02.430646" elapsed="0.002029"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:02.430075" elapsed="0.002648"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:02.389768" elapsed="0.043051"/>
</kw>
<msg time="2026-04-10T00:53:02.432913" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:02.432956" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.389223" elapsed="0.043760"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:02.433169" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:02.433060" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.433042" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.433732" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.434071" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.434143" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:02.388379" elapsed="0.045878"/>
</kw>
<msg time="2026-04-10T00:53:02.434389" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:02.434435" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.382991" elapsed="0.051472"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.434812" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.434557" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.434525" elapsed="0.000366"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:02.382844" elapsed="0.052070"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.441205" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.441055" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.441030" elapsed="0.000273"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.442591" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.442465" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.442447" elapsed="0.000239"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:02.443074" level="INFO">${karaf_connection_index} = 206</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.442845" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.443471" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.443268" elapsed="0.000229"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.444237" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.444030" elapsed="0.000806">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:53:02.444950" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:53:02.444995" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.443683" elapsed="0.001335"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.445753" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.445560" elapsed="0.000697">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:53:02.446378" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:53:02.446423" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.445188" elapsed="0.001257"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.447113" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.446782" elapsed="0.000394">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:53:02.446523" elapsed="0.000726">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:53:02.446503" elapsed="0.000803">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.447479" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.447739" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.447593" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:02.447573" elapsed="0.000243"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.447850" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.449620" elapsed="0.000213"/>
</kw>
<msg time="2026-04-10T00:53:02.449937" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:02.449045" elapsed="0.000958"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.450166" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.450341" elapsed="0.000022"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:02.448681" elapsed="0.001746"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:02.448116" elapsed="0.002357"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.442149" elapsed="0.008429">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</status>
</kw>
<msg time="2026-04-10T00:53:02.450702" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:53:02.450753" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.441522" elapsed="0.009255"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.450965" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.450858" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.450839" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.452083" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.451968" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.451942" elapsed="0.000212"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.452452" level="INFO">index=202
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:02.452311" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.453069" level="INFO">{1: 88, 2: 153, 3: 206}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:02.452802" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.453517" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:02.453272" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.454103" elapsed="0.000194"/>
</kw>
<msg time="2026-04-10T00:53:02.454413" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:02.454469" level="INFO">${old_connection_index} = 206</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.453742" elapsed="0.000752"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.455365" elapsed="0.000153"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.456185" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.456034" elapsed="0.000628">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.455706" elapsed="0.001019"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:02.457223" elapsed="0.000101"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.456898" elapsed="0.000472"/>
</kw>
<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="PASS" start="2026-04-10T00:53:02.454842" elapsed="0.002573"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:02.454598" elapsed="0.002867"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.454577" elapsed="0.002913"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:02.458309" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.458041" elapsed="0.000294"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:53:02.458382" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:02.458534" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:02.457716" elapsed="0.000867"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.458782" elapsed="0.000471"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.459574" level="INFO">index=207
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:02.459431" elapsed="0.000274"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.459867" elapsed="0.002846"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.463209" level="INFO">Logging into '10.30.171.151:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:53:02.464255" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</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="FAIL" start="2026-04-10T00:53:02.462932" elapsed="0.001777">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.468620" elapsed="0.000201"/>
</kw>
<msg time="2026-04-10T00:53:02.468866" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:02.468118" elapsed="0.000810"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.469088" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.469314" elapsed="0.000027"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:02.465569" elapsed="0.003840"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:02.465017" elapsed="0.004439"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.451451" elapsed="0.018087">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.469895" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.469968" 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="FAIL" start="2026-04-10T00:53:02.440649" elapsed="0.029423">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<msg time="2026-04-10T00:53:02.470177" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:53:02.470220" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:02.435189" elapsed="0.035053"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.470631" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.470331" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.470312" elapsed="0.000402"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:02.435045" elapsed="0.035692"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:02.309620" elapsed="0.161150"/>
</for>
<arg>${msg}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:53:02.305356" elapsed="0.165476"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.478344" level="INFO">${base_command} = /tmp/karaf-0.23.1/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:02.477951" elapsed="0.000423"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.478958" level="INFO">${command} = /tmp/karaf-0.23.1/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:02.478586" elapsed="0.000399"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-10T00:53:02.479441" level="INFO">${epoch} = 1775782382.479364</msg>
<var>${epoch}</var>
<arg>time_zone=UTC</arg>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-10T00:53:02.479153" elapsed="0.000314"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.480160" level="INFO">${gc_filepath} = /tmp/karaf-0.23.1/data/log/gc_1775782382.479364.log</msg>
<var>${gc_filepath}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/data/log/gc_${epoch}.log</arg>
<arg>${GC_LOG_PATH}/gc_${epoch}.log</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:02.479748" elapsed="0.000438"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.480791" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782382.479364.log</msg>
<var>${gc_options}</var>
<arg>"docker" not in """${node_start_command}"""</arg>
<arg>-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${gc_filepath}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:02.480367" elapsed="0.000452"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.482376" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:02.481968" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.482885" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:02.482584" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:02.482955" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:02.483110" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:02.481592" elapsed="0.001542"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:02.484179" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.483918" elapsed="0.000287"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.485063" level="INFO">index=202
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:02.484937" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.488585" elapsed="0.000092"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.487847" elapsed="0.000922"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.487827" elapsed="0.000970"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.489076" level="INFO">index=202
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:02.488950" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.490388" level="INFO">Attempting to execute command "/tmp/karaf-0.23.1/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782382.479364.log" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:02.489432" elapsed="0.001021"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.491372" level="INFO">${conn_id} = 208</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:02.490644" elapsed="0.000754"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.492973" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:53:02.493240" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:53:02.492399" elapsed="0.000941"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:02.493652" elapsed="0.000669"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.495618" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:53:02.909087" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:52:19 UTC 2026

  System load:  0.99               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:52:23 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:53:02.495285" elapsed="0.414086"/>
</kw>
<msg time="2026-04-10T00:53:02.909520" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:02.494643" elapsed="0.415019"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:53:02.491685" elapsed="0.418158"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:53:02.910519" level="INFO">Executing command '/tmp/karaf-0.23.1/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782382.479364.log'.</msg>
<msg time="2026-04-10T00:53:02.933708" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:53:02.934130" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:53:02.934246" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:53:02.910135" elapsed="0.024169"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:02.934946" elapsed="0.000841"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.938033" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:02.936362" elapsed="0.001750"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.938579" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.938270" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.938233" elapsed="0.000552"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:53:02.939110" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:53:02.938863" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:02.938841" elapsed="0.000496"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.939388" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.947225" elapsed="0.000405"/>
</kw>
<msg time="2026-04-10T00:53:02.947762" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:02.945236" elapsed="0.002729"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.948610" elapsed="0.000071"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.949092" elapsed="0.000079"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:02.939981" elapsed="0.009496"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:53:02.487220" elapsed="0.462439"/>
</kw>
<msg time="2026-04-10T00:53:02.949717" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:02.486389" elapsed="0.463384"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:53:02.485864" elapsed="0.463995"/>
</kw>
<msg time="2026-04-10T00:53:02.949905" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:02.485347" elapsed="0.464607"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:02.954330" elapsed="0.000177"/>
</kw>
<msg time="2026-04-10T00:53:02.954576" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:02.953702" elapsed="0.000945"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.954813" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.954979" elapsed="0.000021"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:02.950299" elapsed="0.004773"/>
</kw>
<msg time="2026-04-10T00:53:02.955177" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:53:02.484422" elapsed="0.470782"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.955711" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:02.955413" elapsed="0.000343"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:53:02.955884" 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-04-10T00:53:02.483501" elapsed="0.472525"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:02.483323" elapsed="0.472742"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:02.483190" elapsed="0.472912"/>
</for>
<arg>command=${command} ${gc_options}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:53:02.481044" elapsed="0.475120"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.969221" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:02.968715" elapsed="0.000542"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.969810" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:02.969436" elapsed="0.000401"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:02.969887" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:53:02.970085" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:02.968166" elapsed="0.001952"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.971802" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:02.971463" elapsed="0.000368"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:02.971880" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:53:02.972037" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:02.971105" elapsed="0.000958"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.981648" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:02.980896" elapsed="0.000818"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:02.982399" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:02.981894" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:02.988503" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.984996" elapsed="0.006062">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-10T00:53:02.982532" elapsed="0.008868">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.991774" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.991451" elapsed="0.000629"/>
</branch>
<status status="FAIL" start="2026-04-10T00:53:02.982507" elapsed="0.009601">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.992769" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.992938" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.992896" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:02.992875" 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-04-10T00:53:02.993160" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.993230" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.975890" elapsed="0.017541">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.993509" elapsed="0.000017"/>
</return>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.972281" elapsed="0.021353">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.994033" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.994162" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:02.994126" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:02.994110" elapsed="0.000114"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.994423" elapsed="0.000024"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.994676" elapsed="0.000024"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-04-10T00:53:02.994745" elapsed="0.000015"/>
</return>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.970698" elapsed="0.024152">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-10T00:53:02.994988" elapsed="0.000025"/>
</continue>
<status status="NOT RUN" start="2026-04-10T00:53:02.994933" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:02.994916" elapsed="0.000147"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.995212" elapsed="0.000022"/>
</kw>
<var name="${index}">3</var>
<status status="FAIL" start="2026-04-10T00:53:02.970411" elapsed="0.024874">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:53:02.970194" elapsed="0.025157">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="FAIL" start="2026-04-10T00:53:02.967743" elapsed="0.027711">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-10T00:53:02.967289" elapsed="0.028226">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-04-10T00:53:02.967262" elapsed="0.028326">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<arg>${member_index_list}</arg>
<status status="NOT RUN" start="2026-04-10T00:53:02.996047" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.995661" elapsed="0.000441"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:02.995644" elapsed="0.000482"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:53:02.996393" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:02.996181" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:02.996165" elapsed="0.000368"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="FAIL" start="2026-04-10T00:53:02.966666" elapsed="0.029990">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:13.015587" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:13.015071" elapsed="0.000553"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:13.016151" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:13.015802" elapsed="0.000378"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:13.016229" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:53:13.016408" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:13.014626" elapsed="0.001808"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:13.018139" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:13.017763" elapsed="0.000405"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:13.018216" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:13.018366" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:13.017370" elapsed="0.001020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:13.028185" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:13.027671" elapsed="0.000580"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:13.028973" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:13.028416" 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-04-10T00:53:13.114108" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:13.114624" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 status=401, reason=Unauthorized 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '524'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 401 Unauthorized&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 401 Unauthorized&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;401&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Unauthorized&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;org.jolokia.osgi.servlet.JolokiaServlet&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-04-10T00:53:13.115386" level="FAIL">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-10T00:53:13.031737" elapsed="0.084864">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-04-10T00:53:13.029104" elapsed="0.088254">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:13.117953" elapsed="0.000089"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:13.117478" elapsed="0.001266"/>
</branch>
<status status="FAIL" start="2026-04-10T00:53:13.029080" elapsed="0.089730">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:13.119997" elapsed="0.000064"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:13.120320" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:13.120233" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:13.120192" elapsed="0.000444"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:13.121000" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:13.121216" elapsed="0.000047"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-10T00:53:13.021329" elapsed="0.100256">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:13.121814" elapsed="0.000042"/>
</return>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-04-10T00:53:13.018642" elapsed="0.103580">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:13.122909" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:53:13.123212" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:13.123129" elapsed="0.000179"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:13.123091" elapsed="0.000267"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:13.124004" elapsed="0.000028"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:13.124240" elapsed="0.000025"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-04-10T00:53:13.124309" elapsed="0.000016"/>
</return>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="FAIL" start="2026-04-10T00:53:13.016969" elapsed="0.107488">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-10T00:53:13.124619" elapsed="0.000019"/>
</continue>
<status status="NOT RUN" start="2026-04-10T00:53:13.124576" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:13.124540" elapsed="0.000147"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:13.124840" elapsed="0.000027"/>
</kw>
<var name="${index}">3</var>
<status status="FAIL" start="2026-04-10T00:53:13.016731" elapsed="0.108212">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:53:13.016495" elapsed="0.108550">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="FAIL" start="2026-04-10T00:53:13.014143" elapsed="0.111084">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-04-10T00:53:13.013681" elapsed="0.111642">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</branch>
<status status="FAIL" start="2026-04-10T00:53:13.013655" elapsed="0.111730">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<arg>${member_index_list}</arg>
<status status="NOT RUN" start="2026-04-10T00:53:13.125733" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:13.125506" elapsed="0.000286"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:13.125485" elapsed="0.000331"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:53:13.126126" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:13.125869" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:13.125853" elapsed="0.000354"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="FAIL" start="2026-04-10T00:53:13.013086" elapsed="0.113204">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.144371" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:23.143904" elapsed="0.000500"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.145016" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:23.144692" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:23.145095" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:53:23.145270" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:23.143390" elapsed="0.001905"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.147168" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:23.146850" elapsed="0.000349"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:23.147250" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:23.147407" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:23.146462" elapsed="0.000971"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.156652" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:23.155937" elapsed="0.000784"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.157623" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:23.156946" elapsed="0.000741"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:23.475980" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:23.476313" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:23 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:23 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-config","member-3-shard-topology-config","member-3-shard-inventory-config","member-3-shard-toaster-config"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782403,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:23.476802" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:23.160770" elapsed="0.316219"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:23.157785" elapsed="0.319812"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.478114" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:23.477690" elapsed="0.001131"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.157757" elapsed="0.321121"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.487511" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-config","member-3-shard-topology-config","member-3-shard-inventory-config","member-3-shard-toaster-config"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782403,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:23.483585" elapsed="0.004102"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:23.481802" elapsed="0.005957"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.481756" elapsed="0.006057"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.492417" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:23.489650" elapsed="0.002871"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:23.487930" elapsed="0.004732"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.487904" elapsed="0.004816"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.494227" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:23.493286" elapsed="0.000984"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.494913" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:23.494412" elapsed="0.000599"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.495909" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:23.495342" elapsed="0.000621"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:23.495050" elapsed="0.001068"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.494391" elapsed="0.001770"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.497689" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:23.496763" elapsed="0.000971"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.498320" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:23.497877" elapsed="0.000534"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.499317" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:23.498771" elapsed="0.000595"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:23.498450" elapsed="0.000974"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.497856" elapsed="0.001607"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:23.499703" elapsed="0.000806"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:23.501512" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:23.500882" elapsed="0.000697"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:23.501885" elapsed="0.003108"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:23.480032" elapsed="0.025102"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:23.505351" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:23.505213" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.505191" elapsed="0.000232"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:23.508925" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782403,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:23.505593" elapsed="0.003362"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:23.509008" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:53:23.509195" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782403,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:23.150326" elapsed="0.358896"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:23.509280" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:23.509432" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782403,...</msg>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:23.147676" elapsed="0.361783"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.510482" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782403,
 "value": {
  "LocalShards": [
   "member-3-shard-default-config",
   "member-3-shard-inventory-config",
   "member-3-shard-toaster-config",
   "member-3-shard-topology-config"
  ],
  "MemberName": "member-3",
  "SyncStatus": true
 }
}
</msg>
<arg>${shard_manager_text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:23.510219" elapsed="0.000313"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.511933" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782403, 'value': {...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:23.511116" elapsed="0.000846"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:23.512012" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:23.512173" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782403, 'value': {...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:23.510769" elapsed="0.001431"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:23.512605" level="INFO">${value_object} = {'LocalShards': ['member-3-shard-default-config', 'member-3-shard-inventory-config', 'member-3-shard-toaster-config', 'member-3-shard-topology-config'], 'MemberName': 'member-3', 'SyncStatus': True}</msg>
<var>${value_object}</var>
<arg>dictionary=${manager_object}</arg>
<arg>key=value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:23.512358" elapsed="0.000274"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:23.513057" level="INFO">${sync_status} = True</msg>
<var>${sync_status}</var>
<arg>dictionary=${value_object}</arg>
<arg>key=SyncStatus</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:23.512834" elapsed="0.000249"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-04-10T00:53:23.513131" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:23.513286" level="INFO">${conf_status} = True</msg>
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="PASS" start="2026-04-10T00:53:23.509730" elapsed="0.003580"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:53:23.513488" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:23.513379" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.513361" elapsed="0.000211"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.521589" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:23.521096" elapsed="0.000553"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.522333" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:23.521861" elapsed="0.000518"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:23.532851" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:23.533039" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:23 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:23 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-operational","member-3-shard-topology-operational","member-3-shard-inventory-operational","member-3-shard-toaster-operational"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782403,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:23.533290" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:23.524911" elapsed="0.008492"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:23.522448" elapsed="0.011311"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.534067" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:23.533801" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.522429" elapsed="0.012088"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.541584" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-operational","member-3-shard-topology-operational","member-3-shard-inventory-operational","member-3-shard-toaster-operational"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782403,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:23.537930" elapsed="0.003802"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:23.536222" elapsed="0.005580"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.536195" elapsed="0.005665"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.547190" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:23.543658" elapsed="0.003634"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:23.542020" elapsed="0.005321"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.541993" elapsed="0.005387"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.548816" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:23.547905" elapsed="0.000954"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.549441" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:23.548998" elapsed="0.000531"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.550423" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:23.549875" elapsed="0.000594"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:23.549585" elapsed="0.000935"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.548978" elapsed="0.001594"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.551917" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:23.551074" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.552533" elapsed="0.000114"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:23.552098" elapsed="0.000601"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.553591" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:23.553064" elapsed="0.000574"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:23.552774" elapsed="0.000915"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.552078" elapsed="0.001647"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:23.553959" elapsed="0.000803"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:23.555662" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:23.555045" elapsed="0.000665"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:23.555971" elapsed="0.003077"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:23.535162" elapsed="0.024022"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:23.559383" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:23.559258" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.559238" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:23.562959" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:23.559617" elapsed="0.003372"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:23.563042" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:23.563201" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:23.516644" elapsed="0.046583"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:23.563284" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:53:23.563435" level="INFO">${oper_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:23.513834" elapsed="0.049627"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.564307" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782403,
 "value": {
  "LocalShards": [
   "member-3-shard-default-operational",
   "member-3-shard-inventory-operational",
   "member-3-shard-toaster-operational",
   "member-3-shard-topology-operational"
  ],
  "MemberName": "member-3",
  "SyncStatus": true
 }
}
</msg>
<arg>${shard_manager_text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:23.564050" elapsed="0.000305"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.565802" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782403, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:23.565050" elapsed="0.000782"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:23.565881" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:23.566094" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782403, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:23.564702" elapsed="0.001421"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:23.566504" level="INFO">${value_object} = {'LocalShards': ['member-3-shard-default-operational', 'member-3-shard-inventory-operational', 'member-3-shard-toaster-operational', 'member-3-shard-topology-operational'], 'MemberName': 'member-3', '...</msg>
<var>${value_object}</var>
<arg>dictionary=${manager_object}</arg>
<arg>key=value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:23.566280" elapsed="0.000252"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:23.566918" level="INFO">${sync_status} = True</msg>
<var>${sync_status}</var>
<arg>dictionary=${value_object}</arg>
<arg>key=SyncStatus</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:23.566708" elapsed="0.000235"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-04-10T00:53:23.566990" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:23.567139" level="INFO">${oper_status} = True</msg>
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="PASS" start="2026-04-10T00:53:23.563692" elapsed="0.003473"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-04-10T00:53:23.567208" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:53:23.567393" level="INFO">${status} = True</msg>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="PASS" start="2026-04-10T00:53:23.145799" elapsed="0.421619"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-04-10T00:53:23.567618" elapsed="0.000034"/>
</continue>
<status status="PASS" start="2026-04-10T00:53:23.567488" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.567471" elapsed="0.000237"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.567857" elapsed="0.000022"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:23.145546" elapsed="0.422367"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:23.145354" elapsed="0.422594"/>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="PASS" start="2026-04-10T00:53:23.142955" elapsed="0.425050"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:23.142578" elapsed="0.425460"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.142533" elapsed="0.425529"/>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.569781" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:23.569384" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.570293" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:23.569970" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:23.570365" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:23.570520" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:23.569007" elapsed="0.001541"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.571608" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:23.571293" elapsed="0.000342"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:23.571680" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:23.571828" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:23.570939" elapsed="0.000913"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.628103" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:23.627661" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:23.629079" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:23.628821" elapsed="0.000335">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:23.629271" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:23.628419" elapsed="0.000900"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.630035" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:23.629595" elapsed="0.000490"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:23.630572" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:23.630747" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:23.630345" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.631328" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:23.631046" 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-04-10T00:53:23.632540" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:23.632286" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.633033" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:23.632767" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.633428" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.633657" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.633837" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:23.633246" elapsed="0.000648"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:23.633109" elapsed="0.000816"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:23.633968" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:23.634130" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:23.631955" elapsed="0.002200"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:23.631588" elapsed="0.002619"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.634513" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:23.634252" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.631503" elapsed="0.003199"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.635539" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:23.634987" elapsed="0.000678"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:23.635749" elapsed="0.000065"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:23.626312" elapsed="0.009678"/>
</kw>
<msg time="2026-04-10T00:53:23.636072" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:23.609877" elapsed="0.026262"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.660787" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.687915" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.716988" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.717281" 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-04-10T00:53:23.717531" elapsed="0.000092"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.719288" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:23.717953" elapsed="0.001514"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:23.717933" elapsed="0.001602"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.720190" elapsed="0.000093"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.720621" elapsed="0.000197"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.721217" elapsed="0.000069"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:23.717887" elapsed="0.003506"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:23.717709" elapsed="0.003714"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.721595" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:23.721674" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:53:23.721838" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:23.605325" elapsed="0.116543"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:23.723684" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:23.723195" elapsed="0.000727">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:23.724048" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:23.722605" elapsed="0.001468"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.724427" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:23.724144" elapsed="0.000474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.725381" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:23.724823" elapsed="0.000638"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:23.724646" elapsed="0.001037"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.724126" elapsed="0.001585"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.738288" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:23.725868" elapsed="0.012448"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:23.738367" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:23.738525" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:23.722253" elapsed="0.016313"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:23.740400" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:23.739910" elapsed="0.000927">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:23.740965" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:23.739267" elapsed="0.001723"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:23.741230" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:23.741062" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.741044" elapsed="0.000272"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.741465" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:23.741657" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:23.741723" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:23.743834" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:23.738908" elapsed="0.004953"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.745650" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:23.745159" elapsed="0.000540"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:23.746329" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:23.745856" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:24.244372" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:24.245769" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:53:24 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:24.246492" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:23.748967" elapsed="0.497767"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:23.746481" elapsed="0.500804"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:24.247829" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:24.247366" elapsed="0.001145"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.746463" elapsed="0.502171"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:24.257501" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:24.254389" elapsed="0.003527"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:24.251485" elapsed="0.006482"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:24.251439" elapsed="0.006567"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:24.262037" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:24.259302" elapsed="0.002836"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:24.258091" elapsed="0.004097"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:24.258072" elapsed="0.004155"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:24.263675" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:24.262782" elapsed="0.000936"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:24.264479" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:24.263872" elapsed="0.000744"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:24.265489" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:24.264971" elapsed="0.000568"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:24.264662" elapsed="0.000948"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:24.263851" elapsed="0.001796"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:24.267051" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:24.266183" elapsed="0.000912"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:24.267696" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:24.267238" elapsed="0.000546"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:24.268807" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:24.268171" elapsed="0.000708"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:24.267829" elapsed="0.001126"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:24.267218" elapsed="0.001777"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:24.269214" elapsed="0.000885"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:24.271035" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:24.270394" elapsed="0.000686"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:24.271378" elapsed="0.003064"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:24.249781" elapsed="0.024831"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:24.274828" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:24.274693" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:24.274672" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:24.284041" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:24.275057" elapsed="0.009016"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:24.284126" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:53:24.284304" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:23.744253" elapsed="0.540079"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:24.284398" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:24.284657" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:23.582294" elapsed="0.702393"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:24.285042" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:24.284777" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:24.284758" elapsed="0.000442"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:24.285237" elapsed="0.000033"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:23.575953" elapsed="0.709469"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:23.570769" elapsed="0.714702"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:23.570625" elapsed="0.714883"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-10T00:53:23.568617" elapsed="0.716970"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:23.568118" elapsed="0.717504"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:23.568103" elapsed="0.717544"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:53:24.286108" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:24.285708" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:24.285690" elapsed="0.000504"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="PASS" start="2026-04-10T00:53:23.142017" elapsed="1.144228"/>
</kw>
<arg>${timeout}</arg>
<arg>10s</arg>
<arg>Verify_Members_Are_Ready</arg>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:53:02.956335" elapsed="21.329975"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement" type="TEARDOWN">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:24.289885" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:24.289390" elapsed="0.000543"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:24.290414" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:24.290105" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:24.290484" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:24.290657" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:24.288918" elapsed="0.001764"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:24.291766" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:24.291483" elapsed="0.000310"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:24.292624" level="INFO">index=202
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:24.292448" elapsed="0.000385"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:24.296275" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:24.295645" elapsed="0.000781"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:24.295624" elapsed="0.000829"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:24.296757" level="INFO">index=202
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:24.296628" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:24.298195" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:24.297101" elapsed="0.001144"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:24.299180" level="INFO">${conn_id} = 209</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:24.298456" elapsed="0.000752"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:53:24.300733" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:53:24.300964" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:53:24.300111" elapsed="0.000952"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:24.301383" elapsed="0.000741"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:53:24.303641" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:53:24.894011" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:53:24 UTC 2026

  System load:  0.55               Processes:             124
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:52:22 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:53:24.303267" elapsed="0.590962"/>
</kw>
<msg time="2026-04-10T00:53:24.894344" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:24.302451" elapsed="0.592061"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:53:24.299476" elapsed="0.595260"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:53:24.895274" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:53:24.907848" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:53:24.908290" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:53:24.908389" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:53:24.894974" elapsed="0.013467"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:24.908865" elapsed="0.000475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:24.910686" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:24.909822" elapsed="0.000969"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:53:24.911292" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:24.910960" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:24.910913" elapsed="0.000538"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:53:24.911895" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-10T00:53:24.911610" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:24.911534" elapsed="0.000548"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:53:24.912158" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:24.918444" elapsed="0.000343"/>
</kw>
<msg time="2026-04-10T00:53:24.918869" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:24.917067" elapsed="0.001951"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:24.919432" elapsed="0.000065"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:24.919878" elapsed="0.000064"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:24.912887" elapsed="0.007244"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:53:24.294915" elapsed="0.625347"/>
</kw>
<msg time="2026-04-10T00:53:24.920522" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:24.294188" elapsed="0.626443"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:53:24.293602" elapsed="0.627136"/>
</kw>
<msg time="2026-04-10T00:53:24.920795" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:24.293044" elapsed="0.627897"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:24.924616" elapsed="0.000157"/>
</kw>
<msg time="2026-04-10T00:53:24.924816" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:24.924104" elapsed="0.000772"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:24.925036" elapsed="0.000048"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:24.925227" elapsed="0.000022"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:24.921358" elapsed="0.003955"/>
</kw>
<msg time="2026-04-10T00:53:24.925401" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:53:24.292010" elapsed="0.633416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:24.925889" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:24.925640" elapsed="0.000290"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:53:24.925973" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:53:24.291050" elapsed="0.635048"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:24.290872" elapsed="0.635262"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:24.927132" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:24.926865" elapsed="0.000293"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:24.927954" level="INFO">index=202
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:24.927823" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:24.931335" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:24.930726" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:24.930707" elapsed="0.000797"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:24.931797" level="INFO">index=202
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:24.931672" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:24.932941" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:24.932134" elapsed="0.000855"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:24.933872" level="INFO">${conn_id} = 210</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:24.933176" elapsed="0.000724"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:53:24.935526" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:53:24.935779" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:53:24.934929" elapsed="0.000948"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:24.936190" elapsed="0.000698"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:53:24.938389" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:53:25.587702" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:53:25 UTC 2026

  System load:  0.76               Processes:             125
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.169
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:52:22 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:53:24.938035" elapsed="0.649968"/>
</kw>
<msg time="2026-04-10T00:53:25.588119" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:24.937241" elapsed="0.651092"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:53:24.934116" elapsed="0.654414"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:53:25.589096" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:53:25.602092" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:53:25.602317" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:53:25.602362" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:53:25.588795" elapsed="0.013591"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:25.602604" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:25.603452" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:25.603052" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:53:25.603774" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:25.603606" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:25.603579" elapsed="0.000273"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:53:25.604034" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:53:25.603906" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:25.603890" elapsed="0.000232"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:53:25.604157" elapsed="0.000014"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:25.609286" elapsed="0.000260"/>
</kw>
<msg time="2026-04-10T00:53:25.609856" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:25.607347" elapsed="0.002648"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:25.610348" elapsed="0.000050"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:25.610683" elapsed="0.000049"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:25.604561" elapsed="0.006323"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:53:24.930002" elapsed="0.680983"/>
</kw>
<msg time="2026-04-10T00:53:25.611039" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:24.929345" elapsed="0.681759"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:53:24.928755" elapsed="0.682429"/>
</kw>
<msg time="2026-04-10T00:53:25.611228" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:24.928232" elapsed="0.683056"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:25.616790" elapsed="0.000171"/>
</kw>
<msg time="2026-04-10T00:53:25.617007" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:25.616188" elapsed="0.000884"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:25.617233" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:25.617394" elapsed="0.000020"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:25.611628" elapsed="0.005846"/>
</kw>
<msg time="2026-04-10T00:53:25.617606" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:53:24.927372" elapsed="0.690260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:25.618090" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:25.617835" elapsed="0.000297"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:53:25.618178" elapsed="0.000034"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:53:24.926410" elapsed="0.691977"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:24.926228" elapsed="0.692195"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:25.619430" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:25.619160" elapsed="0.000297"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:25.620262" level="INFO">index=202
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:25.620122" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:25.623694" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:25.623065" elapsed="0.000778"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:25.623045" elapsed="0.000826"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:25.624143" level="INFO">index=202
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:25.624021" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:25.625351" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:25.624503" elapsed="0.000898"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:25.626266" level="INFO">${conn_id} = 211</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:25.625585" elapsed="0.000708"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:53:25.627737" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:53:25.627965" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:53:25.627122" elapsed="0.000941"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:25.628374" elapsed="0.000770"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:53:25.630668" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:53:26.215636" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:53:25 UTC 2026

  System load:  0.91               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:53:02 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:53:25.630300" elapsed="0.585694"/>
</kw>
<msg time="2026-04-10T00:53:26.216219" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:25.629467" elapsed="0.587059"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:53:25.626511" elapsed="0.590322"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:53:26.217584" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:53:26.230099" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:53:26.230406" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:53:26.230472" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:53:26.217142" elapsed="0.013365"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:26.230840" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:26.232193" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:26.231519" elapsed="0.000874"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:53:26.232977" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:26.232620" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.232530" elapsed="0.000615"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:53:26.233589" elapsed="0.000071"/>
</return>
<status status="PASS" start="2026-04-10T00:53:26.233269" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.233233" elapsed="0.000564"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:53:26.233878" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:26.241789" elapsed="0.000225"/>
</kw>
<msg time="2026-04-10T00:53:26.242074" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:26.240712" elapsed="0.001474"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.242486" elapsed="0.000047"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.242813" elapsed="0.000045"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:26.234674" elapsed="0.008321"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:53:25.622419" elapsed="0.620671"/>
</kw>
<msg time="2026-04-10T00:53:26.243144" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:25.621760" elapsed="0.621446"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:53:25.621138" elapsed="0.622147"/>
</kw>
<msg time="2026-04-10T00:53:26.243358" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:25.620634" elapsed="0.622783"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:26.246917" elapsed="0.000163"/>
</kw>
<msg time="2026-04-10T00:53:26.247125" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:26.246372" elapsed="0.000816"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.247409" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.247606" elapsed="0.000022"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:26.243740" elapsed="0.003951"/>
</kw>
<msg time="2026-04-10T00:53:26.247785" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:53:25.619688" elapsed="0.628123"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:26.248269" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:26.248016" elapsed="0.000294"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:53:26.248353" elapsed="0.000032"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:53:25.618721" elapsed="0.629761"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:25.618517" elapsed="0.630002"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:24.290739" elapsed="1.957915"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:53:24.286600" elapsed="1.962114"/>
</kw>
<arg>${index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${timeout}</arg>
<arg>check_system_status=${check_system_status}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>service_list=${service_list}</arg>
<doc>If the list is empty, start all cluster members. Otherwise, start members based on present indices.
If True, wait for cluster sync on listed members.
Optionally karaf_home can be overriden. Optionally specific JAVA_HOME is used for starting.
Garbage collection is unconditionally logged to files. TODO: Make that reasonable conditional?</doc>
<status status="PASS" start="2026-04-10T00:53:02.471099" elapsed="23.777667"/>
</kw>
<arg>${Follower_Node_2}</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="PASS" start="2026-04-10T00:53:02.291764" elapsed="23.957071"/>
</kw>
<doc>Restart Follower Node2.</doc>
<status status="PASS" start="2026-04-10T00:53:01.983006" elapsed="24.265943"/>
</test>
<test id="s1-s2-t25" name="Check Shards Status After Follower Restart" line="216">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:53:26.252667" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:53:26.252379" elapsed="0.000557"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:26.253964" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:26.253849" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.253830" elapsed="0.000203"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:26.259245" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:26.259138" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.259120" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:26.260393" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:26.259995" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:26.260909" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:26.260604" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:26.260987" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:26.261150" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:26.259589" elapsed="0.001592"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:26.266953" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:26.266845" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.266826" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:26.268281" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:26.268175" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.268157" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:26.268879" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:26.268498" elapsed="0.000412"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:26.269323" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:26.269078" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:26.307166" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:26.269890" elapsed="0.037400"/>
</kw>
<msg time="2026-04-10T00:53:26.307478" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:26.307524" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.269512" elapsed="0.038075"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:26.379995" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:26.308235" elapsed="0.071920"/>
</kw>
<msg time="2026-04-10T00:53:26.380331" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:26.380379" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.307855" elapsed="0.072561"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.380819" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:26.380517" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.380488" elapsed="0.000417"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:26.381379" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:26.381054" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.381863" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:26.381638" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.381619" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:26.381979" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:26.384734" elapsed="0.000158"/>
</kw>
<msg time="2026-04-10T00:53:26.384953" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:26.383514" elapsed="0.001575"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.385366" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.385730" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:26.382868" elapsed="0.003048"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:26.382289" elapsed="0.003691"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:26.267870" elapsed="0.118208"/>
</kw>
<msg time="2026-04-10T00:53:26.386171" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:26.386215" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.267176" elapsed="0.119077"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:26.386444" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:26.386329" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.386311" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.386950" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.387292" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:26.387364" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:26.266483" elapsed="0.120988"/>
</kw>
<msg time="2026-04-10T00:53:26.387585" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:26.387631" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.261595" elapsed="0.126075"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.388033" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:26.387746" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.387729" elapsed="0.000383"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:26.261430" elapsed="0.126705"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:26.393922" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:26.393815" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.393796" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:26.395138" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:26.395030" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.395012" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:26.395680" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:26.395359" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:26.396136" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:26.395866" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:26.432065" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:26.396681" elapsed="0.035584"/>
</kw>
<msg time="2026-04-10T00:53:26.432433" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:26.432480" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.396324" elapsed="0.036193"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:26.538137" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:26.433063" elapsed="0.105354"/>
</kw>
<msg time="2026-04-10T00:53:26.538690" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:26.538742" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.432717" elapsed="0.106065"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.539255" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:26.538901" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.538868" elapsed="0.000477"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:26.540205" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:26.539494" elapsed="0.000809"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.540618" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:26.540373" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.540355" elapsed="0.000368"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:26.540760" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:26.543506" elapsed="0.000187"/>
</kw>
<msg time="2026-04-10T00:53:26.543756" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:26.542362" elapsed="0.001526"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.544162" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.544495" 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-04-10T00:53:26.541705" elapsed="0.003024"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:26.541081" elapsed="0.003716"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:26.394728" elapsed="0.150167"/>
</kw>
<msg time="2026-04-10T00:53:26.544994" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:26.545038" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.394144" elapsed="0.150933"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:26.545264" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:53:26.545157" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.545138" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.545787" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.546132" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:26.546205" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:26.393365" elapsed="0.152950"/>
</kw>
<msg time="2026-04-10T00:53:26.546472" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:26.546517" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.388411" elapsed="0.158167"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.546911" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:26.546658" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.546641" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:26.388269" elapsed="0.158743"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:26.552867" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:26.552696" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.552676" elapsed="0.000264"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:26.554187" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:26.554075" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.554057" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:26.554749" level="INFO">${karaf_connection_index} = 207</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:26.554406" elapsed="0.000371"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:26.555176" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:26.554940" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:26.556035" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:53:26.555762" elapsed="0.001026">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:53:26.556981" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:53:26.557029" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.555389" elapsed="0.001664"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:26.558130" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:53:26.557876" elapsed="0.000923">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:53:26.558987" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:53:26.559033" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.557229" elapsed="0.001828"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:53:26.560013" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Follower Restart"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:53:26.559363" elapsed="0.000717">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Follower Restart"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:53:26.559137" elapsed="0.001015">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Follower Restart"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:53:26.559117" elapsed="0.001070">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Follower Restart"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.560360" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.560616" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:26.560450" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:26.560432" elapsed="0.000265"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:53:26.560730" elapsed="0.000018"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:26.563972" elapsed="0.000220"/>
</kw>
<msg time="2026-04-10T00:53:26.564282" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:26.562650" elapsed="0.001807"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.565003" elapsed="0.000100"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:26.565538" elapsed="0.000120"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:26.561843" elapsed="0.003964"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:26.561094" elapsed="0.004797"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:53:26.553766" elapsed="0.012243">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Follower Restart"</status>
</kw>
<msg time="2026-04-10T00:53:26.566154" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:53:26.566213" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster.Check Shards Status After Follower Restart"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.553103" elapsed="0.013144"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:26.566526" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:26.566371" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.566340" elapsed="0.000292"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:26.567505" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:26.567397" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.567379" elapsed="0.000296"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:26.568042" level="INFO">index=202
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:26.567864" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:26.568664" level="INFO">{1: 88, 2: 153, 3: 207}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:26.568343" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:26.569172" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:26.568917" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:26.569826" elapsed="0.000274"/>
</kw>
<msg time="2026-04-10T00:53:26.570202" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:26.570249" level="INFO">${old_connection_index} = 207</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.569408" elapsed="0.000864"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:26.571125" elapsed="0.000225"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:26.572577" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:53:26.572134" elapsed="0.001464">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.571524" elapsed="0.002178"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:26.574654" elapsed="0.000293"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.573883" elapsed="0.001150"/>
</kw>
<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="PASS" start="2026-04-10T00:53:26.570597" elapsed="0.004485"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:26.570351" elapsed="0.004783"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:26.570332" elapsed="0.004830"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:26.576111" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:26.575793" elapsed="0.000347"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:53:26.576192" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:53:26.576357" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:26.575387" elapsed="0.001004"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:26.576582" elapsed="0.000515"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:26.577416" level="INFO">index=212
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:53:26.580310" elapsed="0.606706"/>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:27.204799" elapsed="0.000421"/>
</kw>
<msg time="2026-04-10T00:53:27.205319" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:27.203302" elapsed="0.002181"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.205809" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.205978" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:27.188295" elapsed="0.017772"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:27.187461" elapsed="0.018655"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:53:26.567072" elapsed="0.639097"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:27.207010" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:27.206890" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.206866" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:27.207469" level="INFO">${karaf_connection_index} = 212</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:27.207234" elapsed="0.000262"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:27.207889" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:27.207699" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:27.291159" 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 "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:27.208420" elapsed="0.082860"/>
</kw>
<msg time="2026-04-10T00:53:27.291415" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:27.291461" 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 "t "e "s "t "[C "o "p "e "n "f "l "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:27.208078" elapsed="0.083420"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:27.448667" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:27.292168" elapsed="0.156646"/>
</kw>
<msg time="2026-04-10T00:53:27.448917" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:27.448962" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:27.291732" elapsed="0.157267"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.449418" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.449163" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.449137" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.449931" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.449666" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.450309" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.450091" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.450073" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:27.450423" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:27.453115" elapsed="0.000411"/>
</kw>
<msg time="2026-04-10T00:53:27.453635" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:27.451704" elapsed="0.002088"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.453959" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.454123" elapsed="0.000021"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:27.451275" elapsed="0.002932"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:27.450748" elapsed="0.003506"/>
</kw>
<msg time="2026-04-10T00:53:27.454381" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:27.206541" elapsed="0.247879"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:27.454468" elapsed="0.000028"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:26.552294" elapsed="0.902319"/>
</kw>
<msg time="2026-04-10T00:53:27.454712" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:27.454756" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.547286" elapsed="0.907506"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.455124" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.454871" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.454853" elapsed="0.000348"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:26.547141" elapsed="0.908084"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:26.261251" elapsed="1.194009"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:53:26.258772" elapsed="1.196550"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:53:26.253536" elapsed="1.201845"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:26.253093" elapsed="1.202336"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:53:26.249872" elapsed="1.205616"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:27.478227" elapsed="0.000228"/>
</kw>
<msg time="2026-04-10T00:53:27.478503" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:27.477601" elapsed="0.000968"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:53:27.477125" elapsed="0.001522"/>
</kw>
<msg time="2026-04-10T00:53:27.478732" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:27.468246" elapsed="0.010531"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:53:27.467846" elapsed="0.011006"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.479287" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.479029" elapsed="0.000303"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.484651" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:27.484247" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.485173" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:27.484865" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:27.485244" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:27.485400" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:27.483872" elapsed="0.001553"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:53:27.485599" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.486256" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:27.485920" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.486705" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:27.486441" elapsed="0.000290"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.487115" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:27.486881" elapsed="0.000259"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.490078" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.489610" elapsed="0.000496"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:27.490153" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:27.490304" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:27.489213" elapsed="0.001118"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.549284" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.548870" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:27.550205" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:27.549847" elapsed="0.000439">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:27.550387" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:27.549480" elapsed="0.000931"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.550982" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:27.550598" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:27.551311" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:27.551465" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:27.551172" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.551965" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.551714" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.553154" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.552721" elapsed="0.000480"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.553660" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:27.553370" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.554014" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.554225" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.554401" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:27.553875" elapsed="0.000584"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:27.553739" elapsed="0.000751"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:27.554534" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:53:27.554715" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:27.552377" elapsed="0.002364"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.552082" elapsed="0.002691"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.554947" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.554797" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.552061" elapsed="0.002963"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.555623" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.555169" elapsed="0.000482"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:27.555701" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:27.548240" elapsed="0.007586"/>
</kw>
<msg time="2026-04-10T00:53:27.555880" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:27.535209" elapsed="0.020722"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.568580" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.581143" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.593855" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.594052" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.594226" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.594835" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.594491" elapsed="0.000402"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:27.594475" elapsed="0.000442"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.595059" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.595227" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.595393" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:27.594445" elapsed="0.001000"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:27.594341" elapsed="0.001130"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.595635" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:27.595712" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:53:27.595981" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:27.530747" elapsed="0.065270"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:27.597869" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:27.597460" elapsed="0.000475">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:27.598035" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:27.597081" elapsed="0.000988"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.598397" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.598148" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.598959" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.598666" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.598477" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.598129" elapsed="0.000913"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.601610" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:27.599193" elapsed="0.002446"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:27.601690" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:27.601996" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:27.596643" elapsed="0.005388"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:27.603708" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:27.603443" elapsed="0.000329">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:27.603865" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:27.603099" elapsed="0.000790"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:27.604092" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:27.603959" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.603940" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.604319" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.604489" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:27.604610" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:53:27.606817" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:27.602666" elapsed="0.004188"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.608641" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.608368" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.609178" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.608931" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:27.622987" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:27.623459" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:27.623973" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:27.611465" elapsed="0.012571"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.609290" elapsed="0.014846"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.624572" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.624196" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.609271" elapsed="0.015500"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.635122" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.627109" elapsed="0.008341"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.626607" elapsed="0.008880"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.626532" elapsed="0.008979"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.638263" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.635816" elapsed="0.002494"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.635586" elapsed="0.002763"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.635567" elapsed="0.002808"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.638953" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.638547" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.639292" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.639052" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.639855" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.639535" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.639373" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.639034" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.640459" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.640099" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.640808" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.640571" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.641348" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.641051" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.640889" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.640536" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:27.641634" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:27.642460" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.642170" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:27.642660" elapsed="0.002427"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:27.625629" elapsed="0.019523"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:27.645327" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:27.645222" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.645204" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:27.653805" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:27.645577" elapsed="0.008258"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:27.653889" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:53:27.654211" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:27.607436" elapsed="0.046813"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:27.654341" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:53:27.654707" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:27.505807" elapsed="0.148942"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.655765" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.654943" elapsed="0.000985"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.654924" elapsed="0.001046"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:27.656060" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:27.494580" elapsed="0.161671"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.490403" elapsed="0.165893"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.490385" elapsed="0.165935"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:27.657050" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:27.656921" elapsed="0.000223"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:53:27.657289" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:27.657169" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.656903" elapsed="0.000520"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.657637" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:53:27.657761" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:27.656630" elapsed="0.001157"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.658400" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.657959" elapsed="0.000468"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.659164" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.658605" elapsed="0.000587"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.715160" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.714334" elapsed="0.001002"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.716341" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.715635" elapsed="0.000872"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:27.727236" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:27.727385" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:27 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":516,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":516,"Leader":"member-2-shard-inventory-operational","LastIndex":517,"RaftState":"Follower","LastApplied":517,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":517,"LastLeadershipChangeTime":"2026-04-10 00:52:30.161","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"392.8 μs","Voting":true,"CurrentTerm":4,"LastTerm":4,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":4,"StatRetrievalError":null,"CommitIndex":517,"SnapshotTerm":4,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":55862220},"timestamp":1775782407,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:27.727975" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:27.719131" elapsed="0.008934"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.716661" elapsed="0.011547"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.729319" elapsed="0.000142"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.728361" elapsed="0.001367"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.716620" elapsed="0.013255"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.736720" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":516,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":516,"Leader":"member-2-shard-inventory-operational","LastIndex":517,"RaftState":"Follower","LastApplied":517,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":517,"LastLeadershipChangeTime":"2026-04-10 00:52:30.161","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"392.8 μs","Voting":true,"CurrentTerm":4,"LastTerm":4,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":4,"StatRetrievalError":null,"CommitIndex":517,"SnapshotTerm":4,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":55862220},"timestamp":1775782407,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.733146" elapsed="0.003673"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.732749" elapsed="0.004121"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.732683" elapsed="0.004253"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.740250" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.737466" elapsed="0.002831"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.737133" elapsed="0.003200"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.737068" elapsed="0.003310"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.741127" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.740669" elapsed="0.000509"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.741594" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.741329" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.742215" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.741866" elapsed="0.000376"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.741695" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.741283" elapsed="0.001037"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.743087" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.742657" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.743528" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.743285" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.744121" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.743816" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.743647" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.743240" elapsed="0.000985"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:27.744472" elapsed="0.000446"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:27.745530" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.745179" elapsed="0.000417"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:27.745847" elapsed="0.003008"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:27.731290" elapsed="0.017719"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:27.749504" elapsed="0.000092"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:27.749193" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.749147" elapsed="0.000596"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:27.753654" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:27.750117" elapsed="0.003635"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:27.753845" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:53:27.754161" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:27.660182" elapsed="0.094047"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:27.754293" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:27.754453" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:27.659407" elapsed="0.095072"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.755922" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.755154" elapsed="0.000798"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:27.756004" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:27.756186" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:27.754779" elapsed="0.001436"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:27.756679" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 517, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:27.756374" elapsed="0.000334"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:27.757150" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:27.756868" elapsed="0.000309"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:27.757226" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:27.757383" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:27.488574" elapsed="0.268834"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:27.757466" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:53:27.757636" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:27.487574" elapsed="0.270087"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:27.757968" elapsed="0.000269"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.757745" elapsed="0.000533"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.758460" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.758302" elapsed="0.000213"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.758701" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.758537" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.757727" elapsed="0.001050"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:27.487388" elapsed="0.271414"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.761500" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.761034" elapsed="0.000494"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:27.761592" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:27.761743" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:27.760666" elapsed="0.001102"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.823121" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.822734" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:27.823962" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:27.823686" elapsed="0.000437">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:27.824223" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:27.823322" elapsed="0.000927"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.824841" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:27.824419" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:27.825182" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:27.825337" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:27.825038" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.825801" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.825529" 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-04-10T00:53:27.826859" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.826598" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.827337" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:27.827068" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.827718" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.827938" 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-04-10T00:53:27.828135" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:27.827577" elapsed="0.000618"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:27.827416" elapsed="0.000810"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:27.828273" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:27.828436" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:27.826223" elapsed="0.002239"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.825922" elapsed="0.002571"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.828688" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.828519" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.825900" elapsed="0.002867"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.829357" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.828913" elapsed="0.000471"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:27.829433" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:27.822045" elapsed="0.007533"/>
</kw>
<msg time="2026-04-10T00:53:27.829635" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:27.809021" elapsed="0.020665"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.842567" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.855514" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.868288" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.868513" 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-04-10T00:53:27.868718" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.869088" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.868941" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:27.868927" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.869310" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.869479" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.869663" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:27.868897" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:27.868796" elapsed="0.000949"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.869892" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:27.869968" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:27.870241" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:27.804358" elapsed="0.065919"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:27.872197" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:27.871948" elapsed="0.000315">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:27.872358" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:27.871389" elapsed="0.000994"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.872803" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.872454" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.873350" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.873057" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.872884" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.872436" elapsed="0.000996"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.875847" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:27.873601" elapsed="0.002273"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:27.875925" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:27.876231" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:27.870947" elapsed="0.005319"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:27.877898" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:27.877656" elapsed="0.000304">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:27.878089" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:27.877301" elapsed="0.000813"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:27.878321" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:53:27.878186" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.878168" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.878629" elapsed="0.000025"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.878809" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:27.878875" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:27.881143" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:27.876867" elapsed="0.004313"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.883021" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.882763" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.883464" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.883223" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:27.911913" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:27.912866" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:27.913314" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:27.885692" elapsed="0.027683"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.883592" elapsed="0.029881"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.913919" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.913532" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.883572" elapsed="0.030541"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.920105" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.916076" elapsed="0.004608"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.915763" elapsed="0.004987"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.915736" elapsed="0.005061"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.924739" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.921302" elapsed="0.003489"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.920910" elapsed="0.003923"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.920875" elapsed="0.003983"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.925530" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.925046" elapsed="0.000532"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.926029" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.925655" elapsed="0.000444"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.926631" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.926291" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.926124" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.925635" elapsed="0.001130"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.927365" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.926956" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.927727" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.927465" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.928275" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.927975" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.927812" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.927446" elapsed="0.000912"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:27.928509" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:27.929347" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.929048" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:27.929530" elapsed="0.002629"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:27.914988" elapsed="0.017237"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:27.932401" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:27.932294" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.932275" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:27.940944" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:27.932633" elapsed="0.008342"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:27.941035" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:53:27.941389" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:27.881807" elapsed="0.059620"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:27.941520" elapsed="0.000096"/>
</return>
<msg time="2026-04-10T00:53:27.941910" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:27.779421" elapsed="0.162535"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.942975" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.942171" elapsed="0.000970"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.942150" elapsed="0.001034"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:27.943275" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:27.766207" elapsed="0.177270"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.761836" elapsed="0.181686"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.761818" elapsed="0.181746"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:27.944284" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:27.944154" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:53:27.944526" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-10T00:53:27.944404" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.944135" elapsed="0.000547"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.944833" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:53:27.944956" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:27.943857" elapsed="0.001125"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.945597" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.945155" elapsed="0.000472"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.946362" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.945786" elapsed="0.000605"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.953509" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.952833" elapsed="0.000853"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.954651" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.953941" elapsed="0.000867"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:27.967247" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:27.967328" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:27 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":64,"SnapshotIndex":516,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":516,"Leader":"member-2-shard-inventory-operational","LastIndex":517,"RaftState":"Leader","LastApplied":517,"LastCommittedTransactionTime":"2026-04-10 00:53:26.718","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational","LastLogIndex":517,"LastLeadershipChangeTime":"2026-04-10 00:52:30.149","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.437","active":true,"matchIndex":517,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":518},{"timeSinceLastActivity":"00:00:00.437","active":true,"matchIndex":517,"voting":true,"id":"member-3-shard-inventory-operational","nextIndex":518}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.037 ms","CurrentTerm":4,"LastTerm":4,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":48,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-3-shard-inventory-operational: true","LastLogTerm":4,"StatRetrievalError":null,"CommitIndex":517,"SnapshotTerm":4,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":15984826},"timestamp":1775782407,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:27.967652" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:27.957451" elapsed="0.010253"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.954959" elapsed="0.012826"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.968309" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.967870" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.954926" elapsed="0.013686"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.974996" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":64,"SnapshotIndex":516,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":516,"Leader":"member-2-shard-inventory-operational","LastIndex":517,"RaftState":"Leader","LastApplied":517,"LastCommittedTransactionTime":"2026-04-10 00:53:26.718","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational","LastLogIndex":517,"LastLeadershipChangeTime":"2026-04-10 00:52:30.149","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.437","active":true,"matchIndex":517,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":518},{"timeSinceLastActivity":"00:00:00.437","active":true,"matchIndex":517,"voting":true,"id":"member-3-shard-inventory-operational","nextIndex":518}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.037 ms","CurrentTerm":4,"LastTerm":4,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":48,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-3-shard-inventory-operational: true","LastLogTerm":4,"StatRetrievalError":null,"CommitIndex":517,"SnapshotTerm":4,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":15984826},"timestamp":1775782407,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.971581" elapsed="0.003501"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.971243" elapsed="0.003887"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.971178" elapsed="0.004014"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.979228" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:27.975722" elapsed="0.003571"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.975382" elapsed="0.003959"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.975318" elapsed="0.004070"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.980102" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.979663" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.980610" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.980304" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.981185" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.980878" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.980713" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.980259" elapsed="0.001028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.981982" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.981546" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.982431" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.982184" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.983035" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.982714" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.982531" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.982138" elapsed="0.001000"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:27.983387" elapsed="0.000446"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:27.984435" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.984095" elapsed="0.000390"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:27.984764" elapsed="0.002522"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:27.969764" elapsed="0.017632"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:27.987770" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:27.987528" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.987495" elapsed="0.000425"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:27.991658" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:27.988150" elapsed="0.003602"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:27.991875" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:53:27.992157" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:27.947457" elapsed="0.044728"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:27.992242" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:53:27.992391" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:27.946641" elapsed="0.045777"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.993777" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:27.993077" elapsed="0.000729"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:27.993854" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:27.994029" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:27.992714" elapsed="0.001341"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:27.994442" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 517, 'CommittedTransactionsCount': 48, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:27.994212" elapsed="0.000258"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:27.994880" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:27.994644" elapsed="0.000261"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:27.994952" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:27.995139" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:27.759997" elapsed="0.235167"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:27.995222" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:53:27.995376" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:27.759142" elapsed="0.236259"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.995717" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.995480" elapsed="0.000294"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:27.996006" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.995798" elapsed="0.000435"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:27.996410" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:27.996258" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.995462" elapsed="0.001022"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:27.758969" elapsed="0.237539"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:27.999295" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:27.998808" elapsed="0.000515"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:27.999368" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:27.999515" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:27.998424" elapsed="0.001116"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.058677" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.058270" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.059605" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:28.059326" elapsed="0.000356">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:28.059776" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:28.058944" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.060358" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:28.059967" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.060707" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:28.060862" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:28.060563" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.061291" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.061046" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.062471" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.062212" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.062967" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.062698" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.063357" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.063580" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.063761" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:28.063187" elapsed="0.000632"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.063046" elapsed="0.000805"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:28.063897" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:53:28.064064" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:28.061728" elapsed="0.002360"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.061409" elapsed="0.002712"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.064295" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.064146" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.061387" elapsed="0.002985"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.064968" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.064517" elapsed="0.000479"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.065059" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:28.057655" elapsed="0.007536"/>
</kw>
<msg time="2026-04-10T00:53:28.065244" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:28.044799" elapsed="0.020496"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.078047" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.090829" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.103518" elapsed="0.000068"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.103808" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.103995" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.104436" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.104275" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:28.104257" 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-04-10T00:53:28.104841" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.105018" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.105189" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:28.104217" elapsed="0.001025"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.104087" elapsed="0.001183"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.105420" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.105499" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:53:28.105850" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:28.040299" elapsed="0.065588"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.107767" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:28.107406" elapsed="0.000438">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:28.107938" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:28.107013" elapsed="0.000949"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.108296" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.108033" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.108879" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.108579" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.108383" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.108015" elapsed="0.000948"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.111535" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:28.109115" elapsed="0.002500"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:28.111668" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:53:28.111975" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:28.106524" elapsed="0.005486"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.113707" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:28.113444" elapsed="0.000325">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:28.113862" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:28.113106" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:28.114089" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:28.113956" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.113938" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.114318" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.114489" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.114569" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:53:28.116741" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:28.112663" elapsed="0.004116"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.118611" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.118328" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.119132" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.118875" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:28.147895" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:28.148848" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:28.149319" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:28.121462" elapsed="0.027917"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.119245" elapsed="0.030230"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.149921" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.149536" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.119227" elapsed="0.030887"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.157637" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.152474" elapsed="0.005522"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.151974" elapsed="0.006059"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.151931" elapsed="0.006127"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.160795" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.158346" elapsed="0.002496"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.158115" elapsed="0.002762"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.158098" elapsed="0.002804"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.161483" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.161082" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.161845" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.161599" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.162418" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.162107" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.161926" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.161580" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.163056" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.162682" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.163390" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.163154" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.163998" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.163652" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.163473" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.163135" elapsed="0.000946"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:28.164235" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:28.165074" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.164770" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.165254" elapsed="0.002438"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:28.150948" elapsed="0.016845"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.167977" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:28.167866" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.167847" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:28.176514" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:28.168194" elapsed="0.008373"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:28.176623" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:53:28.176971" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:28.117383" elapsed="0.059627"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.177104" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:53:28.177453" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:28.015389" elapsed="0.162108"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.178488" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.177718" elapsed="0.000967"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.177698" elapsed="0.001031"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.178819" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:28.003791" elapsed="0.175230"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:27.999625" elapsed="0.179441"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:27.999607" elapsed="0.179484"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.179886" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:28.179709" elapsed="0.000274"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:53:28.180130" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:28.180009" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.179691" elapsed="0.000575"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.180419" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:53:28.180540" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:28.179391" elapsed="0.001192"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.181171" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.180757" elapsed="0.000441"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.181934" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.181355" elapsed="0.000607"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.189527" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.188834" elapsed="0.000876"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.190693" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.189973" elapsed="0.000882"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:28.208442" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:28.208610" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:28 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":516,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":516,"Leader":"member-2-shard-inventory-operational","LastIndex":517,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":517,"LastLogIndex":517,"LastLeadershipChangeTime":"2026-04-10 00:53:13.340","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"4.183 ms","Voting":true,"CurrentTerm":4,"LastTerm":4,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":4,"StatRetrievalError":null,"CommitIndex":517,"SnapshotTerm":4,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":5703607},"timestamp":1775782408,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:28.209071" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:28.193384" elapsed="0.015765"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.190972" elapsed="0.018303"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.210161" elapsed="0.000102"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.209409" elapsed="0.000979"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.190940" elapsed="0.019571"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.220781" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":516,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":516,"Leader":"member-2-shard-inventory-operational","LastIndex":517,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":517,"LastLogIndex":517,"LastLeadershipChangeTime":"2026-04-10 00:53:13.340","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"4.183 ms","Voting":true,"CurrentTerm":4,"LastTerm":4,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":4,"StatRetrievalError":null,"CommitIndex":517,"SnapshotTerm":4,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":5703607},"timestamp":1775782408,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.215449" elapsed="0.005397"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.214836" elapsed="0.006047"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.214735" elapsed="0.006195"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.223811" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.221297" elapsed="0.002561"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.221067" elapsed="0.002827"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.221023" elapsed="0.002937"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.224793" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.224310" elapsed="0.000534"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.225243" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.224999" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.225845" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.225515" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.225346" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.224951" elapsed="0.000998"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.226650" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.226207" elapsed="0.000494"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.227096" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.226855" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.227729" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.227379" elapsed="0.000377"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.227198" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.226808" elapsed="0.001025"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:28.228149" elapsed="0.000456"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:28.229227" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.228872" elapsed="0.000406"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.229528" elapsed="0.002587"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:28.212453" elapsed="0.019777"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.232650" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:28.232363" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.232329" elapsed="0.000476"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:28.236498" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:28.233038" elapsed="0.003608"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:28.236822" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:53:28.237115" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:28.182988" elapsed="0.054155"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.237282" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:28.237441" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:28.182177" elapsed="0.055291"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.238853" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.238134" elapsed="0.000750"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:28.238933" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:28.239108" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:28.237728" elapsed="0.001407"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:28.239520" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 517, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.239295" elapsed="0.000270"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:28.239965" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.239727" elapsed="0.000264"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:28.240082" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:53:28.240250" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:27.997815" elapsed="0.242459"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:28.240332" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:53:28.240481" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:27.996904" elapsed="0.243603"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.240853" elapsed="0.000195"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.240629" elapsed="0.000456"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.241256" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.241109" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.242913" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.242749" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.240609" elapsed="0.002384"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:27.996733" elapsed="0.246285"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:27.487187" elapsed="0.755864"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:53:28.243094" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:28.243300" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:53:28.243349" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:53:27.483134" elapsed="0.760238"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.243850" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:53:28.243928" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:53:28.243569" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.244297" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.244070" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.244007" elapsed="0.000376"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.246575" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:53:28.244523" elapsed="0.002102"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:53:28.247027" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.246833" elapsed="0.000220"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:53:28.247101" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:53:27.480355" elapsed="0.766904"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:53:27.480127" elapsed="0.767179"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.251983" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:28.251587" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.252544" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:28.252231" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:28.252633" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:28.252791" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:28.251192" elapsed="0.001623"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:53:28.252971" elapsed="0.000157"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.253653" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:28.253290" elapsed="0.000390"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.254109" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:28.253838" elapsed="0.000308"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.254596" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:28.254329" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.257323" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.256861" elapsed="0.000490"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:28.257397" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:28.257568" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:28.256461" elapsed="0.001135"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.317364" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.316968" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.318193" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:28.317929" elapsed="0.000342">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:28.318365" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:28.317584" elapsed="0.000806"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.318969" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:28.318576" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.319307" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:28.319469" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:28.319164" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.319988" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.319732" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.321072" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.320813" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.321565" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.321281" elapsed="0.000312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.321929" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.322138" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.322317" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:28.321790" elapsed="0.000587"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.321647" elapsed="0.000761"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:28.322455" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:53:28.322644" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:28.320465" elapsed="0.002205"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.320114" elapsed="0.002590"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.322881" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.322729" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.320091" elapsed="0.002869"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.323569" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.323108" elapsed="0.000491"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.323649" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:28.316296" elapsed="0.007481"/>
</kw>
<msg time="2026-04-10T00:53:28.323831" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:28.303091" elapsed="0.020794"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.336906" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.349673" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.362204" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.362422" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.362622" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.363093" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.362942" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:28.362926" 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-04-10T00:53:28.363318" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.363488" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.363676" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:28.362889" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.362774" elapsed="0.000985"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.363908" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.363987" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:53:28.364305" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:28.298591" elapsed="0.065752"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.366164" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:28.365878" elapsed="0.000360">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:28.366332" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:28.365470" 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-04-10T00:53:28.366711" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.366429" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.367269" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.366972" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.366793" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.366411" elapsed="0.000941"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.369775" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:28.367502" elapsed="0.002300"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:28.369852" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:28.370159" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:28.365005" elapsed="0.005190"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.371856" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:28.371607" elapsed="0.000314">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:28.372014" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:28.371249" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:28.372245" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:28.372110" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.372092" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.372476" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.372687" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.372756" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:28.375083" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:28.370810" elapsed="0.004311"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.376963" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.376699" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.377406" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.377165" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:28.388858" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:28.389451" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:28.389808" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:28.379643" elapsed="0.010205"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.377516" elapsed="0.012393"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.390163" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.389947" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.377498" elapsed="0.012784"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.395687" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.391754" elapsed="0.004381"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.391416" elapsed="0.004769"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.391390" elapsed="0.004830"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.400051" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.396662" elapsed="0.003454"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.396299" elapsed="0.003865"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.396276" elapsed="0.003922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.401049" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.400435" elapsed="0.000652"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.401473" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.401186" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.402038" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.401737" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.401572" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.401160" elapsed="0.000961"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.402659" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.402281" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.402988" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.402756" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.403521" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.403227" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.403067" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.402738" elapsed="0.000883"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:28.403772" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:28.404592" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.404277" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.404788" elapsed="0.002417"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:28.390821" elapsed="0.016448"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.407444" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:28.407338" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.407319" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:28.415975" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:28.407676" elapsed="0.008332"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:28.416066" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:53:28.416415" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:28.375720" elapsed="0.040732"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.416843" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:53:28.417185" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:28.273099" elapsed="0.144127"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.418372" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.417421" elapsed="0.001145"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.417401" elapsed="0.001208"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.418697" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:28.262060" elapsed="0.156831"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.257668" elapsed="0.161268"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.257649" elapsed="0.161312"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.419706" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:28.419574" elapsed="0.000225"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:53:28.419942" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:28.419823" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.419539" elapsed="0.000535"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.420232" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:53:28.420353" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:28.419252" elapsed="0.001127"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.421024" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.420572" elapsed="0.000480"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.421811" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.421211" elapsed="0.000629"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.429013" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.428292" elapsed="0.000884"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.430148" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.429434" elapsed="0.000874"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:28.438986" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:28.439048" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:28 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":6,"SnapshotIndex":57,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":57,"Leader":"member-1-shard-topology-operational","LastIndex":58,"RaftState":"Leader","LastApplied":58,"LastCommittedTransactionTime":"2026-04-10 00:52:40.807","LastLogIndex":58,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.032","active":true,"matchIndex":58,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":59},{"timeSinceLastActivity":"00:00:00.032","active":true,"matchIndex":58,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":59}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"598.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":6,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":58,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":750},"timestamp":1775782408,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:28.439263" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:28.432872" elapsed="0.006427"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.430431" elapsed="0.008925"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.439760" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.439418" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.430398" elapsed="0.009559"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.446297" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":6,"SnapshotIndex":57,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":57,"Leader":"member-1-shard-topology-operational","LastIndex":58,"RaftState":"Leader","LastApplied":58,"LastCommittedTransactionTime":"2026-04-10 00:52:40.807","LastLogIndex":58,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.032","active":true,"matchIndex":58,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":59},{"timeSinceLastActivity":"00:00:00.032","active":true,"matchIndex":58,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":59}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"598.7 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":6,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":58,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":750},"timestamp":1775782408,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.442542" elapsed="0.003844"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.442226" elapsed="0.004210"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.442161" elapsed="0.004338"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.450349" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.447038" elapsed="0.003357"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.446717" elapsed="0.003713"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.446653" elapsed="0.003823"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.451205" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.450760" elapsed="0.000496"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.451681" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.451407" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.452258" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.451951" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.451784" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.451362" elapsed="0.001001"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.453081" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.452641" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.453521" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.453283" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.454103" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.453802" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.453638" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.453237" elapsed="0.000966"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:28.454448" elapsed="0.000445"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:28.455498" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.455153" elapsed="0.000415"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.455819" elapsed="0.002517"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:28.440949" elapsed="0.017500"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.458821" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:28.458598" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.458562" elapsed="0.000408"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:28.462725" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:28.459200" elapsed="0.003620"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:28.462945" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:53:28.463233" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:28.422847" elapsed="0.040414"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.463320" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:53:28.463470" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:28.422058" elapsed="0.041437"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.464849" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757824...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.464113" elapsed="0.000765"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:28.464958" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:28.465143" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757824...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:28.463743" elapsed="0.001427"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:28.465583" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 58, 'CommittedTransactionsCount': 6, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.465328" elapsed="0.000285"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:28.466010" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.465773" elapsed="0.000263"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:28.466084" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:28.466239" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:28.255788" elapsed="0.210476"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:28.466321" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:53:28.466469" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:28.255057" elapsed="0.211436"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.466819" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.466597" elapsed="0.000279"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.467107" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.466900" elapsed="0.000434"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.467505" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.467358" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.466578" elapsed="0.001018"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:28.254886" elapsed="0.212735"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.470327" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.469861" elapsed="0.000494"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:28.470401" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:28.470567" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:28.469325" elapsed="0.001269"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.529826" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.529412" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.530765" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:28.530484" elapsed="0.000359">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:28.530938" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:28.530098" elapsed="0.000865"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.531517" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:28.531130" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.531866" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:28.532020" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:28.531724" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.532453" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.532205" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.533524" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.533262" elapsed="0.000325"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.534038" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.533752" elapsed="0.000322"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.534518" elapsed="0.000047"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.534789" elapsed="0.000030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.535006" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:28.534349" elapsed="0.000744"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.534157" elapsed="0.000987"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:28.535205" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:53:28.535389" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:28.532898" elapsed="0.002519"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.532592" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.535646" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.535475" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.532569" elapsed="0.003156"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.536350" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.535871" elapsed="0.000507"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.536427" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:28.528745" elapsed="0.007825"/>
</kw>
<msg time="2026-04-10T00:53:28.536628" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:28.515566" elapsed="0.021130"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.550073" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.562827" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.575370" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.575596" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.575781" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.576174" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.576024" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:28.576008" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.576401" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.576586" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.576754" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:28.575975" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.575865" elapsed="0.000968"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.576981" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.577058" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:53:28.577404" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:28.511086" elapsed="0.066356"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.579245" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:28.578956" elapsed="0.000367">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:28.579416" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:28.578563" elapsed="0.000878"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.579786" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.579511" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.580341" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.580046" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.579868" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.579493" elapsed="0.000932"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.582863" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:28.580594" elapsed="0.002295"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:28.582941" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:53:28.583250" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:28.578085" elapsed="0.005199"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.585003" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:28.584751" elapsed="0.000317">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:28.585163" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:28.584394" elapsed="0.000793"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:28.585392" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-04-10T00:53:28.585258" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.585240" elapsed="0.000264"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.585667" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.585841" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.585907" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:28.588183" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:28.583953" elapsed="0.004266"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.590087" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.589826" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.590532" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.590287" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:28.610368" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:28.610819" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:28.611032" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:28.592847" elapsed="0.018213"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.590678" elapsed="0.020426"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.611288" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.611132" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.590660" elapsed="0.020715"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.615198" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.612405" elapsed="0.003115"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.612181" elapsed="0.003391"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.612162" elapsed="0.003436"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.618297" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.615885" elapsed="0.002458"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.615657" elapsed="0.002720"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.615639" elapsed="0.002762"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.619145" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.618760" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.619476" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.619242" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.620039" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.619739" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.619575" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.619223" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.620655" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.620280" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.620981" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.620751" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.621512" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.621219" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.621061" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.620733" elapsed="0.000927"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:28.621811" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:28.622814" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.622320" elapsed="0.000520"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.622996" elapsed="0.002532"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:28.611754" elapsed="0.013878"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.625818" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:28.625710" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.625691" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:28.634198" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:28.626029" elapsed="0.008199"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:28.634280" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:53:28.634660" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:28.588832" elapsed="0.045865"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.634787" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:53:28.635123" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:28.485944" elapsed="0.149223"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.636096" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.635356" elapsed="0.000898"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.635337" elapsed="0.000958"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.636386" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:28.474982" elapsed="0.161615"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.470663" elapsed="0.165980"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.470645" elapsed="0.166023"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.637373" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:28.637247" elapsed="0.000219"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:53:28.637667" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:53:28.637491" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.637230" elapsed="0.000575"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.637955" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:53:28.638077" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:28.636959" elapsed="0.001143"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.638700" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.638272" elapsed="0.000455"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.639436" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.638883" elapsed="0.000581"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.646604" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.645901" elapsed="0.000867"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.647758" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.647026" elapsed="0.000890"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:28.660016" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:28.660077" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:28 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":57,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":57,"Leader":"member-1-shard-topology-operational","LastIndex":58,"RaftState":"Follower","LastApplied":58,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":58,"LastLeadershipChangeTime":"2026-04-10 00:51:03.906","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"353.2 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":58,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":2551},"timestamp":1775782408,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:28.660289" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:28.650405" elapsed="0.009921"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.648034" elapsed="0.012354"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.660793" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.660450" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.648001" elapsed="0.012953"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.665714" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":57,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":57,"Leader":"member-1-shard-topology-operational","LastIndex":58,"RaftState":"Follower","LastApplied":58,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":58,"LastLeadershipChangeTime":"2026-04-10 00:51:03.906","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"353.2 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":58,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":2551},"timestamp":1775782408,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.663064" elapsed="0.002727"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.662840" elapsed="0.002987"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.662795" elapsed="0.003077"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.668654" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.666236" elapsed="0.002464"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.666008" elapsed="0.002726"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.665964" elapsed="0.002813"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.669468" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.669036" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.670045" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.669797" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.670642" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.670311" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.670146" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.669716" elapsed="0.001028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.671419" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.671000" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.671883" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.671641" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.672449" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.672146" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.671981" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.671595" elapsed="0.000970"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:28.672813" elapsed="0.000425"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:28.673886" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.673497" elapsed="0.000439"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.674184" elapsed="0.002491"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:28.661811" elapsed="0.014972"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.677140" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:28.676916" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.676882" elapsed="0.000407"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:28.680936" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:28.677518" elapsed="0.003510"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:28.681115" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:53:28.681390" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:28.640461" elapsed="0.040956"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.681510" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:28.681739" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:28.639704" elapsed="0.042062"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.683079" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757824...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.682369" elapsed="0.000739"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:28.683156" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:28.683330" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757824...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:28.682004" elapsed="0.001352"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:28.683752" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 58, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.683513" elapsed="0.000267"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:28.684170" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.683937" elapsed="0.000259"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:28.684243" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:28.684393" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:28.468700" elapsed="0.215718"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:28.684476" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:53:28.684645" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:28.467964" elapsed="0.216706"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.684969" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.684752" elapsed="0.000444"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.685366" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.685220" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.685651" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.685450" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.684735" elapsed="0.000992"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:28.467791" elapsed="0.217960"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.688293" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.687833" elapsed="0.000487"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:28.688365" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:28.688517" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:28.687449" elapsed="0.001092"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.747789" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.747381" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.748627" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:28.748333" elapsed="0.000373">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:28.748904" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:28.747995" elapsed="0.000934"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.749487" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:28.749097" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.749843" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:28.749997" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:28.749701" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.750466" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.750218" 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-04-10T00:53:28.751488" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.751234" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.751985" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.751717" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.752342" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.752566" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.752746" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:28.752203" elapsed="0.000601"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.752063" elapsed="0.000772"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:28.752882" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:53:28.753047" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:28.750908" elapsed="0.002164"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.750605" elapsed="0.002500"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.753278" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.753129" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.750581" elapsed="0.002775"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.753958" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.753499" elapsed="0.000487"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.754035" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:28.746757" elapsed="0.007421"/>
</kw>
<msg time="2026-04-10T00:53:28.754232" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:28.733820" elapsed="0.020466"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.768655" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.781316" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.793999" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.794197" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.794396" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.794782" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.794636" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:28.794620" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.795005" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.795175" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.795343" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:28.794589" elapsed="0.000808"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.794475" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.795585" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.795663" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:53:28.795941" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:28.729266" elapsed="0.066711"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.797662" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:28.797389" elapsed="0.000344">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:28.797825" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:28.797038" elapsed="0.000811"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.798167" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.797921" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.798842" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.798517" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.798246" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.797903" elapsed="0.001024"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.801276" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:28.799078" elapsed="0.002224"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:28.801354" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:28.801717" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:28.796595" elapsed="0.005158"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.803496" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:28.803253" elapsed="0.000325">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:28.803709" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:28.802911" elapsed="0.000823"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:28.803941" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:28.803806" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.803788" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.804171" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.804342" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.804408" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:28.806695" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:28.802372" elapsed="0.004360"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.808513" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.808256" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.808977" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.808734" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:28.832066" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:28.832498" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:28.832731" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:28.811210" elapsed="0.021549"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.809087" elapsed="0.023716"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.832985" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.832830" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.809069" elapsed="0.024003"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.836952" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.834098" elapsed="0.003180"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.833876" elapsed="0.003438"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.833858" elapsed="0.003481"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.840082" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.837638" elapsed="0.002491"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.837395" elapsed="0.002769"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.837378" elapsed="0.002809"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.840758" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.840354" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.841091" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.840856" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.841654" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.841337" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.841173" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.840837" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.842257" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.841898" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.842649" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.842354" elapsed="0.000355"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.843184" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.842892" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.842733" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.842336" elapsed="0.000931"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:28.843439" elapsed="0.000375"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:28.844268" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.843979" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.844449" elapsed="0.002480"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:28.833435" elapsed="0.013559"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.847171" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:28.847065" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.847046" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:28.855879" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:28.847385" elapsed="0.008525"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:28.855964" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:53:28.856297" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:28.807318" elapsed="0.049017"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.856427" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:53:28.856792" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:28.704060" elapsed="0.152776"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.857784" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.857030" elapsed="0.000923"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.857011" elapsed="0.000983"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.858084" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:28.692970" elapsed="0.165308"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.688629" elapsed="0.169694"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.688611" elapsed="0.169736"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.859129" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:28.859001" elapsed="0.000222"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:53:28.859370" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:53:28.859248" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.858984" elapsed="0.000522"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.859674" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:53:28.859797" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:28.858708" elapsed="0.001115"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.860412" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.859996" elapsed="0.000444"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.861186" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.860617" elapsed="0.000598"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.868454" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.867765" elapsed="0.000871"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.869700" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.868897" elapsed="0.000960"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:28.881024" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:28.881086" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:28 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":58,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":57,"Leader":"member-1-shard-topology-operational","LastIndex":58,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":58,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:53:13.333","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"643.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":58,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782408,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:28.881299" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:28.872420" elapsed="0.008914"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.869975" elapsed="0.011420"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.881838" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.881455" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.869943" elapsed="0.012055"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.886795" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":58,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":57,"Leader":"member-1-shard-topology-operational","LastIndex":58,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":58,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:53:13.333","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"643.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":58,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782408,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.884126" elapsed="0.002730"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.883858" elapsed="0.003033"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.883812" elapsed="0.003124"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.889742" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.887302" elapsed="0.002486"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.887072" elapsed="0.002751"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.887027" elapsed="0.002840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.890583" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.890123" elapsed="0.000512"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.891064" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.890820" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.891743" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.891332" elapsed="0.000438"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.891164" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.890774" elapsed="0.001073"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.892519" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.892099" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.892980" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.892738" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.893568" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.893245" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.893078" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.892693" elapsed="0.000978"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:28.893915" elapsed="0.000424"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:28.894961" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.894612" elapsed="0.000398"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.895258" elapsed="0.002530"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:28.882850" elapsed="0.015046"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.898240" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:28.898025" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.897993" elapsed="0.000396"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:28.902057" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:28.898638" elapsed="0.003510"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:28.902235" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:53:28.902511" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:28.862226" elapsed="0.040313"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.902649" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:28.902828" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:28.861433" elapsed="0.041421"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.904212" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757824...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.903445" elapsed="0.000796"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:28.904289" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:28.904464" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757824...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:28.903078" elapsed="0.001412"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:28.904890" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 58, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.904664" elapsed="0.000253"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:28.905308" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.905074" elapsed="0.000260"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:28.905381" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:28.905535" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:28.686850" elapsed="0.218727"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:28.905635" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:28.905785" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:28.686121" elapsed="0.219687"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.906106" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.905889" elapsed="0.000444"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.906502" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.906357" elapsed="0.000217"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.906773" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.906598" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.905871" elapsed="0.000977"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:28.685949" elapsed="0.220923"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:28.254678" elapsed="0.652227"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:53:28.906947" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:53:28.907147" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:53:28.907194" level="INFO">${follower_list} = [2, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:53:28.250448" elapsed="0.656769"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.907752" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:53:28.907836" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:53:28.907393" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.908238" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.907931" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.907913" elapsed="0.000405"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.910593" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:53:28.908457" elapsed="0.002185"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:53:28.911094" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.910895" elapsed="0.000226"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:53:28.911170" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:53:28.247658" elapsed="0.663668"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:53:28.247403" elapsed="0.663971"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.916108" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:28.915675" elapsed="0.000460"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.916629" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:28.916297" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:28.916701" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:28.916856" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:28.915240" elapsed="0.001641"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:53:28.917036" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.917710" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:28.917354" elapsed="0.000382"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.918160" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:28.917895" elapsed="0.000291"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.918597" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:28.918337" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.921322" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.920839" elapsed="0.000512"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:28.921397" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:28.921570" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:28.920446" elapsed="0.001153"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.982642" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:28.982219" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.983493" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:28.983232" elapsed="0.000354">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:28.983684" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:28.982851" elapsed="0.000859"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.984272" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:28.983880" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:28.984623" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:28.984782" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:28.984462" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.985287" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.985033" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.986324" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:28.986066" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.986822" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:28.986534" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.987202" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.987416" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.987609" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:28.987063" elapsed="0.000606"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:28.986901" elapsed="0.000799"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:28.987748" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:53:28.987915" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:28.985739" elapsed="0.002201"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.985412" elapsed="0.002561"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:28.988146" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:28.987998" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.985389" elapsed="0.002835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:28.988835" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:28.988374" elapsed="0.000488"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:28.988912" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:28.981602" elapsed="0.007436"/>
</kw>
<msg time="2026-04-10T00:53:28.989092" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:28.968207" elapsed="0.020937"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.001956" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.014577" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.027576" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.027778" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.027957" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.028374" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.028226" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:29.028211" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.028612" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.028784" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.028951" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:29.028181" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.028076" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.029179" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.029255" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:29.029537" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:28.963642" elapsed="0.065956"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.031310" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:29.031024" elapsed="0.000355">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:29.031472" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:29.030673" elapsed="0.000823"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.031834" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.031583" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.032391" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.032095" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.031916" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.031564" elapsed="0.000910"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.034865" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:29.032657" elapsed="0.002235"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:29.034942" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:29.035276" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:29.030216" elapsed="0.005096"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.037046" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:29.036798" elapsed="0.000311">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:29.037202" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:29.036368" elapsed="0.000858"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:29.037430" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:29.037296" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.037278" elapsed="0.000233"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.037676" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.037848" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.037913" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:29.040239" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:29.035931" elapsed="0.004346"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.042209" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.041925" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.042681" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.042416" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:29.053076" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:29.053538" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:29.053815" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:29.044905" elapsed="0.008939"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.042791" elapsed="0.011106"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.054132" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.053933" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.042773" elapsed="0.011449"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.058309" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.055419" elapsed="0.003253"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.055135" elapsed="0.003576"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.055115" elapsed="0.003621"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.062098" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.059043" elapsed="0.003126"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.058799" elapsed="0.003421"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.058780" elapsed="0.003475"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.063116" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.062530" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.063711" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.063257" elapsed="0.000547"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.064511" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.064069" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.063837" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.063232" elapsed="0.001430"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.065527" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.064972" elapsed="0.000634"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.066101" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.065718" elapsed="0.000473"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.066943" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.066472" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.066227" elapsed="0.000808"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.065690" elapsed="0.001376"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:29.067301" elapsed="0.000701"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:29.068613" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.068259" elapsed="0.000381"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.068800" elapsed="0.002722"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:29.054654" elapsed="0.016956"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.071798" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:29.071685" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.071665" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:29.080541" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:29.072019" elapsed="0.008573"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:29.080653" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:53:29.081043" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:29.040917" elapsed="0.040165"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.081177" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:53:29.081568" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:28.937671" elapsed="0.143969"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.082674" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.081853" elapsed="0.001035"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.081831" elapsed="0.001101"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.083026" elapsed="0.000031"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:28.926090" elapsed="0.157135"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:28.921671" elapsed="0.161601"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:28.921651" elapsed="0.161647"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.084142" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:29.084009" elapsed="0.000229"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:53:29.084386" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:29.084264" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.083991" elapsed="0.000530"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.084705" elapsed="0.000024"/>
</kw>
<msg time="2026-04-10T00:53:29.084828" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:29.083684" elapsed="0.001170"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.085495" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.085043" elapsed="0.000480"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.086298" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.085719" elapsed="0.000610"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.093735" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.092985" elapsed="0.000923"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.094960" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.094176" elapsed="0.000946"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:29.103948" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:29.104013" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:29 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":49,"SnapshotIndex":298,"InMemoryJournalLogSize":4,"ReplicatedToAllIndex":298,"Leader":"member-1-shard-default-operational","LastIndex":302,"RaftState":"Leader","LastApplied":299,"LastCommittedTransactionTime":"2026-04-10 00:53:15.200","LastLogIndex":302,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.164","active":true,"matchIndex":299,"voting":true,"id":"member-3-shard-default-operational","nextIndex":300},{"timeSinceLastActivity":"00:00:00.165","active":true,"matchIndex":299,"voting":true,"id":"member-2-shard-default-operational","nextIndex":300}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"471.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":6,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":299,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":48,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":3084},"timestamp":1775782409,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:29.104234" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:29.097779" elapsed="0.006493"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.095249" elapsed="0.009082"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.104745" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.104400" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.095212" elapsed="0.009752"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.110817" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":49,"SnapshotIndex":298,"InMemoryJournalLogSize":4,"ReplicatedToAllIndex":298,"Leader":"member-1-shard-default-operational","LastIndex":302,"RaftState":"Leader","LastApplied":299,"LastCommittedTransactionTime":"2026-04-10 00:53:15.200","LastLogIndex":302,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.164","active":true,"matchIndex":299,"voting":true,"id":"member-3-shard-default-operational","nextIndex":300},{"timeSinceLastActivity":"00:00:00.165","active":true,"matchIndex":299,"voting":true,"id":"member-2-shard-default-operational","nextIndex":300}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"471.5 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":6,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":299,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":48,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":3084},"timestamp":1775782409,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.107319" elapsed="0.003587"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.107080" elapsed="0.003875"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.107033" elapsed="0.003987"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.115126" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.111693" elapsed="0.003498"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.111210" elapsed="0.004029"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.111147" elapsed="0.004154"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.116420" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.115784" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.116945" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.116691" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.117538" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.117214" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.117048" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.116642" elapsed="0.001020"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.118356" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.117921" elapsed="0.000489"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.118925" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.118602" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.119508" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.119198" elapsed="0.000385"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.119031" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.118517" elapsed="0.001152"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:29.119928" elapsed="0.000434"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:29.120998" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.120645" elapsed="0.000403"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.121311" elapsed="0.002585"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:29.105840" elapsed="0.018170"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.124373" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:29.124145" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.124112" elapsed="0.000413"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:29.128829" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:29.124782" elapsed="0.004142"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:29.129059" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:53:29.129351" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:29.087371" elapsed="0.042008"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.129438" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:29.129610" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:29.086596" elapsed="0.043040"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.131015" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578240...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.130252" elapsed="0.000793"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:29.131095" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:29.131279" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578240...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:29.129873" elapsed="0.001433"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:29.131812" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 299, 'CommittedTransactionsCount': 6, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.131467" elapsed="0.000373"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:29.132239" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.132001" elapsed="0.000263"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:29.132312" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:29.132467" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:28.919832" elapsed="0.212660"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:29.132567" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:29.132723" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:28.919100" elapsed="0.213648"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.133052" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.132831" elapsed="0.000277"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.133340" elapsed="0.000189"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.133131" elapsed="0.000453"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.133758" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.133609" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.132813" elapsed="0.001019"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:28.918917" elapsed="0.214939"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.136491" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.136013" elapsed="0.000505"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:29.136583" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:29.136733" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:29.135624" elapsed="0.001133"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.196281" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.195892" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.197159" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:29.196899" elapsed="0.000335">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:29.197328" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:29.196538" elapsed="0.000815"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.197936" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:29.197520" elapsed="0.000444"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.198272" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:29.198423" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:29.198129" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.198872" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.198625" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.199910" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.199634" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.200383" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.200119" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.200755" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.200960" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.201136" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:29.200617" elapsed="0.000578"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.200459" elapsed="0.000767"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:29.201270" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:29.201431" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:29.199288" elapsed="0.002169"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.198990" elapsed="0.002499"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.201677" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.201513" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.198969" elapsed="0.002787"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.202332" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.201898" elapsed="0.000461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.202407" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:29.195229" elapsed="0.007301"/>
</kw>
<msg time="2026-04-10T00:53:29.202602" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:29.182301" elapsed="0.020354"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.215469" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.228401" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.240973" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.241174" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.241352" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.241745" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.241597" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:29.241581" 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-04-10T00:53:29.241964" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.242132" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.242299" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:29.241534" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.241433" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.242525" elapsed="0.000037"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.242620" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:29.242897" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:29.177713" elapsed="0.065220"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.244635" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:29.244360" elapsed="0.000345">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:29.244796" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:29.243993" elapsed="0.000827"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.245138" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.244890" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.245707" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.245396" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.245218" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.244872" elapsed="0.000916"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.248188" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:29.245939" elapsed="0.002275"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:29.248263" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:29.248618" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:29.243532" elapsed="0.005123"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.250285" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:29.250043" elapsed="0.000305">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:29.250441" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:29.249707" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:29.250686" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:29.250534" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.250516" elapsed="0.000254"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.250917" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.251088" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.251153" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:29.254698" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:29.249262" elapsed="0.005474"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.256601" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.256308" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.257050" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.256806" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:29.279524" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:29.279987" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:29.280241" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:29.259269" elapsed="0.020999"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.257160" elapsed="0.023152"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.280499" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.280340" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.257141" elapsed="0.023461"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.284448" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.281632" elapsed="0.003232"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.281389" elapsed="0.003513"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.281367" elapsed="0.003560"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.287667" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.285214" elapsed="0.002499"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.284984" elapsed="0.002762"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.284966" elapsed="0.002804"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.288363" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.287946" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.288722" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.288465" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.289269" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.288967" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.288804" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.288447" elapsed="0.000905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.289891" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.289511" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.290268" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.290029" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.290834" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.290511" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.290350" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.290010" elapsed="0.000909"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:29.291074" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:29.291894" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.291602" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.292077" elapsed="0.002480"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:29.280960" elapsed="0.013664"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.294802" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:29.294694" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.294676" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:29.303375" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:29.295018" elapsed="0.008387"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:29.303459" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:53:29.303811" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:29.255322" elapsed="0.048527"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.303942" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:53:29.304315" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:29.152608" elapsed="0.151750"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.305292" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.304563" elapsed="0.000894"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.304530" elapsed="0.000967"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.305602" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:29.141234" elapsed="0.164560"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.136824" elapsed="0.169015"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.136807" elapsed="0.169057"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.306586" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:29.306441" elapsed="0.000240"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:53:29.306828" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:29.306707" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.306423" elapsed="0.000539"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.307131" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:53:29.307252" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:29.306147" elapsed="0.001130"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.307877" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.307447" elapsed="0.000457"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.308665" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.308062" elapsed="0.000631"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.315823" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.315104" elapsed="0.000880"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.316972" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.316243" 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-04-10T00:53:29.328328" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:29.328443" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:29 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":297,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":297,"Leader":"member-1-shard-default-operational","LastIndex":299,"RaftState":"Follower","LastApplied":299,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":299,"LastLeadershipChangeTime":"2026-04-10 00:51:03.908","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"318.3 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":299,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":6242},"timestamp":1775782409,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:29.328671" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:29.319694" elapsed="0.009014"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.317248" elapsed="0.011517"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.329146" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.328826" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.317216" elapsed="0.012090"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.334204" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":297,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":297,"Leader":"member-1-shard-default-operational","LastIndex":299,"RaftState":"Follower","LastApplied":299,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":299,"LastLeadershipChangeTime":"2026-04-10 00:51:03.908","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"318.3 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":299,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":6242},"timestamp":1775782409,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.331521" elapsed="0.002743"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.331296" elapsed="0.003004"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.331251" elapsed="0.003095"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.337247" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.334728" elapsed="0.002566"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.334481" elapsed="0.002849"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.334437" elapsed="0.002937"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.338087" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.337648" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.338531" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.338289" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.339124" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.338816" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.338650" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.338244" elapsed="0.000982"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.340009" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.339479" elapsed="0.000580"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.340481" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.340208" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.341069" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.340764" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.340598" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.340163" elapsed="0.001009"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:29.341417" elapsed="0.000447"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:29.342455" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.342125" elapsed="0.000381"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.342774" elapsed="0.002537"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:29.330274" elapsed="0.015144"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.345785" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:29.345564" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.345516" elapsed="0.000418"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:29.349731" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:29.346164" elapsed="0.003661"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:29.349914" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:53:29.350190" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:29.309681" elapsed="0.040537"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.350314" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:29.350467" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:29.308907" elapsed="0.041586"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.351988" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578240...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.351102" elapsed="0.000916"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:29.352067" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:29.352245" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578240...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:29.350734" elapsed="0.001538"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:29.352709" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 299, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.352461" elapsed="0.000276"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:29.353131" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.352896" elapsed="0.000261"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:29.353205" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:29.353358" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:29.134957" elapsed="0.218426"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:29.353440" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:53:29.353606" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:29.134201" elapsed="0.219430"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.353929" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.353712" elapsed="0.000444"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.354327" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.354180" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.354564" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.354405" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.353695" elapsed="0.000945"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:29.134027" elapsed="0.220636"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.357260" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.356796" elapsed="0.000492"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:29.357333" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:29.357483" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:29.356384" elapsed="0.001124"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.417009" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.416561" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.417842" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:29.417576" elapsed="0.000341">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:29.418085" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:29.417220" elapsed="0.000891"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.418684" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:29.418279" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.419019" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:29.419173" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:29.418876" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.419629" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.419360" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.420684" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.420410" elapsed="0.000336"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.421178" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.420910" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.421536" elapsed="0.000040"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.421765" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.421946" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:29.421399" elapsed="0.000605"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.421258" elapsed="0.000777"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:29.422083" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:53:29.422252" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:29.420082" elapsed="0.002196"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.419755" elapsed="0.002556"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.422485" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.422335" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.419732" elapsed="0.002849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.423171" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.422728" elapsed="0.000470"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.423248" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:29.415900" elapsed="0.007472"/>
</kw>
<msg time="2026-04-10T00:53:29.423426" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:29.402891" elapsed="0.020589"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.436457" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.449345" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.462091" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.462301" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.462479" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.462888" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.462738" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:29.462722" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.463112" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.463282" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.463449" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:29.462688" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.462578" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.463694" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.463771" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:53:29.464076" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:29.398272" elapsed="0.065841"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.465893" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:29.465618" elapsed="0.000348">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:29.466059" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:29.465235" elapsed="0.000850"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.466411" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.466157" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.466987" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.466689" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.466492" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.466139" elapsed="0.000932"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.469472" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:29.467223" elapsed="0.002276"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:29.469592" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:53:29.469905" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:29.464750" elapsed="0.005191"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.471594" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:29.471325" elapsed="0.000335">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:29.471809" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:29.470985" elapsed="0.000850"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:29.472046" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:29.471908" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.471889" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.472278" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.472452" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.472519" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:29.474878" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:29.470526" elapsed="0.004390"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.476756" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.476473" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.477226" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.476984" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:29.499437" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:29.499896" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:29.500134" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:29.479482" elapsed="0.020680"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.477336" elapsed="0.022875"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.500424" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.500242" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.477318" elapsed="0.023194"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.504429" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.501638" elapsed="0.003130"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.501387" elapsed="0.003418"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.501368" elapsed="0.003461"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.507571" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.505142" elapsed="0.002478"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.504886" elapsed="0.002769"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.504869" elapsed="0.002811"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.508249" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.507860" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.508602" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.508347" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.509198" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.508850" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.508685" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.508329" elapsed="0.000954"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.509825" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.509445" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.510156" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.509922" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.510712" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.510398" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.510238" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.509904" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:29.510949" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:29.511773" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.511465" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.511954" elapsed="0.002543"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:29.500915" elapsed="0.013662"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.514756" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:29.514648" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.514630" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:29.523132" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:29.514971" elapsed="0.008190"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:29.523214" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:53:29.523580" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:29.475513" elapsed="0.048107"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.523712" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:53:29.524051" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:29.372995" elapsed="0.151097"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.525040" elapsed="0.000087"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.524286" elapsed="0.000947"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.524266" elapsed="0.001009"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.525363" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:29.362013" elapsed="0.163559"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.357595" elapsed="0.168023"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.357577" elapsed="0.168067"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.526358" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:29.526231" elapsed="0.000219"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:53:29.526612" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:29.526475" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.526214" elapsed="0.000533"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.526898" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:53:29.527019" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:29.525937" elapsed="0.001108"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.527640" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.527215" elapsed="0.000452"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.528382" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.527825" elapsed="0.000586"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.535616" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.534823" elapsed="0.000953"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.536741" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.536032" elapsed="0.000866"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:29.547357" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:29.547420" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:29 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":304,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":304,"Leader":"member-1-shard-default-operational","LastIndex":305,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":305,"LastLogIndex":305,"LastLeadershipChangeTime":"2026-04-10 00:53:13.343","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"653.4 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":305,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":2213},"timestamp":1775782409,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:29.547653" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:29.539402" elapsed="0.008287"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.537014" elapsed="0.010732"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.548120" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.547805" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.536982" elapsed="0.011294"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.553056" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":304,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":304,"Leader":"member-1-shard-default-operational","LastIndex":305,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":305,"LastLogIndex":305,"LastLeadershipChangeTime":"2026-04-10 00:53:13.343","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"653.4 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":305,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":2213},"timestamp":1775782409,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.550410" elapsed="0.002708"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.550145" elapsed="0.003008"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.550100" elapsed="0.003098"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.556012" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.553599" elapsed="0.002459"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.553356" elapsed="0.002737"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.553311" elapsed="0.002826"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.556877" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.556394" elapsed="0.000534"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.557365" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.557081" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.557986" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.557678" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.557468" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.557035" elapsed="0.001052"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.558817" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.558336" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.559253" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.559014" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.559979" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.559514" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.559351" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.558969" elapsed="0.001112"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:29.560326" elapsed="0.000449"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:29.561396" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.561031" elapsed="0.000414"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.561713" elapsed="0.002477"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:29.549094" elapsed="0.015203"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.564679" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:29.564426" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.564394" elapsed="0.000433"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:29.568430" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:29.565054" elapsed="0.003469"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:29.568676" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:53:29.568951" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:29.529433" elapsed="0.039545"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.569071" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:29.569224" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:29.528654" elapsed="0.040596"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.570595" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578240...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.569886" elapsed="0.000739"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:29.570674" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:29.570852" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578240...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:29.569502" elapsed="0.001377"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:29.571261" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 305, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.571038" elapsed="0.000251"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:29.571699" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.571447" elapsed="0.000278"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:29.571772" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:29.571924" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:29.355777" elapsed="0.216172"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:29.572006" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:53:29.572154" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:29.354997" elapsed="0.217182"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.572476" elapsed="0.000256"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.572260" elapsed="0.000510"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.572940" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.572793" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.573161" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.573018" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.572243" elapsed="0.000991"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:29.354827" elapsed="0.218431"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:28.918674" elapsed="0.654650"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:53:29.573370" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:29.573591" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:53:29.573640" level="INFO">${follower_list} = [2, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:53:28.914418" elapsed="0.659246"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.574112" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:53:29.574188" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:53:29.573843" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.574496" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.574280" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.574263" elapsed="0.000329"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.576866" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:53:29.574729" elapsed="0.002184"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:53:29.577338" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.577117" elapsed="0.000247"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:53:29.577412" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:53:28.911765" elapsed="0.665818"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:53:28.911468" elapsed="0.666162"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:53:27.479990" elapsed="2.097673"/>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:53:27.479596" elapsed="2.098123"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.582956" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:29.582571" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.583440" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:29.583142" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:29.583510" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:29.583685" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:29.582179" elapsed="0.001531"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:53:29.583864" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.584505" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:29.584177" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.584945" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:29.584708" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.585411" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:29.585117" elapsed="0.000323"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.588134" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.587674" elapsed="0.000487"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:29.588207" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:29.588354" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:29.587280" elapsed="0.001099"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.647995" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.647596" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.648970" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:29.648665" elapsed="0.000381">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:29.649142" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:29.648303" elapsed="0.000865"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.649776" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:29.649335" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.650111" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:29.650333" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:29.649969" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.650794" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.650525" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.651825" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.651568" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.652302" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.652035" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.652684" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.652893" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.653071" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:29.652526" elapsed="0.000603"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.652381" elapsed="0.000779"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:29.653206" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:53:29.653372" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:29.651227" elapsed="0.002172"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.650918" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.653671" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.653458" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.650895" elapsed="0.002860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.654344" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.653902" elapsed="0.000470"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.654421" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:29.646931" elapsed="0.007630"/>
</kw>
<msg time="2026-04-10T00:53:29.654619" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:29.633879" elapsed="0.020792"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.667538" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.680241" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.692998" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.693243" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.693447" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.693919" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.693701" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:29.693686" elapsed="0.000324"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.694155" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.694324" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.694491" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:29.693654" elapsed="0.000911"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.693529" elapsed="0.001065"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.694743" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.694819" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:29.695098" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:29.629250" elapsed="0.065884"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.696871" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:29.696600" elapsed="0.000340">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:29.697032" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:29.696232" 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-04-10T00:53:29.697373" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.697126" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.697982" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.697651" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.697453" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.697108" elapsed="0.000955"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.700518" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:29.698218" elapsed="0.002362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:29.700633" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:29.700939" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:29.695762" elapsed="0.005212"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.702875" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:29.702623" elapsed="0.000314">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:29.703029" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:29.702268" elapsed="0.000785"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:29.703256" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:29.703123" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.703105" elapsed="0.000233"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.703530" elapsed="0.000040"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.703725" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.703792" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:29.706102" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:29.701580" elapsed="0.004560"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.707977" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.707720" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.708416" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.708177" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:29.718917" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:29.719349" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:29.719578" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:29.710678" elapsed="0.008928"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.708592" elapsed="0.011058"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.719832" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.719677" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.708572" elapsed="0.011343"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.723720" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.720930" elapsed="0.003116"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.720710" elapsed="0.003372"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.720691" elapsed="0.003415"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.726801" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.724385" elapsed="0.002463"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.724162" elapsed="0.002720"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.724145" elapsed="0.002760"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.727452" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.727073" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.727810" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.727571" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.728351" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.728052" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.727891" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.727531" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.728974" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.728613" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.729303" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.729071" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.729859" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.729562" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.729385" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.729053" elapsed="0.000924"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:29.730128" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:29.730945" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.730656" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.731126" elapsed="0.003834"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:29.720267" elapsed="0.014758"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.735201" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:29.735096" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.735077" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:29.743614" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:29.735414" elapsed="0.008230"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:29.743696" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:53:29.744019" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:29.706741" elapsed="0.037315"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.744144" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:53:29.744476" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:29.604190" elapsed="0.140327"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.745459" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.744736" elapsed="0.000916"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.744716" elapsed="0.000978"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.745783" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:29.592806" elapsed="0.153204"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.588447" elapsed="0.157608"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.588429" elapsed="0.157650"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:53:29.746867" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:29.746740" elapsed="0.000239"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.747044" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:29.747005" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.746722" elapsed="0.000433"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.747307" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:53:29.747426" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:29.746423" elapsed="0.001029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.748054" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.747641" elapsed="0.000440"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.748820" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.748238" elapsed="0.000612"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.756138" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.755428" elapsed="0.000876"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.757265" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.756579" elapsed="0.000853"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:29.765338" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:29.765400" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:29 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":40003,"SnapshotIndex":120047,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":120047,"Leader":"member-1-shard-inventory-config","LastIndex":120048,"RaftState":"Leader","LastApplied":120048,"LastCommittedTransactionTime":"2026-04-10 00:52:40.831","LastLogIndex":120048,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.448","active":true,"matchIndex":120048,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":120049},{"timeSinceLastActivity":"00:00:00.448","active":true,"matchIndex":120048,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":120049}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"453.7 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":3,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":120048,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":4,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":18012},"timestamp":1775782409,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:29.765737" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:29.759962" elapsed="0.005812"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.757586" elapsed="0.008246"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.766234" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.765894" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.757521" elapsed="0.008915"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.771417" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":40003,"SnapshotIndex":120047,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":120047,"Leader":"member-1-shard-inventory-config","LastIndex":120048,"RaftState":"Leader","LastApplied":120048,"LastCommittedTransactionTime":"2026-04-10 00:52:40.831","LastLogIndex":120048,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.448","active":true,"matchIndex":120048,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":120049},{"timeSinceLastActivity":"00:00:00.448","active":true,"matchIndex":120048,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":120049}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"453.7 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":3,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":120048,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":4,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":18012},"timestamp":1775782409,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.768699" elapsed="0.002783"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.768449" elapsed="0.003068"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.768403" elapsed="0.003174"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.774411" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.771944" elapsed="0.002513"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.771716" elapsed="0.002775"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.771672" elapsed="0.002863"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.775258" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.774816" elapsed="0.000493"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.775720" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.775459" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.776295" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.775987" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.775821" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.775413" elapsed="0.000984"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.777094" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.776669" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.777535" elapsed="0.000133"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.777295" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.778256" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.777914" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.777748" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.777249" elapsed="0.001108"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:29.778621" elapsed="0.000425"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:29.779848" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.779301" elapsed="0.000599"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.780151" elapsed="0.002544"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:29.767266" elapsed="0.015536"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.783152" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:29.782934" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.782901" elapsed="0.000401"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:29.787113" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:29.783535" elapsed="0.003672"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:29.787331" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:53:29.787633" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:29.749873" elapsed="0.037788"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.787721" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:53:29.787871" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:29.749064" elapsed="0.038833"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.789217" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782409, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.788489" elapsed="0.000757"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:29.789295" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:29.789482" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782409, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:29.788122" elapsed="0.001387"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:29.789957" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 120048, 'CommittedTransactionsCount': 3, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.789724" elapsed="0.000262"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:29.790405" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.790168" elapsed="0.000264"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:29.790480" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:29.790651" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:29.586677" elapsed="0.203999"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:29.790732" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:53:29.790879" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:29.585879" elapsed="0.205024"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.791201" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.790982" elapsed="0.000275"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.791487" elapsed="0.000205"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.791281" elapsed="0.000447"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.791899" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.791752" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.790965" elapsed="0.001008"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:29.585710" elapsed="0.206286"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.794617" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.794103" elapsed="0.000541"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:29.794690" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:29.794839" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:29.793733" elapsed="0.001131"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.854887" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.854465" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.855893" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:29.855628" elapsed="0.000340">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:29.856063" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:29.855250" elapsed="0.000839"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.856665" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:29.856257" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.857001" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:29.857143" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:29.856859" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.857592" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.857328" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.858691" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.858365" elapsed="0.000372"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.859169" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.858902" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.859527" 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-04-10T00:53:29.859754" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.859933" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:29.859389" elapsed="0.000601"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.859247" elapsed="0.000774"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:29.860067" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:53:29.860236" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:29.858040" elapsed="0.002221"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.857718" elapsed="0.002576"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.860469" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.860318" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.857695" elapsed="0.002868"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.861153" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.860712" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.861230" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:29.853786" elapsed="0.007568"/>
</kw>
<msg time="2026-04-10T00:53:29.861409" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:29.840380" elapsed="0.021081"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.874340" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.887359" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.899985" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.900198" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.900379" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.900788" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.900638" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:29.900622" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.901012" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.901182" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.901351" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:29.900587" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.900461" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.901598" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.901676" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:53:29.901991" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:29.835781" elapsed="0.066246"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.903934" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:29.903654" elapsed="0.000353">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:29.904100" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:29.903260" elapsed="0.000865"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.904451" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.904196" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.905030" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.904733" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.904531" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.904178" elapsed="0.000936"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.907589" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:29.905267" elapsed="0.002351"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:29.907670" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:29.907982" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:29.902805" elapsed="0.005215"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:29.909747" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:29.909471" elapsed="0.000341">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:29.909905" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:29.909130" elapsed="0.000799"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:29.910134" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:29.910000" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.909982" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.910368" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.910542" elapsed="0.000063"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.910652" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:29.913059" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:29.908692" elapsed="0.004404"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.915075" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.914723" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.915524" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.915280" elapsed="0.000354"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:29.964662" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:29.965309" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:29.965700" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:29.917853" elapsed="0.047890"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.915703" elapsed="0.050117"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.966155" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.965869" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.915684" elapsed="0.050594"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.971824" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.967925" elapsed="0.004234"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.967587" elapsed="0.004608"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.967535" elapsed="0.004685"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.975044" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:29.972512" elapsed="0.002582"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.972279" elapsed="0.002850"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.972261" elapsed="0.002892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.975807" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.975344" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.976198" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.975921" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.976930" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.976457" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.976286" elapsed="0.000708"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.975902" elapsed="0.001113"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.977605" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.977181" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.977947" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.977707" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.978502" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.978192" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.978029" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.977688" elapsed="0.000918"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:29.978778" elapsed="0.000431"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:29.979698" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.979381" elapsed="0.000343"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:29.979881" elapsed="0.002615"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:29.966901" elapsed="0.015684"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.982770" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:29.982658" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.982640" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:29.991723" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:29.983015" elapsed="0.008747"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:29.991836" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:53:29.992234" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:29.913713" elapsed="0.078558"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.992366" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:53:29.992742" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:29.810643" elapsed="0.182142"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.994040" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:29.993190" elapsed="0.001035"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.993170" elapsed="0.001098"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:29.994357" elapsed="0.000031"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:29.799423" elapsed="0.195152"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:29.794932" elapsed="0.199690"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.794914" elapsed="0.199733"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:53:29.995510" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:29.995371" elapsed="0.000266"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:29.995703" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:29.995664" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:29.995353" elapsed="0.000465"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:29.995974" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:53:29.996097" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:29.995061" elapsed="0.001061"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.996726" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:29.996294" elapsed="0.000460"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:29.997477" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:29.996913" elapsed="0.000592"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.004637" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.003924" elapsed="0.000876"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.005782" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.005061" elapsed="0.000879"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:30.016272" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:30.016337" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:30 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":120047,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":120047,"Leader":"member-1-shard-inventory-config","LastIndex":120048,"RaftState":"Follower","LastApplied":120048,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":120048,"LastLeadershipChangeTime":"2026-04-10 00:51:04.372","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"670.1 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":120048,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":18012},"timestamp":1775782410,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:30.016582" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:30.008644" elapsed="0.007977"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.006058" elapsed="0.010623"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.017067" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.016744" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.006026" elapsed="0.011200"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.022021" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":120047,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":120047,"Leader":"member-1-shard-inventory-config","LastIndex":120048,"RaftState":"Follower","LastApplied":120048,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":120048,"LastLeadershipChangeTime":"2026-04-10 00:51:04.372","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"670.1 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":120048,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":18012},"timestamp":1775782410,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.019343" elapsed="0.002783"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.019114" elapsed="0.003049"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.019067" elapsed="0.003141"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.025096" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.022600" elapsed="0.002543"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.022346" elapsed="0.002831"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.022301" elapsed="0.002920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.025945" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.025486" elapsed="0.000510"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.026392" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.026148" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.026979" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.026674" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.026491" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.026102" elapsed="0.001015"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.027809" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.027373" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.028247" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.028009" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.028891" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.028508" elapsed="0.000409"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.028346" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.027964" elapsed="0.001029"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:30.029238" elapsed="0.000447"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:30.030289" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.029943" elapsed="0.000399"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.030609" elapsed="0.002523"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:30.018061" elapsed="0.015180"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.033616" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:30.033372" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.033339" elapsed="0.000430"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:30.037455" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:30.033998" elapsed="0.003568"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:30.037657" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:53:30.037941" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:29.998512" elapsed="0.039457"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.038064" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:30.038219" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:29.997759" elapsed="0.040487"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.039624" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782410, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.038867" elapsed="0.000787"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:30.039705" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:30.039880" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782410, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:30.038478" elapsed="0.001430"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:30.040294" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 120048, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerIni...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.040066" elapsed="0.000256"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:30.040783" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.040479" elapsed="0.000330"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:30.040857" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:30.041011" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:29.793067" elapsed="0.247968"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:30.041092" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:53:30.041242" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:29.792331" elapsed="0.248936"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.041592" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.041350" elapsed="0.000473"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.041993" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.041847" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.042214" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.042071" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.041332" elapsed="0.000956"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:29.792162" elapsed="0.250149"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.044925" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.044414" elapsed="0.000539"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:30.044998" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:30.045146" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:30.044044" elapsed="0.001126"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.104280" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.103888" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.105124" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:30.104847" elapsed="0.000351">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:30.105355" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:30.104483" elapsed="0.000898"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.105961" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:30.105567" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.106297" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:30.106451" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:30.106155" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.106906" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.106657" 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-04-10T00:53:30.107996" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.107743" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.108472" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.108204" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.108850" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.109058" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.109238" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:30.108710" elapsed="0.000587"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.108568" elapsed="0.000760"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:30.109373" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:53:30.109561" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:30.107392" elapsed="0.002197"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.107029" elapsed="0.002593"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.109797" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.109647" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.107007" elapsed="0.002868"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.110457" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.110018" elapsed="0.000467"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.110535" elapsed="0.000046"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:30.103228" elapsed="0.007451"/>
</kw>
<msg time="2026-04-10T00:53:30.110735" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:30.090387" elapsed="0.020403"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.123855" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.136578" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.149251" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.149473" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.149673" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.150073" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.149921" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:30.149904" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.150296" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.150464" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.150648" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:30.149868" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.149760" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.150879" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.150956" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:53:30.151273" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:30.085965" elapsed="0.065347"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.153113" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:30.152831" elapsed="0.000358">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:30.153282" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:30.152430" elapsed="0.000877"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.153657" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.153379" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.154214" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.153918" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.153739" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.153362" elapsed="0.000935"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.156718" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:30.154449" elapsed="0.002296"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:30.156796" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:30.157102" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:30.151973" elapsed="0.005164"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.158781" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:30.158520" elapsed="0.000326">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:30.158985" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:30.158180" elapsed="0.000830"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:30.159218" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:30.159082" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.159064" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.159451" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.159661" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.159729" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:30.162022" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:30.157743" elapsed="0.004317"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.163908" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.163647" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.164348" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.164109" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:30.187957" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:30.188404" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:30.188667" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:30.166709" elapsed="0.021986"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.164458" elapsed="0.024287"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.188962" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.188778" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.164440" elapsed="0.024609"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.192987" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.190150" elapsed="0.003186"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.189917" elapsed="0.003455"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.189896" elapsed="0.003501"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.196137" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.193703" elapsed="0.002480"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.193454" elapsed="0.002763"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.193437" elapsed="0.002804"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.196838" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.196427" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.197175" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.196935" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.197745" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.197422" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.197257" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.196917" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.198351" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.197992" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.198697" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.198447" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.199233" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.198940" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.198778" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.198430" elapsed="0.000885"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:30.199473" elapsed="0.000385"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:30.200317" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.200026" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.200499" elapsed="0.002550"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:30.189441" elapsed="0.013673"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.203291" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:30.203184" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.203165" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:30.211652" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:30.203504" elapsed="0.008206"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:30.211764" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:53:30.212113" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:30.162673" elapsed="0.049477"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.212243" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:53:30.212614" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:30.061275" elapsed="0.151381"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.213619" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.212849" elapsed="0.000949"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.212830" elapsed="0.001008"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.213928" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:30.049648" elapsed="0.164471"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.045238" elapsed="0.168926"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.045221" elapsed="0.168968"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:53:30.214920" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:30.214793" elapsed="0.000240"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.215099" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:30.215059" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.214776" elapsed="0.000436"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.215366" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:53:30.215487" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:30.214478" elapsed="0.001035"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.216145" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.215726" elapsed="0.000447"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.216920" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.216332" elapsed="0.000617"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.224336" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.223627" elapsed="0.000878"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.225468" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.224785" elapsed="0.000998"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:30.237064" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:30.237127" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:30 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":120048,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":120047,"Leader":"member-1-shard-inventory-config","LastIndex":120048,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":120048,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:53:13.793","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"719.6 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":120048,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782410,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:30.237341" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:30.228386" elapsed="0.008991"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.225906" elapsed="0.011534"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.237872" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.237502" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.225872" elapsed="0.012160"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.242807" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":120048,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":120047,"Leader":"member-1-shard-inventory-config","LastIndex":120048,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":120048,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:53:13.793","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"719.6 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":120048,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782410,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.240154" elapsed="0.002758"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.239926" elapsed="0.003023"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.239880" elapsed="0.003114"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.245798" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.243356" elapsed="0.002488"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.243130" elapsed="0.002748"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.243086" elapsed="0.002835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.246690" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.246183" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.247136" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.246892" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.247741" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.247400" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.247234" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.246846" elapsed="0.001039"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.248573" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.248137" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.249013" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.248774" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.249588" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.249273" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.249110" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.248729" elapsed="0.000962"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:30.249937" elapsed="0.000421"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:30.251040" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.250697" elapsed="0.000392"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.251333" elapsed="0.002513"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:30.238876" elapsed="0.015081"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.254306" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:30.254087" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.254055" elapsed="0.000402"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:30.258094" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:30.254712" elapsed="0.003475"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:30.258274" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:53:30.258615" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:30.217962" elapsed="0.040683"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.258741" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:30.258897" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:30.217164" elapsed="0.041760"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.260249" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782410, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.259529" elapsed="0.000749"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:30.260327" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:30.260501" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782410, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:30.259154" elapsed="0.001374"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:30.260932" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 120048, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerIni...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.260707" elapsed="0.000252"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:30.261349" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.261117" elapsed="0.000257"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:30.261421" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:30.261592" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:30.043424" elapsed="0.218194"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:30.261676" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:53:30.261826" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:30.042671" elapsed="0.219180"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.262151" elapsed="0.000189"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.261932" elapsed="0.000446"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.262628" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.262402" elapsed="0.000284"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.262855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.262709" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.261914" elapsed="0.001015"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:30.042480" elapsed="0.220473"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:29.585494" elapsed="0.677493"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:53:30.263032" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:53:30.263234" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:53:30.263281" level="INFO">${follower_list} = [2, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:53:29.581450" elapsed="0.681855"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.263766" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:53:30.263842" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:53:30.263480" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.264182" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.263965" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.263947" elapsed="0.000313"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.267956" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:53:30.264398" elapsed="0.003606"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:53:30.268410" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.268217" elapsed="0.000222"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:53:30.268487" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:53:29.578732" elapsed="0.689925"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:53:29.578489" elapsed="0.690215"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.273195" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:30.272813" elapsed="0.000546"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.273859" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:30.273529" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:30.273931" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:30.274085" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:30.272422" elapsed="0.001688"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:53:30.274265" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.274930" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:30.274596" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.275355" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:30.275116" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.275791" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:30.275535" elapsed="0.000282"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.278419" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.277962" elapsed="0.000484"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:30.278493" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:30.278668" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:30.277597" elapsed="0.001096"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.337803" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.337401" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.338617" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:30.338343" elapsed="0.000355">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:30.338792" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:30.338003" elapsed="0.000813"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.339363" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:30.338982" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.339713" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:30.339870" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:30.339572" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.340325" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.340055" 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-04-10T00:53:30.341393" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.341134" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.341888" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.341620" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.342240" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.342447" 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-04-10T00:53:30.342646" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:30.342103" elapsed="0.000602"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.341966" elapsed="0.000769"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:30.342782" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:30.342943" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:30.340809" elapsed="0.002159"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.340488" elapsed="0.002512"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.343173" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.343025" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.340467" elapsed="0.002782"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.343885" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.343424" elapsed="0.000489"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.343962" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:30.336786" elapsed="0.007301"/>
</kw>
<msg time="2026-04-10T00:53:30.344141" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:30.323402" elapsed="0.020828"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.357096" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.369830" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.382708" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.382905" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.383085" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.383459" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.383312" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:30.383297" 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-04-10T00:53:30.383744" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.383916" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.384085" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:30.383267" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.383164" elapsed="0.001002"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.384355" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.384435" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:53:30.384732" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:30.318959" elapsed="0.065809"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.386432" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:30.386179" elapsed="0.000320">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:30.386612" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:30.385832" elapsed="0.000804"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.386951" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.386708" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.387497" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.387208" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.387031" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.386690" elapsed="0.000907"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.389994" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:30.387748" elapsed="0.002273"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:30.390073" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:30.390375" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:30.385371" elapsed="0.005038"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.392049" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:30.391809" elapsed="0.000303">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:30.392205" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:30.391443" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:30.392472" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:30.392300" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.392281" elapsed="0.000434"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.392872" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.393046" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.393110" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:30.395420" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:30.391008" elapsed="0.004486"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.397310" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.397054" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.397789" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.397510" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:30.409079" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:30.409634" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:30.410145" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:30.400017" elapsed="0.010193"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.397899" elapsed="0.012417"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.410798" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.410382" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.397881" elapsed="0.013127"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.418726" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.413530" elapsed="0.005519"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.412995" elapsed="0.006090"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.412949" elapsed="0.006161"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.421836" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.419398" elapsed="0.002485"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.419168" elapsed="0.002750"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.419150" elapsed="0.002792"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.422498" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.422115" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.422853" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.422615" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.423397" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.423097" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.422935" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.422595" elapsed="0.000889"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.424022" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.423661" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.424349" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.424118" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.424941" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.424645" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.424430" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.424100" elapsed="0.000924"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:30.425176" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:30.426003" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.425710" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.426182" elapsed="0.002465"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:30.411903" elapsed="0.016809"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.428891" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:30.428784" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.428764" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:30.438023" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:30.429106" elapsed="0.008947"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:30.438108" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:53:30.438446" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:30.396095" elapsed="0.042388"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.438599" elapsed="0.000075"/>
</return>
<msg time="2026-04-10T00:53:30.438948" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:30.293944" elapsed="0.145046"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.439955" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.439186" elapsed="0.000935"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.439167" elapsed="0.000995"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.440250" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:30.283069" elapsed="0.157377"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.278762" elapsed="0.161731"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.278744" elapsed="0.161817"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:53:30.441283" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:30.441156" elapsed="0.000236"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.441457" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:30.441418" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.441138" elapsed="0.000451"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.441743" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:53:30.441864" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:30.440858" elapsed="0.001032"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.442481" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.442063" elapsed="0.000446"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.443249" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.442685" elapsed="0.000593"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.450424" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.449741" elapsed="0.000865"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.451596" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.450868" elapsed="0.000890"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:30.459476" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:30.459537" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:30 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:52:30.281","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"217.8 μs","Voting":true,"CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782410,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:30.459849" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:30.454255" elapsed="0.005629"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.451874" elapsed="0.008067"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.460315" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.460001" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.451843" elapsed="0.008630"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.465271" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:52:30.281","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"217.8 μs","Voting":true,"CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782410,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.462572" elapsed="0.002798"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.462328" elapsed="0.003078"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.462283" elapsed="0.003168"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.469592" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.465994" elapsed="0.003665"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.465670" elapsed="0.004038"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.465607" elapsed="0.004161"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.470760" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.470126" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.471376" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.471040" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.472200" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.471770" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.471514" elapsed="0.000771"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.470977" elapsed="0.001363"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.473337" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.472749" elapsed="0.000662"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.473882" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.473640" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.474445" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.474143" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.473980" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.473593" elapsed="0.000969"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:30.474809" elapsed="0.000422"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:30.475844" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.475487" elapsed="0.000407"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.476141" elapsed="0.002562"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:30.461313" elapsed="0.017498"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.479195" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:30.478942" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.478908" elapsed="0.000441"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:30.483031" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:30.479598" elapsed="0.003527"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:30.483212" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:53:30.483499" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:30.444289" elapsed="0.039238"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.483603" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:30.483756" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:30.443492" elapsed="0.040290"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.485252" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782410, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.484501" elapsed="0.000781"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:30.485375" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:30.485575" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782410, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:30.484005" elapsed="0.001600"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:30.485995" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.485765" elapsed="0.000258"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:30.486424" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.486183" elapsed="0.000270"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:30.486500" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:30.486686" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:30.276981" elapsed="0.209730"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:30.486769" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:53:30.486920" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:30.276257" elapsed="0.210688"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.487246" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.487027" elapsed="0.000449"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.487668" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.487500" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.487894" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.487748" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.487010" elapsed="0.000957"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:30.276089" elapsed="0.211902"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.490668" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.490072" elapsed="0.000625"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:30.490743" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:30.490892" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:30.489707" elapsed="0.001211"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.550280" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.549873" elapsed="0.000440"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.551281" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:30.551007" elapsed="0.000349">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:30.551450" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:30.550488" elapsed="0.000987"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.552194" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:30.551811" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.552522" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:30.552785" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:30.552382" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.553315" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.553062" 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-04-10T00:53:30.554374" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.554121" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.554868" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.554598" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.555231" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.555436" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.555628" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:30.555092" elapsed="0.000595"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.554949" elapsed="0.000769"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:30.555765" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:53:30.555931" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:30.553794" elapsed="0.002162"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.553439" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.556160" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.556012" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.553417" elapsed="0.002819"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.556832" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.556380" elapsed="0.000480"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.556909" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:30.549186" elapsed="0.007871"/>
</kw>
<msg time="2026-04-10T00:53:30.557113" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:30.536171" elapsed="0.020993"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.570015" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.582631" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.595397" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.595636" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.595956" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.596439" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.596288" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:30.596270" 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-04-10T00:53:30.596687" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.596857" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.597024" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:30.596234" elapsed="0.000863"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.596114" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.597275" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.597354" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:53:30.597707" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:30.531627" elapsed="0.066118"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.599531" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:30.599247" elapsed="0.000548">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:30.599893" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:30.598860" elapsed="0.001057"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.600251" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.599989" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.600824" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.600510" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.600332" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.599971" elapsed="0.000937"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.603326" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:30.601060" elapsed="0.002293"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:30.603404" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:30.603733" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:30.598377" elapsed="0.005392"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.605421" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:30.605176" elapsed="0.000308">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:30.605595" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:30.604810" elapsed="0.000811"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:30.605827" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:30.605692" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.605674" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.606059" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.606230" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.606357" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:53:30.608683" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:30.604359" elapsed="0.004361"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.610578" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.610296" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.611027" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.610781" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:30.635017" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:30.635713" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:30.636176" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:30.613264" elapsed="0.022956"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.611138" elapsed="0.025163"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.636670" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.636352" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.611120" elapsed="0.025682"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.642724" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.638457" elapsed="0.004764"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.638107" elapsed="0.005167"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.638076" elapsed="0.005234"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.647081" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.643752" elapsed="0.003376"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.643395" elapsed="0.003767"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.643369" elapsed="0.003817"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.647781" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.647368" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.648116" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.647879" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.648680" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.648360" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.648197" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.647860" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.649311" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.648922" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.649656" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.649408" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.650191" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.649898" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.649738" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.649390" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:30.650427" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:30.651254" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.650963" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.651436" elapsed="0.002783"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:30.637409" elapsed="0.016877"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.654463" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:30.654356" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.654338" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:30.663021" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:30.654697" elapsed="0.008354"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:30.663103" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:53:30.663455" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:30.609344" elapsed="0.054148"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.663613" elapsed="0.000075"/>
</return>
<msg time="2026-04-10T00:53:30.663960" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:30.506733" elapsed="0.157269"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.664961" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.664195" elapsed="0.000931"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.664177" elapsed="0.000989"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.665256" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:30.495649" elapsed="0.169827"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.490985" elapsed="0.174537"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.490968" elapsed="0.174592"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:53:30.666278" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:30.666150" elapsed="0.000239"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.666455" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:30.666416" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.666132" elapsed="0.000455"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.666740" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:53:30.666862" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:30.665855" elapsed="0.001033"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.667475" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.667061" elapsed="0.000442"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.668246" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.667679" elapsed="0.000597"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.675441" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.674756" elapsed="0.000863"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.676612" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.675879" elapsed="0.000893"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:30.686736" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:30.686833" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:30 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:52:30.268","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.087","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.087","active":true,"matchIndex":-1,"voting":true,"id":"member-3-shard-topology-config","nextIndex":0}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"785.3 μs","CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782410,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:30.687159" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:30.679288" elapsed="0.007925"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.676889" elapsed="0.010413"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.687904" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.687395" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.676857" elapsed="0.011281"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.695251" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:52:30.268","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.087","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.087","active":true,"matchIndex":-1,"voting":true,"id":"member-3-shard-topology-config","nextIndex":0}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"785.3 μs","CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782410,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.691478" elapsed="0.003838"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.691131" elapsed="0.004221"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.691061" elapsed="0.004337"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.698220" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.695784" elapsed="0.002482"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.695537" elapsed="0.002764"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.695492" elapsed="0.002854"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.699144" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.698703" elapsed="0.000493"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.699613" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.699348" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.700194" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.699884" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.699715" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.699301" elapsed="0.000996"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.701033" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.700569" elapsed="0.000518"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.701517" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.701238" elapsed="0.000355"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.702105" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.701801" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.701635" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.701193" elapsed="0.001014"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:30.702457" elapsed="0.000449"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:30.703508" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.703167" elapsed="0.000424"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.703847" elapsed="0.002547"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:30.689587" elapsed="0.016916"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.706875" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:30.706654" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.706621" elapsed="0.000404"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:30.710825" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:30.707257" elapsed="0.003663"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:30.711008" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:53:30.711322" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:30.669283" elapsed="0.042068"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.711411" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:53:30.711592" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:30.668491" elapsed="0.043129"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.712936" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782410, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.712214" elapsed="0.000751"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:30.713014" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:30.713194" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782410, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:30.711847" elapsed="0.001374"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:30.713647" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.713379" elapsed="0.000296"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:30.714071" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.713834" elapsed="0.000263"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:30.714145" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:30.714300" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:30.489091" elapsed="0.225234"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:30.714383" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:53:30.714538" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:30.488327" elapsed="0.226253"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.714884" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.714663" elapsed="0.000278"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.715173" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.714965" elapsed="0.000435"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.715631" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.715424" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.714645" elapsed="0.001064"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:30.488157" elapsed="0.227576"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.718305" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.717838" elapsed="0.000495"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:30.718378" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:30.718526" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:30.717419" elapsed="0.001150"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.777386" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.777009" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.778273" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:30.778015" elapsed="0.000334">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:30.778442" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:30.777600" elapsed="0.000867"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.779037" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:30.778651" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.779366" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:30.779518" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:30.779227" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.779966" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.779721" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.780971" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.780717" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.781452" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.781180" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.781858" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.782068" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.782246" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:30.781687" elapsed="0.000616"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.781531" elapsed="0.000802"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:30.782377" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:30.782543" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:30.780375" elapsed="0.002216"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.780082" elapsed="0.002543"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.782802" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.782650" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.780063" elapsed="0.002816"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.783458" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.783025" elapsed="0.000461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.783534" elapsed="0.000049"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:30.776378" elapsed="0.007302"/>
</kw>
<msg time="2026-04-10T00:53:30.783735" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:30.763600" elapsed="0.020185"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.798013" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.811058" elapsed="0.000066"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.823726" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.823928" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.824106" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.824479" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.824333" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:30.824318" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.824721" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.824891" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.825058" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:30.824288" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.824185" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.825283" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.825359" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:30.825659" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:30.758970" elapsed="0.066726"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.827376" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:30.827124" elapsed="0.000318">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:30.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-04-10T00:53:30.826777" elapsed="0.000800"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.827896" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.827648" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.828448" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.828155" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.827978" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.827631" elapsed="0.000899"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.830934" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:30.828699" elapsed="0.002261"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:30.831010" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:30.831315" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:30.826315" elapsed="0.005035"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:30.833032" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:30.832791" elapsed="0.000303">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:30.833188" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:30.832429" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:30.833419" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:53:30.833284" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.833266" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.833665" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.833840" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.833905" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:30.836202" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:30.831993" elapsed="0.004245"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.838081" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.837794" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.838528" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.838285" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:30.859282" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:30.860179" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:30.860684" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:30.840782" elapsed="0.019962"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.838674" elapsed="0.022170"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.861279" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.860907" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.838656" elapsed="0.022819"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.870414" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.863894" elapsed="0.006875"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.863356" elapsed="0.007452"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.863314" elapsed="0.007520"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.873597" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.871138" elapsed="0.002507"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.870897" elapsed="0.002783"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.870877" elapsed="0.002827"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.874311" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.873893" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.874671" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.874409" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.875224" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.874922" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.874755" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.874391" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.875849" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.875469" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.876182" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.875946" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.876741" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.876426" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.876263" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.875928" elapsed="0.000896"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:30.876977" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:30.877798" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.877490" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.877980" elapsed="0.002482"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:30.862363" elapsed="0.018166"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.880727" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:30.880618" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.880598" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:30.889364" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:30.880944" elapsed="0.008451"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:30.889453" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:53:30.889839" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:30.836852" elapsed="0.053025"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.889970" elapsed="0.000075"/>
</return>
<msg time="2026-04-10T00:53:30.890337" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:30.733896" elapsed="0.156483"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.891363" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.890590" elapsed="0.000950"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.890569" elapsed="0.001031"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.891690" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:30.722992" elapsed="0.168899"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.718638" elapsed="0.173300"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.718621" elapsed="0.173341"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:53:30.892712" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:30.892582" elapsed="0.000240"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.892886" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:30.892848" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.892563" elapsed="0.000435"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.893158" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:53:30.893279" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:30.892257" elapsed="0.001047"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.894085" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.893484" elapsed="0.000627"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.894890" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.894306" elapsed="0.000612"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.902097" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.901383" elapsed="0.000917"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.903307" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.902621" elapsed="0.000846"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:30.913979" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:30.914053" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:30 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:53:13.451","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"643.7 μs","Voting":true,"CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782410,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:30.914343" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:30.906058" elapsed="0.008326"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.903602" elapsed="0.010845"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.914885" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.914514" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.903568" elapsed="0.011483"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.921006" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:53:13.451","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"643.7 μs","Voting":true,"CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782410,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.917244" elapsed="0.003991"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.916999" elapsed="0.004320"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.916950" elapsed="0.004468"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.925469" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:30.922350" elapsed="0.003167"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.921758" elapsed="0.003810"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.921657" elapsed="0.003958"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.926424" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.925903" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.926904" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.926651" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.927498" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.927178" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.927007" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.926603" elapsed="0.001033"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.928323" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.927894" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.928792" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.928526" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.929371" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.929065" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.928895" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.928479" elapsed="0.000995"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:30.929746" elapsed="0.000433"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:30.930861" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.930486" elapsed="0.000427"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.931169" elapsed="0.002563"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:30.915923" elapsed="0.017923"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:30.934232" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:30.933987" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.933947" elapsed="0.000472"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:30.938191" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:30.934682" elapsed="0.003602"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:30.938422" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:53:30.938732" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:30.895928" elapsed="0.042833"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:30.938820" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:30.938979" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:30.895134" elapsed="0.043872"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.940404" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782410, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:30.939691" elapsed="0.000745"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:30.940538" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:53:30.940742" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782410, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:30.939244" elapsed="0.001526"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:30.941161" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.940931" elapsed="0.000258"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:30.941613" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.941348" elapsed="0.000293"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:30.941689" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:30.941843" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:30.716815" elapsed="0.225052"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:30.941925" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:30.942102" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:30.716070" elapsed="0.226059"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.942458" elapsed="0.000210"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.942214" elapsed="0.000493"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.942878" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.942731" elapsed="0.000218"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.943135" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.942983" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.942195" elapsed="0.001013"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:30.715899" elapsed="0.227333"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:30.275867" elapsed="0.667398"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:53:30.943308" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:53:30.943518" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:53:30.943631" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:53:30.271674" elapsed="0.671983"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.944120" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:53:30.944197" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:53:30.943835" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:30.944510" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:30.944292" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.944273" elapsed="0.000334"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.947455" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:53:30.944747" elapsed="0.002757"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:53:30.947996" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:30.947701" elapsed="0.000322"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:53:30.948084" elapsed="0.000031"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:53:30.269020" elapsed="0.679226"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:53:30.268793" elapsed="0.679500"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.953011" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:30.952609" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.953599" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:30.953266" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:30.953673" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:30.953829" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:30.952201" elapsed="0.001653"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:53:30.954042" elapsed="0.000205"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.954935" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:30.954512" elapsed="0.000450"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.955373" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:30.955128" elapsed="0.000271"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.955813" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:30.955569" elapsed="0.000271"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:30.958708" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:30.958062" elapsed="0.000673"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:30.958783" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:30.958934" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:30.957655" elapsed="0.001303"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.018770" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.018326" elapsed="0.000475"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:31.019619" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:31.019320" elapsed="0.000376">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:31.019803" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:31.018975" elapsed="0.000853"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.020422" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:31.020020" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:31.020788" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:31.020949" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:31.020641" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.021387" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.021137" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.022493" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.022220" elapsed="0.000345"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.023029" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.022759" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.023396" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.023624" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.023804" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:31.023256" elapsed="0.000672"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.023111" elapsed="0.000849"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:31.024011" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:53:31.024181" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:31.021873" elapsed="0.002334"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.021516" elapsed="0.002723"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.024419" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.024266" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.021492" elapsed="0.003006"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.025120" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.024663" elapsed="0.000485"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:31.025197" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:31.017697" elapsed="0.007627"/>
</kw>
<msg time="2026-04-10T00:53:31.025379" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:31.004430" elapsed="0.021015"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.038508" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.051214" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.064002" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.064202" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.064380" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.064780" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.064632" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:31.064617" 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-04-10T00:53:31.065000" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.065168" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.065333" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:31.064585" elapsed="0.000801"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.064460" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.065578" elapsed="0.000060"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.065697" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:53:31.065991" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:30.999957" elapsed="0.066070"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:31.067780" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:31.067499" elapsed="0.000353">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:31.067945" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:31.067148" elapsed="0.000822"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.068288" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.068040" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.068857" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.068562" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.068368" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.068022" elapsed="0.000918"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.071325" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:31.069091" elapsed="0.002260"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:31.071403" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:31.071759" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:31.066674" elapsed="0.005121"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:31.073403" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:31.073162" elapsed="0.000304">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:31.073575" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:31.072824" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:31.073806" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:31.073673" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.073655" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.074034" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.074204" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.074270" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:31.076581" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:31.072371" elapsed="0.004249"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.078402" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.078147" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.078875" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.078618" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:31.089657" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:31.090121" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:31.090308" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:31.081153" elapsed="0.009182"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.078985" elapsed="0.011393"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.090590" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.090405" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.078967" elapsed="0.011711"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.094501" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.091748" elapsed="0.003093"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.091508" elapsed="0.003400"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.091489" elapsed="0.003444"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.097810" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.095220" elapsed="0.002638"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.094991" elapsed="0.002901"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.094974" elapsed="0.002942"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.098467" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.098083" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.098827" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.098586" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.099404" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.099105" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.098943" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.098567" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.100023" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.099664" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.100350" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.100119" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.100899" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.100605" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.100430" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.100101" elapsed="0.000879"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:31.101127" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:31.101945" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.101653" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.102124" elapsed="0.002560"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:31.091083" elapsed="0.013666"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.104924" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.104819" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.104801" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:31.113225" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:31.105138" elapsed="0.008117"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:31.113308" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:31.113654" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:31.077209" elapsed="0.036483"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:31.113782" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:53:31.114120" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:30.974682" elapsed="0.139480"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.115137" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.114353" elapsed="0.000954"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.114335" elapsed="0.001013"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:31.115437" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:30.963404" elapsed="0.152247"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:30.959028" elapsed="0.156669"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:30.959011" elapsed="0.156711"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:53:31.116562" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:53:31.116300" elapsed="0.000383"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.116749" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.116710" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.116282" elapsed="0.000579"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.117011" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:53:31.117133" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:31.116009" elapsed="0.001149"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.117761" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.117328" elapsed="0.000460"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.118521" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.117961" elapsed="0.000605"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.125947" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.125224" elapsed="0.000888"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.127092" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.126373" elapsed="0.000881"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:31.135775" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:31.135834" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:31 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:31 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":4,"SnapshotIndex":117,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":117,"Leader":"member-1-shard-default-config","LastIndex":118,"RaftState":"Leader","LastApplied":118,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":118,"LastLeadershipChangeTime":"2026-04-10 00:49:56.029","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.119","active":true,"matchIndex":118,"voting":true,"id":"member-3-shard-default-config","nextIndex":119},{"timeSinceLastActivity":"00:00:00.119","active":true,"matchIndex":118,"voting":true,"id":"member-2-shard-default-config","nextIndex":119}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"601.9 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":118,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":18,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":12295},"timestamp":1775782411,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:31.136045" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:31.129794" elapsed="0.006286"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.127372" elapsed="0.008766"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.136516" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.136199" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.127339" elapsed="0.009354"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.141494" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":4,"SnapshotIndex":117,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":117,"Leader":"member-1-shard-default-config","LastIndex":118,"RaftState":"Leader","LastApplied":118,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":118,"LastLeadershipChangeTime":"2026-04-10 00:49:56.029","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.119","active":true,"matchIndex":118,"voting":true,"id":"member-3-shard-default-config","nextIndex":119},{"timeSinceLastActivity":"00:00:00.119","active":true,"matchIndex":118,"voting":true,"id":"member-2-shard-default-config","nextIndex":119}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"601.9 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":118,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":18,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":12295},"timestamp":1775782411,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.138840" elapsed="0.002747"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.138612" elapsed="0.003012"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.138565" elapsed="0.003103"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.144501" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.142037" elapsed="0.002526"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.141805" elapsed="0.002795"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.141761" elapsed="0.002883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.145340" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.144905" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.145866" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.145546" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.146444" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.146135" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.145969" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.145497" elapsed="0.001062"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.147265" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.146813" elapsed="0.000503"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.147719" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.147461" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.148283" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.147983" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.147818" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.147417" elapsed="0.000967"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:31.148640" elapsed="0.000419"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:31.149722" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.149314" elapsed="0.000459"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.150016" elapsed="0.002516"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:31.137536" elapsed="0.015121"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.153004" elapsed="0.000046"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.152787" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.152753" elapsed="0.000396"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:31.156914" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:31.153378" elapsed="0.003630"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:31.157096" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:53:31.157529" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:31.119651" elapsed="0.037967"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:31.157681" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:53:31.157846" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:31.118794" elapsed="0.039078"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.159262" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782411, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.158504" elapsed="0.000787"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:31.159340" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:31.159520" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782411, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:31.158107" elapsed="0.001455"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:31.159956" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 118, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.159723" elapsed="0.000262"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:31.160377" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.160144" elapsed="0.000259"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:31.160450" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:31.160623" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:30.957018" elapsed="0.203631"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:31.160708" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:53:31.160858" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:30.956275" elapsed="0.204608"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.161186" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.160967" elapsed="0.000275"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.161477" elapsed="0.000267"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.161266" elapsed="0.000516"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.161954" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.161805" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.160948" elapsed="0.001080"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:30.956100" elapsed="0.205952"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.164736" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.164241" elapsed="0.000522"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:31.164808" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:31.164954" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:31.163855" elapsed="0.001124"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.224761" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.224350" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:31.225705" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:31.225421" elapsed="0.000359">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:31.225875" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:31.224959" elapsed="0.000941"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.226460" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:31.226070" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:31.226814" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:31.226966" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:31.226669" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.227430" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.227149" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.228495" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.228233" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.228989" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.228722" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.229344" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.229570" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.229749" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:31.229208" elapsed="0.000598"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.229068" elapsed="0.000769"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:31.229883" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:53:31.230048" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:31.227901" elapsed="0.002172"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.227569" elapsed="0.002536"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.230278" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.230130" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.227532" elapsed="0.002822"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.230952" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.230498" elapsed="0.000482"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:31.231028" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:31.223539" elapsed="0.007613"/>
</kw>
<msg time="2026-04-10T00:53:31.231207" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:31.210297" elapsed="0.020964"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.244141" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.256953" elapsed="0.000070"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.270022" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.270220" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.270395" elapsed="0.000020"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.270783" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.270636" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:31.270621" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.271001" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.271167" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.271331" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:31.270589" elapsed="0.000794"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.270472" elapsed="0.000937"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.271611" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.271690" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:53:31.271981" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:31.205904" elapsed="0.066114"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:31.273776" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:31.273446" elapsed="0.000401">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:31.273939" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:31.273100" elapsed="0.000864"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.274279" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.274033" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.274858" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.274565" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.274359" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.274015" elapsed="0.000925"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.277355" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:31.275091" elapsed="0.002290"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:31.277431" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:53:31.277795" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:31.272662" elapsed="0.005168"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:31.279480" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:31.279240" elapsed="0.000342">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:31.279677" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:31.278901" elapsed="0.000800"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:31.279905" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:31.279772" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.279754" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.280135" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.280308" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.280372" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:31.284022" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:31.278448" elapsed="0.005612"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.285872" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.285612" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.286320" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.286076" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:31.309627" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:31.310075" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:31.310328" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:31.288574" elapsed="0.021782"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.286432" elapsed="0.023974"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.310648" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.310439" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.286414" elapsed="0.024325"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.314698" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.311858" elapsed="0.003168"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.311600" elapsed="0.003462"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.311579" elapsed="0.003508"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.318022" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.315376" elapsed="0.002693"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.315145" elapsed="0.002960"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.315128" elapsed="0.003010"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.318782" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.318327" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.319119" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.318881" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.319720" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.319364" elapsed="0.000383"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.319201" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.318862" elapsed="0.000941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.320326" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.319966" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.320675" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.320424" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.321218" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.320920" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.320758" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.320406" elapsed="0.000895"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:31.321456" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:31.322279" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.321990" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.322460" elapsed="0.002470"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:31.311125" elapsed="0.013872"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.325178" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.325069" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.325050" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:31.334303" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:31.325396" elapsed="0.008937"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:31.334394" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:53:31.334773" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:31.284673" elapsed="0.050138"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:31.334903" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:53:31.335244" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:31.180626" elapsed="0.154659"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.336259" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.335473" elapsed="0.000954"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.335454" elapsed="0.001014"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:31.336573" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:31.169477" elapsed="0.167291"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.165044" elapsed="0.171769"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.165028" elapsed="0.171809"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:53:31.337565" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:53:31.337417" elapsed="0.000259"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.337742" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.337703" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.337400" elapsed="0.000455"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.338005" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:53:31.338126" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:31.337122" elapsed="0.001030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.338746" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.338323" elapsed="0.000451"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.339488" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.338931" elapsed="0.000585"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.346697" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.345997" elapsed="0.000864"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.347882" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.347119" elapsed="0.000920"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:31.358919" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:31.358978" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:31 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:31 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":117,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":117,"Leader":"member-1-shard-default-config","LastIndex":118,"RaftState":"Follower","LastApplied":118,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":118,"LastLeadershipChangeTime":"2026-04-10 00:51:04.137","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"326.1 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":118,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":12295},"timestamp":1775782411,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:31.359185" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:31.350649" elapsed="0.008571"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.348165" elapsed="0.011113"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.359735" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.359338" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.348124" elapsed="0.011809"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.369203" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":117,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":117,"Leader":"member-1-shard-default-config","LastIndex":118,"RaftState":"Follower","LastApplied":118,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":118,"LastLeadershipChangeTime":"2026-04-10 00:51:04.137","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"326.1 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":118,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":12295},"timestamp":1775782411,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.363986" elapsed="0.005312"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.363392" elapsed="0.005943"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.363290" elapsed="0.006090"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.372283" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.369855" elapsed="0.002474"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.369518" elapsed="0.002847"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.369473" elapsed="0.002936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.373121" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.372687" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.373581" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.373322" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.374154" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.373848" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.373682" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.373277" elapsed="0.000980"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.374960" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.374509" elapsed="0.000501"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.375397" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.375160" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.376011" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.375680" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.375495" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.375114" elapsed="0.001000"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:31.376358" elapsed="0.000444"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:31.377392" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.377060" elapsed="0.000381"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.377708" elapsed="0.002563"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:31.361136" elapsed="0.019244"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.380753" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.380513" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.380479" elapsed="0.000424"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:31.384518" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:31.381133" elapsed="0.003496"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:31.384715" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:53:31.384986" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:31.340572" elapsed="0.044441"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:31.385070" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:31.385219" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:31.339781" elapsed="0.045463"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.386536" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782411, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.385854" elapsed="0.000728"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:31.386667" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:31.386846" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782411, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:31.385470" elapsed="0.001402"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:31.387258" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 118, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.387032" elapsed="0.000253"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:31.387760" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.387442" elapsed="0.000344"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:31.387833" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:31.388298" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:31.163194" elapsed="0.225133"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:31.388389" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:31.388564" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:31.162394" elapsed="0.226196"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.388903" elapsed="0.000198"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.388677" elapsed="0.000462"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.389309" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.389163" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.389528" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.389386" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.388659" elapsed="0.000960"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:31.162221" elapsed="0.227421"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.392263" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.391768" elapsed="0.000522"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:31.392335" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:31.392480" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:31.391345" elapsed="0.001160"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.452267" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.451861" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:31.453112" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:31.452828" elapsed="0.000360">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:31.453282" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:31.452469" elapsed="0.000837"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.453882" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:31.453475" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:53:31.454214" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:53:31.454367" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:53:31.454072" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.454900" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.454648" 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-04-10T00:53:31.455931" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.455677" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.456435" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.456169" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.456811" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.457017" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.457194" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:53:31.456672" elapsed="0.000579"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.456515" elapsed="0.000767"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:53:31.457328" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:53:31.457492" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:53:31.455328" elapsed="0.002189"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.455023" elapsed="0.002542"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.457741" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.457591" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.455001" elapsed="0.002816"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.458393" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.457961" elapsed="0.000459"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:53:31.458469" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:53:31.451226" elapsed="0.007385"/>
</kw>
<msg time="2026-04-10T00:53:31.458666" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:31.438137" elapsed="0.020581"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.471657" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.484434" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.497073" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.497271" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.497445" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.497882" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.497735" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:53:31.497720" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.498101" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.498269" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.498435" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:53:31.497690" elapsed="0.000798"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.497585" elapsed="0.000929"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.498677" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.498754" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:31.499019" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:53:31.433502" elapsed="0.065554"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:31.500757" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:31.500484" elapsed="0.000338">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:31.500916" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:31.500116" 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-04-10T00:53:31.501259" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.501011" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.501827" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.501514" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.501339" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.500993" elapsed="0.000917"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.504268" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:31.502061" elapsed="0.002267"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:53:31.504380" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:31.504731" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:31.499680" elapsed="0.005086"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:53:31.506442" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:53:31.506200" elapsed="0.000304">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:53:31.506621" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:53:31.505858" elapsed="0.000788"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:53:31.506852" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:31.506717" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.506699" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.507083" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.507256" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.507359" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:53:31.509687" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:53:31.505350" elapsed="0.004374"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.511496" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.511243" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.512003" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.511759" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:31.532890" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node017tn392x68s39sc3ndkjvqix1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:31.533840" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:53:31.534349" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:31.514295" elapsed="0.020115"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.512114" elapsed="0.022394"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.534969" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.534600" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.512096" elapsed="0.023067"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.541438" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.537507" elapsed="0.004447"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.537039" elapsed="0.004968"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.536996" elapsed="0.005045"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.545788" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.542442" elapsed="0.003392"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.542122" elapsed="0.003747"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.542098" elapsed="0.003794"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.546446" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.546064" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.546797" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.546546" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.547342" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.547042" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.546879" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.546525" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.547980" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.547609" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.548311" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.548076" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.548888" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.548594" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.548392" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.548058" elapsed="0.000913"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:31.549120" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:31.549947" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.549654" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.550127" elapsed="0.002564"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:31.536002" elapsed="0.016753"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.552929" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.552824" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.552806" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:31.561595" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:31.553139" elapsed="0.008487"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:31.561678" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:53:31.562001" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:31.510309" elapsed="0.051729"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:31.562128" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:53:31.562466" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:53:31.408111" elapsed="0.154396"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.563446" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.562724" elapsed="0.000902"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.562705" elapsed="0.000962"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:31.563756" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:53:31.397010" elapsed="0.166938"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.392589" elapsed="0.171403"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.392571" elapsed="0.171446"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:53:31.564761" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:53:31.564634" elapsed="0.000237"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.564937" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.564898" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.564617" elapsed="0.000433"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.565199" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:53:31.565321" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:53:31.564302" elapsed="0.001045"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.565946" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.565523" elapsed="0.000450"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.566716" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.566130" elapsed="0.000615"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.573865" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.573156" elapsed="0.000870"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.574997" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.574285" elapsed="0.000869"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:31.584771" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:31.584832" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:31 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:31 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":117,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":117,"Leader":"member-1-shard-default-config","LastIndex":118,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":118,"LastLogIndex":118,"LastLeadershipChangeTime":"2026-04-10 00:53:13.515","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"548.3 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":118,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":12295},"timestamp":1775782411,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:31.585045" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:31.577667" elapsed="0.007414"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.575271" elapsed="0.009867"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.585621" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.585199" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.575239" elapsed="0.010620"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.592798" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":117,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":117,"Leader":"member-1-shard-default-config","LastIndex":118,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":118,"LastLogIndex":118,"LastLeadershipChangeTime":"2026-04-10 00:53:13.515","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"548.3 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":118,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":12295},"timestamp":1775782411,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.588874" elapsed="0.004063"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.588477" elapsed="0.004511"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.588406" elapsed="0.004645"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.596061" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.593537" elapsed="0.002571"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.593243" elapsed="0.002900"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.593180" elapsed="0.003007"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.596954" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.596443" elapsed="0.000563"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.597402" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.597157" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.598012" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.597686" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.597502" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.597111" elapsed="0.001005"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.598866" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.598370" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.599328" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.599082" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.599928" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:31.599616" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.599428" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.599036" elapsed="0.001002"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:31.600284" elapsed="0.000505"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:31.601405" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.601074" elapsed="0.000380"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.601720" elapsed="0.002554"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:31.587013" elapsed="0.017369"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.604788" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.604512" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.604480" elapsed="0.000461"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:31.608607" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:31.605177" elapsed="0.003567"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:31.608838" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:53:31.609130" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:31.567772" elapsed="0.041387"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:31.609217" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:31.609370" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:53:31.566961" elapsed="0.042435"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.610788" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782411, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:31.610009" elapsed="0.000809"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:31.610913" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:31.611094" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782411, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:31.609638" elapsed="0.001487"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:31.611525" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 118, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.611294" elapsed="0.000278"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:31.611976" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.611736" elapsed="0.000267"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:53:31.612052" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:31.612219" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:31.390742" elapsed="0.221503"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:53:31.612303" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:31.612459" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:53:31.389989" elapsed="0.222497"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.612852" elapsed="0.000195"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:31.612585" elapsed="0.000501"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.613267" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.613110" elapsed="0.000214"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.613493" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.613348" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.612567" elapsed="0.001019"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:31.389810" elapsed="0.223801"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:30.955891" elapsed="0.657752"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:53:31.613688" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:53:31.613892" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:53:31.613939" level="INFO">${follower_list} = [2, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:53:30.951451" elapsed="0.662512"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.614419" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:53:31.614496" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:53:31.614140" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.614873" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.614654" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.614635" elapsed="0.000316"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.617391" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:53:31.615088" elapsed="0.002352"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:53:31.617815" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.617625" elapsed="0.000216"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:53:31.617887" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:53:30.948652" elapsed="0.669390"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:53:30.948395" elapsed="0.669693"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:53:29.578352" elapsed="2.039767"/>
</for>
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:53:29.577956" elapsed="2.040220"/>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:53:27.456284" elapsed="4.162000"/>
</kw>
<arg>${restart_timeout}</arg>
<arg>2s</arg>
<arg>ClusterOpenFlow.Check OpenFlow Shards Status</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:53:27.455709" elapsed="4.162624"/>
</kw>
<doc>Wait for node convergence and check status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:53:26.249250" elapsed="5.369207"/>
</test>
<test id="s1-s2-t26" name="Verify Data Recovery After Follower Restart" line="220">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:53:31.622025" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:53:31.621757" elapsed="0.000535"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.623317" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.623205" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.623187" elapsed="0.000209"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.628641" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.628515" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.628495" elapsed="0.000239"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.629749" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:31.629338" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.630243" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:31.629939" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:31.630313" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:31.630467" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:31.628961" elapsed="0.001534"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.636241" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.636132" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.636113" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.637534" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.637426" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.637408" elapsed="0.000231"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:31.638091" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.637791" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:31.638517" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:31.638282" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:31.670168" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:31.639082" elapsed="0.031198"/>
</kw>
<msg time="2026-04-10T00:53:31.670448" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:31.670494" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:31.638738" elapsed="0.031793"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:31.737617" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:31.671091" elapsed="0.066700"/>
</kw>
<msg time="2026-04-10T00:53:31.737967" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:31.738013" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:31.670736" elapsed="0.067315"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.738430" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.738157" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.738125" elapsed="0.000516"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.739125" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.738794" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.739507" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.739287" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.739269" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:31.739646" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:31.742397" elapsed="0.000176"/>
</kw>
<msg time="2026-04-10T00:53:31.742638" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:31.741240" elapsed="0.001536"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.743060" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.743396" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:31.740566" elapsed="0.003039"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:31.739979" elapsed="0.003693"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:31.637119" elapsed="0.106650"/>
</kw>
<msg time="2026-04-10T00:53:31.743866" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:31.743910" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:31.636466" elapsed="0.107482"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:31.744133" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:31.744026" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.744008" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.744652" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.744997" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.745068" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:31.635785" elapsed="0.109436"/>
</kw>
<msg time="2026-04-10T00:53:31.745316" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:31.745360" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:31.630893" elapsed="0.114505"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.745745" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.745476" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.745459" elapsed="0.000363"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:31.630747" elapsed="0.115098"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.751849" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.751742" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.751723" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.753099" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.752968" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.752938" elapsed="0.000272"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:31.753679" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.753355" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:31.754145" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:31.753905" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:31.796089" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:31.754698" elapsed="0.041602"/>
</kw>
<msg time="2026-04-10T00:53:31.796528" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:31.796607" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:31.754334" elapsed="0.042314"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:31.881917" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:31.797412" elapsed="0.084762"/>
</kw>
<msg time="2026-04-10T00:53:31.882392" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:31.882440" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:31.796923" elapsed="0.085560"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.882956" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.882635" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.882591" elapsed="0.000454"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:31.883588" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:31.883193" elapsed="0.000492"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.883969" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.883751" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.883734" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:31.884084" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:31.886846" elapsed="0.000161"/>
</kw>
<msg time="2026-04-10T00:53:31.887067" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:31.885724" elapsed="0.001482"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.887487" elapsed="0.000103"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.887848" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:31.885023" elapsed="0.003012"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:31.884419" elapsed="0.003681"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:31.752654" elapsed="0.135544"/>
</kw>
<msg time="2026-04-10T00:53:31.888296" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:31.888341" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:31.752069" elapsed="0.136313"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:31.888593" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:31.888462" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.888443" elapsed="0.000383"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.889247" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.889711" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.889784" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:31.751374" elapsed="0.138522"/>
</kw>
<msg time="2026-04-10T00:53:31.889991" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:31.890035" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:31.746126" elapsed="0.143946"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:31.890402" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:31.890149" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.890132" elapsed="0.000346"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:31.745982" elapsed="0.144520"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.896602" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.896477" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.896459" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:31.897846" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:31.897740" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:31.897722" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:31.898356" level="INFO">${karaf_connection_index} = 212</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:31.898058" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:31.898790" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:31.898542" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:31.956135" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:31.899320" elapsed="0.056958"/>
</kw>
<msg time="2026-04-10T00:53:31.956492" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:31.956583" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:31.898982" elapsed="0.057653"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:32.067805" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:31.957332" elapsed="0.110681"/>
</kw>
<msg time="2026-04-10T00:53:32.068214" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:32.068261" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:31.956872" elapsed="0.111427"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:32.068748" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:32.068413" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.068378" elapsed="0.000457"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.069346" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:32.068985" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:32.069750" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:32.069508" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.069490" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:32.069939" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:32.072706" elapsed="0.000168"/>
</kw>
<msg time="2026-04-10T00:53:32.072936" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:32.071570" elapsed="0.001503"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:32.073349" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:32.073712" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:32.070900" elapsed="0.002997"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:32.070305" elapsed="0.003658"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:31.897394" elapsed="0.176667"/>
</kw>
<msg time="2026-04-10T00:53:32.074159" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:32.074239" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:31.896824" elapsed="0.177464"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:32.074478" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:32.074369" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.074351" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:32.074984" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:32.075319" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:32.075390" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:31.896133" elapsed="0.179367"/>
</kw>
<msg time="2026-04-10T00:53:32.075619" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:32.075665" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:31.890808" elapsed="0.184894"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:32.076030" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:32.075779" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.075762" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:31.890661" elapsed="0.185469"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:31.630572" elapsed="0.445594"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:53:31.628138" elapsed="0.448090"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:53:31.622914" elapsed="0.453374"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:31.622457" elapsed="0.453879"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:53:31.619533" elapsed="0.456861"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.088858" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:32.088452" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.089345" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:32.089048" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:32.089415" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:32.089588" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:32.088070" elapsed="0.001544"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.100522" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:32.100220" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:32.100614" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:32.100764" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:32.099873" elapsed="0.001047"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.114786" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:32.114522" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.115227" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:32.114990" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.115689" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:32.115426" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.116123" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:32.115885" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:32.116989" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:53:32.116788" elapsed="0.000227"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:53:32.117343" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:53:32.117171" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:53:32.117520" elapsed="0.000222"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.118143" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:32.117899" elapsed="0.000287"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:53:32.118227" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:32.118419" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:53:32.116366" elapsed="0.002079"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:32.130175" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:53:32.130223" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:32.130322" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:32.120806" elapsed="0.009543"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:32.118516" elapsed="0.011904"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:32.130691" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:32.130449" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.118498" elapsed="0.012328"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.136083" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:32.132350" elapsed="0.003798"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:32.132024" elapsed="0.004175"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.131998" elapsed="0.004237"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.140092" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:32.136671" elapsed="0.003467"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:32.136316" elapsed="0.003857"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.136292" elapsed="0.003905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.140777" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:32.140365" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:32.141111" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:32.140874" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.141731" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:32.141405" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:32.141240" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.140856" elapsed="0.000959"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.142335" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:32.141976" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:32.142714" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:32.142452" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.143252" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:32.142955" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:32.142795" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.142413" elapsed="0.000922"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:32.143486" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:32.144295" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:32.144018" elapsed="0.000302"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:32.144475" elapsed="0.002570"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:32.131352" elapsed="0.015756"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:32.147285" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:32.147180" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.147162" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:32.149969" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:32.147497" elapsed="0.002499"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:32.150045" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:32.150199" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:32.111808" elapsed="0.038416"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:32.150289" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:53:32.150436" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:53:32.109149" elapsed="0.041339"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:32.150539" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:53:32.150703" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:32.099407" elapsed="0.051321"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:53:32.094698" elapsed="0.056092"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:32.089845" elapsed="0.060977"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:32.089708" elapsed="0.061145"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.162584" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:32.162228" elapsed="0.000384"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:32.162660" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:32.162810" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:32.161881" elapsed="0.000954"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.169632" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:32.169366" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.170080" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:32.169836" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:32.176849" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:32.176904" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:32 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:32 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782412,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:32.176993" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:32.172454" elapsed="0.004564"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:32.170191" elapsed="0.006870"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:32.177240" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:32.177087" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.170173" elapsed="0.007153"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.181944" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782412,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:32.178489" elapsed="0.003525"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:32.178266" elapsed="0.003800"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.178247" elapsed="0.003855"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.186381" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:32.182508" elapsed="0.003941"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:32.182183" elapsed="0.004317"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.182158" elapsed="0.004378"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.187410" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:32.186871" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:32.187781" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:32.187526" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.188435" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:32.188022" elapsed="0.000440"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:32.187862" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.187508" elapsed="0.001011"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.189058" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:32.188697" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:32.189388" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:32.189154" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.190064" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:32.189653" elapsed="0.000438"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:32.189469" elapsed="0.000657"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.189136" elapsed="0.001011"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:32.190296" elapsed="0.000527"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:32.191399" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:32.190990" elapsed="0.000434"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:32.191602" elapsed="0.008755"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:32.177845" elapsed="0.022578"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:32.200665" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:53:32.200535" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:32.200516" 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-04-10T00:53:32.200919" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:32.200991" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:32.203872" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782412,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:32.163211" elapsed="0.040690"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:32.203955" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:32.204108" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782412,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:32.161409" elapsed="0.042724"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.205162" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782412, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:32.204745" elapsed="0.000445"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:32.205239" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:32.205394" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782412, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:32.204365" elapsed="0.001055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:32.205798" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:32.205617" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.206374" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:32.206000" elapsed="0.000399"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.207116" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:32.206849" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:32.207683" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:32.207314" elapsed="0.000443">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:32.156686" elapsed="0.051190">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:33.220522" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:33.220140" elapsed="0.000432"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:33.220635" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:53:33.220808" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:33.219774" elapsed="0.001059"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:33.228023" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:33.227760" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:33.228470" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:33.228228" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:33.235305" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:33.235363" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:33 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:33 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782413,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:33.235520" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:33.230859" elapsed="0.004705"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:33.228612" elapsed="0.006998"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:33.235792" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:33.235638" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:33.228590" elapsed="0.007290"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:33.239734" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782413,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:33.237083" elapsed="0.002701"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:33.236859" elapsed="0.002961"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:33.236840" elapsed="0.003004"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:33.242961" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:33.240122" elapsed="0.002888"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:33.239900" elapsed="0.003146"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:33.239883" elapsed="0.003188"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:33.243678" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:33.243255" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:33.244017" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:33.243777" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:33.244746" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:33.244265" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:33.244101" elapsed="0.000708"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:33.243759" elapsed="0.001072"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:33.245356" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:33.244992" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:33.245705" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:33.245454" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:33.246365" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:33.245944" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:33.245786" elapsed="0.000642"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:33.245437" elapsed="0.001012"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:33.246624" elapsed="0.000490"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:33.247738" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:33.247281" elapsed="0.000483"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:33.247938" elapsed="0.008541"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:33.236407" elapsed="0.020284"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:33.256883" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:53:33.256769" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:33.256750" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:33.257128" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:33.257199" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:33.259576" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782413,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:33.221191" elapsed="0.038416"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:33.259660" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:33.259812" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782413,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:33.219277" elapsed="0.040610"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:33.261146" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782413, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:33.260465" elapsed="0.000709"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:33.261223" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:33.261379" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782413, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:33.260117" elapsed="0.001288"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:33.261807" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:33.261602" elapsed="0.000231"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:33.262356" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:33.262049" elapsed="0.000335"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:33.262865" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:33.262584" elapsed="0.000317"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:33.263444" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:33.263085" elapsed="0.000444">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:33.209052" elapsed="0.054624">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:34.276460" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:34.276097" elapsed="0.000395"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:34.276566" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:53:34.276736" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:34.275731" elapsed="0.001031"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:34.283761" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:34.283454" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:34.284214" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:34.283972" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:34.291394" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:34.291454" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782414,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:34.291568" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:34.286464" elapsed="0.005132"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:34.284336" elapsed="0.007306"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:34.291848" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:34.291690" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:34.284314" elapsed="0.007621"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:34.295769" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782414,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:34.293175" elapsed="0.002644"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:34.292932" elapsed="0.002922"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:34.292914" elapsed="0.002966"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:34.298930" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:34.296159" elapsed="0.002818"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:34.295937" elapsed="0.003075"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:34.295920" elapsed="0.003115"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:34.299714" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:34.299291" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:34.300053" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:34.299814" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:34.300746" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:34.300295" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:34.300134" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:34.299796" elapsed="0.001034"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:34.301367" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:34.300991" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:34.301714" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:34.301464" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:34.302365" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:34.301961" elapsed="0.000431"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:34.301803" elapsed="0.000625"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:34.301446" elapsed="0.001002"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:34.302624" elapsed="0.000488"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:34.303733" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:34.303279" elapsed="0.000480"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:34.303915" elapsed="0.008582"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:34.292470" elapsed="0.020114"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:34.312764" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:53:34.312657" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:34.312639" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:34.313006" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:34.313076" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:34.315435" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782414,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:34.277153" elapsed="0.038311"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:34.315516" elapsed="0.000239"/>
</return>
<msg time="2026-04-10T00:53:34.315886" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782414,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:34.275222" elapsed="0.040690"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:34.316901" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782414, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:34.316477" elapsed="0.000453"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:34.316979" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:34.317135" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782414, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:34.316134" elapsed="0.001027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:34.317702" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:34.317367" elapsed="0.000364"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:34.318212" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:34.317910" elapsed="0.000327"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:34.318747" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:34.318456" elapsed="0.000317"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:34.319297" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:34.318945" elapsed="0.000424">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:34.264670" elapsed="0.054810">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:35.333274" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:35.332893" elapsed="0.000414"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:35.333368" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:53:35.333539" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:35.332454" elapsed="0.001126"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:35.340677" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:35.340316" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:35.341130" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:35.340885" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:35.348217" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:35.348281" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:35 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:35 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782415,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:35.348378" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:35.343368" elapsed="0.005037"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:35.341249" elapsed="0.007200"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:35.348701" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:35.348477" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:35.341229" elapsed="0.007594"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:35.354257" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782415,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:35.350476" elapsed="0.003854"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:35.350164" elapsed="0.004220"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:35.350138" elapsed="0.004282"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:35.358174" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:35.355056" elapsed="0.003164"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:35.354504" elapsed="0.003750"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:35.354479" elapsed="0.003799"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:35.358889" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:35.358460" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:35.359234" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:35.358987" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:35.359917" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:35.359484" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:35.359317" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:35.358969" elapsed="0.001032"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:35.360539" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:35.360158" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:35.360892" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:35.360660" elapsed="0.000355"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:35.361634" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:35.361206" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:35.361040" elapsed="0.000658"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:35.360643" elapsed="0.001076"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:35.361874" elapsed="0.000491"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:35.362985" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:35.362533" elapsed="0.000479"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:35.363170" elapsed="0.008580"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:35.349541" elapsed="0.022279"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:35.372004" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:53:35.371894" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:35.371876" elapsed="0.000221"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:35.372280" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:35.372357" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:35.374864" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782415,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:35.333936" elapsed="0.040957"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:35.374946" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:35.375098" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782415,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:35.331328" elapsed="0.043796"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:35.376123" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782415, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:35.375727" elapsed="0.000424"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:35.376200" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:35.376375" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782415, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:35.375355" elapsed="0.001047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:35.377051" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:35.376869" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:35.377572" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:35.377255" elapsed="0.000345"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:35.378038" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:35.377775" elapsed="0.000288"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:35.378603" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:35.378234" elapsed="0.000440">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:35.320515" elapsed="0.058268">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:36.390104" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:36.389603" elapsed="0.000545"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:36.390225" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:53:36.390480" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:36.389075" elapsed="0.001442"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:36.397844" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:36.397482" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:36.398327" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:36.398073" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:36.404773" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:36.404833" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:36 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:36 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782416,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:36.404929" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:36.400623" elapsed="0.004333"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:36.398482" elapsed="0.006517"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:36.405185" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:36.405027" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:36.398460" elapsed="0.006814"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:36.410170" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782416,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:36.406499" elapsed="0.003742"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:36.406260" elapsed="0.004031"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:36.406242" elapsed="0.004084"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:36.414710" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:36.410781" elapsed="0.003997"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:36.410422" elapsed="0.004486"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:36.410394" elapsed="0.004549"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:36.415763" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:36.415246" elapsed="0.000545"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:36.416102" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:36.415863" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:36.416781" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:36.416345" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:36.416184" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:36.415845" elapsed="0.001021"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:36.417390" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:36.417025" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:36.417738" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:36.417487" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:36.418396" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:36.417977" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:36.417820" elapsed="0.000640"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:36.417470" elapsed="0.001011"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:36.418665" elapsed="0.000533"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:36.419831" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:36.419368" elapsed="0.000490"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:36.420013" elapsed="0.009069"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:36.405825" elapsed="0.023332"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:36.429408" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:53:36.429294" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:36.429272" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:36.429686" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:36.429760" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:36.432457" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782416,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:36.391079" elapsed="0.041408"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:36.432544" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:53:36.432713" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782416,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:36.388334" elapsed="0.044405"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:36.433769" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782416, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:36.433330" elapsed="0.000467"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:36.433847" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:36.434006" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782416, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:36.432971" elapsed="0.001062"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:36.434413" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:36.434214" elapsed="0.000227"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:36.435174" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:36.434832" elapsed="0.000443"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:36.435760" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:36.435462" elapsed="0.000325"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:36.436314" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:36.435960" elapsed="0.000426">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:36.379824" elapsed="0.056672">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:37.448605" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:37.448106" elapsed="0.000543"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:37.448727" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:53:37.448949" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:37.447681" elapsed="0.001301"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:37.456888" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:37.456517" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:37.457371" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:37.457116" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:37.465698" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:37.465832" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:37 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:37 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782417,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:37.465986" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:37.460090" elapsed="0.005935"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:37.457504" elapsed="0.008678"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:37.466442" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:37.466225" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:37.457479" elapsed="0.009055"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:37.472090" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782417,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:37.468237" elapsed="0.003962"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:37.467902" elapsed="0.004373"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:37.467873" elapsed="0.004455"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:37.478501" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:37.472950" elapsed="0.005676"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:37.472447" elapsed="0.006244"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:37.472411" elapsed="0.006321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:37.479641" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:37.479053" elapsed="0.000621"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:37.480092" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:37.479777" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:37.480975" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:37.480401" elapsed="0.000610"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:37.480193" elapsed="0.000865"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:37.479748" elapsed="0.001340"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:37.481761" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:37.481310" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:37.482231" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:37.481916" elapsed="0.000390"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:37.483131" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:37.482579" elapsed="0.000590"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:37.482339" elapsed="0.000878"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:37.481891" elapsed="0.001354"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:37.483475" elapsed="0.000667"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:37.485000" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:37.484372" elapsed="0.000664"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:37.485260" elapsed="0.011240"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:37.467237" elapsed="0.029720"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:37.497258" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-10T00:53:37.497096" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:37.497056" elapsed="0.000331"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:37.497665" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:37.497764" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:53:37.500515" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782417,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:37.449392" elapsed="0.051419"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:37.500886" elapsed="0.000100"/>
</return>
<msg time="2026-04-10T00:53:37.501165" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782417,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:37.447104" elapsed="0.054098"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:37.502883" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782417, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:37.502252" elapsed="0.000670"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:37.502987" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:53:37.503202" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782417, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:37.501652" elapsed="0.001588"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:37.503763" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:37.503482" elapsed="0.000317"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:37.504481" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:37.504051" elapsed="0.000467"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:37.505167" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:37.504800" elapsed="0.000395"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:37.505759" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:37.505371" elapsed="0.000486">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:37.437685" elapsed="0.068351">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:38.518702" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:38.518311" elapsed="0.000424"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:38.518793" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:53:38.518963" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:38.517951" elapsed="0.001036"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:38.525860" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:38.525587" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:38.526308" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:38.526065" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:38.533781" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:38.533868" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:38 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:38 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782418,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:38.534012" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:38.528585" elapsed="0.005465"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:38.526427" elapsed="0.007686"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:38.534369" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:38.534154" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:38.526405" elapsed="0.008082"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:38.542187" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782418,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:38.536518" elapsed="0.005722"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:38.536113" elapsed="0.006163"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:38.536085" elapsed="0.006215"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:38.545224" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:38.542614" elapsed="0.002666"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:38.542357" elapsed="0.002957"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:38.542340" elapsed="0.002998"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:38.546085" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:38.545523" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:38.546425" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:38.546183" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:38.547110" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:38.546694" elapsed="0.000443"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:38.546505" elapsed="0.000667"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:38.546165" elapsed="0.001028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:38.547788" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:38.547387" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:38.548125" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:38.547888" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:38.548858" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:38.548392" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:38.548224" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:38.547870" elapsed="0.001073"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:38.549098" elapsed="0.000503"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:38.550204" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:38.549767" elapsed="0.000463"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:38.550383" elapsed="0.009184"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:38.535385" elapsed="0.024267"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:38.559837" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:53:38.559727" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:38.559707" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:38.560083" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:38.560155" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:38.562731" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782418,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:38.519339" elapsed="0.043420"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:38.562813" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:38.562965" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782418,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:38.517449" elapsed="0.045542"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:38.564013" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782418, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:38.563602" elapsed="0.000439"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:38.564089" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:38.564243" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782418, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:38.563228" elapsed="0.001040"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:38.564687" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:38.564476" elapsed="0.000237"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:38.565236" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:38.564909" elapsed="0.000356"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:38.565999" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:38.565448" elapsed="0.000578"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:38.566578" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:38.566205" elapsed="0.000450">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:38.507004" elapsed="0.059763">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:39.577963" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:39.577411" elapsed="0.000598"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:39.578091" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T00:53:39.578359" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:39.576821" elapsed="0.001592"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:39.586196" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:39.585910" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:39.586724" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:39.586438" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:39.595262" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:39.595323" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:39 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:39 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782419,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:39.595419" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:39.589028" elapsed="0.006417"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:39.586901" elapsed="0.008588"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:39.595709" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:39.595519" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:39.586877" elapsed="0.008958"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:39.601493" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782419,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:39.597523" elapsed="0.004063"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:39.597176" elapsed="0.004462"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:39.597151" elapsed="0.004521"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:39.605129" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:39.602064" elapsed="0.003113"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:39.601751" elapsed="0.003460"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:39.601727" elapsed="0.003508"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:39.605847" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:39.605418" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:39.606183" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:39.605945" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:39.606906" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:39.606427" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:39.606264" elapsed="0.000706"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:39.605927" elapsed="0.001064"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:39.607511" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:39.607151" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:39.607859" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:39.607625" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:39.608613" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:39.608183" elapsed="0.000457"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:39.608020" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:39.607607" elapsed="0.001091"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:39.608853" elapsed="0.000487"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:39.609960" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:39.609506" elapsed="0.000481"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:39.610142" elapsed="0.008690"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:39.596580" elapsed="0.022354"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:39.619125" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:53:39.619008" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:39.618990" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:39.619371" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:39.619442" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:39.621780" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782419,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:39.579028" elapsed="0.042781"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:39.621861" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:39.622010" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782419,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:39.576063" elapsed="0.045973"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:39.623293" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782419, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:39.622872" elapsed="0.000449"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:39.623370" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:39.623522" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782419, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:39.622258" elapsed="0.001305"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:39.623924" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:39.623743" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:39.624424" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:39.624124" elapsed="0.000327"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:39.624905" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:39.624639" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:39.625452" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:39.625103" elapsed="0.000419">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:39.567719" elapsed="0.057929">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:40.637162" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:40.636570" elapsed="0.000641"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:40.637296" elapsed="0.000059"/>
</return>
<msg time="2026-04-10T00:53:40.637565" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:40.635964" elapsed="0.001653"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:40.644517" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:40.644253" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:40.645081" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:40.644822" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:40.655012" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:40.655099" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:40 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:40 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782420,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:40.655252" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:40.647367" elapsed="0.007925"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:40.645244" elapsed="0.010112"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:40.655665" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:40.655399" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:40.645222" elapsed="0.010576"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:40.661700" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782420,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:40.657683" elapsed="0.004091"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:40.657318" elapsed="0.004508"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:40.657289" elapsed="0.004572"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:40.666104" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:40.662276" elapsed="0.003878"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:40.661946" elapsed="0.004244"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:40.661921" elapsed="0.004293"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:40.666842" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:40.666406" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:40.667256" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:40.666943" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:40.667957" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:40.667516" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:40.667341" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:40.666925" elapsed="0.001118"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:40.668601" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:40.668203" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:40.668943" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:40.668701" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:40.669663" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:40.669221" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:40.669025" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:40.668683" elapsed="0.001066"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:40.669904" elapsed="0.000495"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:40.671037" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:40.670594" elapsed="0.000471"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:40.671224" elapsed="0.009121"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:40.656621" elapsed="0.023818"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:40.680786" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:53:40.680650" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:40.680620" elapsed="0.000269"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:40.681078" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:40.681155" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:53:40.683805" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782420,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:40.638019" elapsed="0.045817"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:40.683890" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:40.684045" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782420,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:40.635189" elapsed="0.048882"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:40.685595" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782420, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:40.685085" elapsed="0.000540"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:40.685675" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:40.685832" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782420, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:40.684322" elapsed="0.001717"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:40.686400" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:40.686220" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:40.687078" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:40.686620" elapsed="0.000486"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:40.687535" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:40.687278" elapsed="0.000298"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:40.688096" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:40.687748" elapsed="0.000420">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:40.626523" elapsed="0.061756">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:41.698386" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:41.697873" elapsed="0.000559"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:41.698514" elapsed="0.000076"/>
</return>
<msg time="2026-04-10T00:53:41.698777" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:41.697291" elapsed="0.001523"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:41.706180" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:41.705884" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:41.706654" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:41.706391" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:41.714053" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:41.714113" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:41 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:41 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782421,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:41.714209" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:41.708922" elapsed="0.005313"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:41.706776" elapsed="0.007564"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:41.714529" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:41.714371" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:41.706754" elapsed="0.007886"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:41.719875" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782421,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:41.715952" elapsed="0.003996"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:41.715647" elapsed="0.004353"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:41.715629" elapsed="0.004408"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:41.724246" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:41.720451" elapsed="0.003843"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:41.720121" elapsed="0.004209"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:41.720096" elapsed="0.004257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:41.724950" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:41.724538" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:41.725283" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:41.725047" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:41.725960" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:41.725527" elapsed="0.000459"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:41.725365" elapsed="0.000657"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:41.725029" elapsed="0.001014"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:41.726588" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:41.726204" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:41.726920" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:41.726687" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:41.727603" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:41.727161" elapsed="0.000470"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:41.727001" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:41.726669" elapsed="0.001018"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:41.727845" elapsed="0.000485"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:41.728949" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:41.728496" elapsed="0.000480"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:41.729134" elapsed="0.008406"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:41.715159" elapsed="0.022482"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:41.737844" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:53:41.737726" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:41.737706" elapsed="0.000229"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:41.738088" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:41.738159" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:41.740849" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782421,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:41.699418" elapsed="0.041460"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:41.740931" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:41.741083" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782421,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:41.696586" elapsed="0.044523"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:41.742142" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782421, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:41.741745" elapsed="0.000425"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:41.742218" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:41.742372" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782421, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:41.741382" elapsed="0.001022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:41.743043" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:41.742858" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:41.743588" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:41.743245" elapsed="0.000371"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:41.744049" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:41.743788" elapsed="0.000286"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:41.744607" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:41.744244" elapsed="0.000436">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:41.689014" elapsed="0.055780">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:42.756477" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:42.756118" elapsed="0.000391"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:42.756583" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:53:42.756751" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:42.755751" elapsed="0.001025"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:42.763639" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:42.763361" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:42.764089" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:42.763845" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:42.770926" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:42.770987" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:42 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:42 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782422,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:42.771085" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:42.766383" elapsed="0.004730"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:42.764206" elapsed="0.006952"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:42.771344" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:42.771186" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:42.764186" elapsed="0.007259"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:42.775587" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782422,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:42.772709" elapsed="0.002933"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:42.772444" elapsed="0.003235"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:42.772425" elapsed="0.003285"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:42.778894" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:42.776026" elapsed="0.002916"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:42.775796" elapsed="0.003183"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:42.775777" elapsed="0.003226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:42.779621" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:42.779185" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:42.780030" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:42.779785" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:42.780713" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:42.780278" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:42.780114" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:42.779766" elapsed="0.001033"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:42.781327" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:42.780961" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:42.781695" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:42.781425" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:42.782344" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:42.781939" elapsed="0.000432"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:42.781779" elapsed="0.000629"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:42.781407" elapsed="0.001022"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:42.782599" elapsed="0.000490"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:42.783719" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:42.783257" elapsed="0.000490"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:42.783902" elapsed="0.008655"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:42.772004" elapsed="0.020621"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:42.792804" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:53:42.792696" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:42.792678" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:42.793044" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:42.793115" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:42.795469" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782422,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:42.757125" elapsed="0.038373"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:42.795592" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:42.795747" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782422,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:42.755252" elapsed="0.040521"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:42.796860" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782422, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:42.796336" elapsed="0.000552"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:42.796935" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:42.797089" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782422, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:42.795996" elapsed="0.001120"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:42.797477" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:42.797296" elapsed="0.000241"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:42.798035" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:42.797731" elapsed="0.000330"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:42.798495" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:42.798233" elapsed="0.000287"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:42.799166" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:42.798799" elapsed="0.000440">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:42.745830" elapsed="0.053524">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:43.813867" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:43.813067" elapsed="0.000848"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:43.814002" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T00:53:43.814242" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:43.812189" elapsed="0.002090"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:43.823360" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:43.823090" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:43.823875" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:43.823620" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:43.830845" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:43.830908" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:43 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782423,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:43.831007" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:43.826130" elapsed="0.004904"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:43.823998" elapsed="0.007091"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:43.831281" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:43.831123" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:43.823976" elapsed="0.007395"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:43.835306" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782423,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:43.832640" elapsed="0.002717"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:43.832392" elapsed="0.003004"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:43.832374" elapsed="0.003054"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:43.839409" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:43.835784" elapsed="0.003742"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:43.835534" elapsed="0.004094"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:43.835516" elapsed="0.004147"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:43.840456" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:43.839916" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:43.840955" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:43.840615" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:43.841908" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:43.841298" elapsed="0.000657"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:43.841072" elapsed="0.000937"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:43.840589" elapsed="0.001450"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:43.842794" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:43.842263" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:43.843279" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:43.842936" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:43.844163" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:43.843713" elapsed="0.000567"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:43.843396" elapsed="0.000924"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:43.842912" elapsed="0.001430"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:43.844503" elapsed="0.000520"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:43.845666" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:43.845201" elapsed="0.000492"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:43.845852" elapsed="0.009056"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:43.831958" elapsed="0.023021"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:43.855167" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:53:43.855054" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:43.855034" elapsed="0.000229"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:43.855419" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:43.855516" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:53:43.857881" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782423,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:43.814790" elapsed="0.043120"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:43.857965" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:43.858119" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782423,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:43.811046" elapsed="0.047100"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:43.859153" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782423, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:43.858750" elapsed="0.000432"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:43.859230" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:43.859388" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782423, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:43.858376" elapsed="0.001039"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:43.860097" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:43.859908" elapsed="0.000215"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:43.860631" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:43.860305" elapsed="0.000354"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:43.861095" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:43.860832" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:43.861663" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:43.861293" elapsed="0.000444">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:43.800303" elapsed="0.061547">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:44.872709" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:44.872203" elapsed="0.000548"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:44.872826" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:53:44.873052" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:44.871702" elapsed="0.001386"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:44.880388" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:44.880128" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:44.880949" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:44.880690" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:44.889821" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:44.889879" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:44 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782424,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:44.889972" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:44.884983" elapsed="0.005016"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:44.881084" elapsed="0.008958"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:44.890225" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:44.890070" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:44.881063" elapsed="0.009249"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:44.894317" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782424,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:44.891501" elapsed="0.002884"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:44.891279" elapsed="0.003155"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:44.891261" elapsed="0.003207"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:44.898671" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:44.894886" elapsed="0.003859"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:44.894571" elapsed="0.004222"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:44.894522" elapsed="0.004304"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:44.899624" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:44.899067" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:44.900096" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:44.899760" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:44.901029" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:44.900431" elapsed="0.000635"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:44.900209" elapsed="0.000906"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:44.899735" elapsed="0.001409"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:44.901918" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:44.901412" elapsed="0.000533"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:44.902249" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:44.902015" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:44.902926" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:44.902489" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:44.902330" elapsed="0.000659"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:44.901998" elapsed="0.001013"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:44.903164" elapsed="0.000501"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:44.904261" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:44.903833" elapsed="0.000454"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:44.904442" elapsed="0.008597"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:44.890855" elapsed="0.022248"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:44.913278" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:53:44.913174" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:44.913156" 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-04-10T00:53:44.913627" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:44.913698" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:44.916018" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782424,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:44.873774" elapsed="0.042272"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:44.916098" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:53:44.916248" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782424,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:44.871014" elapsed="0.045260"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:44.917376" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782424, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:44.916981" elapsed="0.000454"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:44.917484" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:53:44.917666" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782424, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:44.916492" elapsed="0.001200"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:44.918049" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:44.917868" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:44.918560" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:44.918248" elapsed="0.000339"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:44.919149" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:44.918759" elapsed="0.000414"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:44.919703" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:44.919342" elapsed="0.000432">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:44.862811" elapsed="0.057073">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:45.932908" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:45.932508" elapsed="0.000433"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:45.933003" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:53:45.933176" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:45.932142" elapsed="0.001059"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:45.940411" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:45.940147" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:45.940878" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:45.940634" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:45.947463" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:45.947524" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782425,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:45.947658" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:45.943091" elapsed="0.004596"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:45.940997" elapsed="0.006735"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:45.948048" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:45.947819" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:45.940976" elapsed="0.007205"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:45.954028" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782425,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:45.950022" elapsed="0.004081"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:45.949677" elapsed="0.004479"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:45.949650" elapsed="0.004542"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:45.957706" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:45.954637" elapsed="0.003118"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:45.954277" elapsed="0.003514"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:45.954250" elapsed="0.003566"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:45.958408" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:45.958005" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:45.958767" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:45.958507" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:45.959476" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:45.959016" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:45.958851" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:45.958489" elapsed="0.001101"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:45.960130" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:45.959759" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:45.960464" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:45.960227" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:45.961216" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:45.960793" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:45.960570" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:45.960210" elapsed="0.001091"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:45.961456" elapsed="0.000515"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:45.962597" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:45.962142" elapsed="0.000482"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:45.962786" elapsed="0.008610"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:45.949002" elapsed="0.022466"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:45.971689" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:53:45.971563" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:45.971524" 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-04-10T00:53:45.971946" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:45.972017" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:45.974584" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782425,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:45.933569" elapsed="0.041046"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:45.974670" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:45.974825" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782425,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:45.931346" elapsed="0.043505"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:45.976045" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782425, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:45.975623" elapsed="0.000451"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:45.976123" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:45.976281" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782425, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:45.975096" elapsed="0.001212"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:45.976964" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:45.976487" elapsed="0.000503"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:45.977479" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:45.977169" elapsed="0.000337"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:45.977967" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:45.977697" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:45.978515" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:45.978163" elapsed="0.000444">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:45.920780" elapsed="0.057943">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:46.988753" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:46.988178" elapsed="0.000621"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:46.988939" elapsed="0.000063"/>
</return>
<msg time="2026-04-10T00:53:46.989192" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:46.987630" elapsed="0.001598"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:46.997529" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:46.997260" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:46.998008" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:46.997756" elapsed="0.000474"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:47.005713" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:47.005825" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:47 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:47 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782427,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:47.005995" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:47.000420" elapsed="0.005616"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:46.998306" elapsed="0.007794"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:47.006372" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:47.006142" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:46.998285" elapsed="0.008212"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:47.014919" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782427,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:47.008376" elapsed="0.006631"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:47.007964" elapsed="0.007103"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:47.007929" elapsed="0.007184"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:47.019594" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:47.015646" elapsed="0.004006"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:47.015217" elapsed="0.004479"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:47.015187" elapsed="0.004539"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:47.020496" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:47.019966" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:47.021078" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:47.020737" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:47.021922" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:47.021389" elapsed="0.000567"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:47.021179" elapsed="0.000821"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:47.020711" elapsed="0.001315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:47.022633" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:47.022231" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:47.023073" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:47.022752" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:47.023909" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:47.023412" elapsed="0.000526"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:47.023195" elapsed="0.000781"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:47.022728" elapsed="0.001271"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:47.024159" elapsed="0.000536"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:47.025387" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:47.024869" elapsed="0.000547"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:47.025595" elapsed="0.008750"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:47.007285" elapsed="0.027134"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:47.034627" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:53:47.034496" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:47.034475" 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-04-10T00:53:47.034881" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:47.034958" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:47.037612" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782427,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:46.989775" elapsed="0.047867"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:47.037696" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:47.037849" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782427,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:46.986926" elapsed="0.050949"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:47.038938" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782427, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:47.038497" elapsed="0.000470"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:47.039015" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:47.039171" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782427, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:47.038122" elapsed="0.001075"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:47.039580" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:47.039380" elapsed="0.000227"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:47.040097" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:47.039787" elapsed="0.000338"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:47.040826" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:47.040300" elapsed="0.000553"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:47.041486" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:47.041049" elapsed="0.000528">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:46.979473" elapsed="0.062219">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.051530" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:48.051129" elapsed="0.000452"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:48.051647" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:53:48.051829" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:48.050437" elapsed="0.001417"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.058905" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:48.058620" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.059369" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:48.059119" 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-04-10T00:53:48.066181" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:48.066246" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:48 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:48 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782428,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:48.066357" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:48.061622" elapsed="0.004762"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:48.059493" elapsed="0.006936"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.066696" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.066459" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.059470" elapsed="0.007318"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.072917" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782428,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:48.068769" elapsed="0.004237"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:48.068343" elapsed="0.004722"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.068313" elapsed="0.004794"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.076681" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:48.073634" elapsed="0.003096"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:48.073205" elapsed="0.003561"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.073176" elapsed="0.003614"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.077406" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:48.076986" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.077780" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.077504" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.078462" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:48.078032" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:48.077862" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.077485" elapsed="0.001134"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.079160" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:48.078786" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.079562" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.079267" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.080223" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:48.079810" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:48.079647" elapsed="0.000714"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.079249" elapsed="0.001133"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:48.080561" elapsed="0.000500"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:48.081715" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:48.081230" elapsed="0.000512"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:48.081903" elapsed="0.009336"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:48.067630" elapsed="0.023688"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:48.091517" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-10T00:53:48.091399" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.091378" 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-04-10T00:53:48.091799" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.091871" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:48.094267" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782428,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:48.052214" elapsed="0.042089"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:48.094357" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:48.094516" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782428,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:48.049454" elapsed="0.045319"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.095853" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782428, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:48.095412" elapsed="0.000470"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:48.095930" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:48.096088" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782428, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:48.095032" elapsed="0.001083"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:48.096478" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:48.096293" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.097030" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:48.096697" elapsed="0.000358"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.097493" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:48.097227" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:53:48.097731" elapsed="0.000316"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:53:48.042449" elapsed="0.055660"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:53:32.156107" elapsed="15.942056"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:32.155708" elapsed="15.942521"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:32.151030" elapsed="15.947243"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:32.150900" elapsed="15.947418"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.110003" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:48.109692" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:48.110084" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:53:48.110275" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:48.109319" elapsed="0.001055"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.117321" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:48.117051" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.117799" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:48.117530" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:48.124026" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:48.124110" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:48 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:48 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782428,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:48.124251" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:48.120092" elapsed="0.004199"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:48.117918" elapsed="0.006437"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.124660" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.124396" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.117897" elapsed="0.006895"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.130456" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782428,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:48.126363" elapsed="0.004166"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:48.126010" elapsed="0.004624"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.125983" elapsed="0.004702"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.135114" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:48.131143" elapsed="0.004020"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:48.130778" elapsed="0.004420"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.130752" elapsed="0.004470"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.135940" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:48.135413" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.136336" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.136051" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.137015" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:48.136666" elapsed="0.000376"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:48.136438" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.136031" elapsed="0.001067"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.137663" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:48.137259" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.138000" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.137762" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.138579" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:48.138245" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:48.138081" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.137743" elapsed="0.000947"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:48.138851" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:48.139708" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:48.139374" elapsed="0.000361"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:48.139896" elapsed="0.002632"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:48.125353" elapsed="0.017376"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:48.142923" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:53:48.142806" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.142786" elapsed="0.000234"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.143177" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.143249" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:48.145635" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782428,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:48.110832" elapsed="0.034833"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:48.145719" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:48.145875" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782428,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:48.108849" elapsed="0.037052"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:53:48.145949" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:53:48.146095" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782428,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 1. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:53:48.104197" elapsed="0.041924"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.147208" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782428, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:48.146796" elapsed="0.000440"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:48.147284" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:48.147440" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782428, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:48.146395" elapsed="0.001070"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:48.147848" level="INFO">${value} = 10000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:48.147665" elapsed="0.000209"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.148345" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:53:48.148056" elapsed="0.000361"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 10000.</doc>
<status status="PASS" start="2026-04-10T00:53:48.103744" elapsed="0.044735"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:48.098529" elapsed="0.049985"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:48.098381" elapsed="0.050190"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:53:32.087474" elapsed="16.061169"/>
</kw>
<arg>${operation_timeout}</arg>
<arg>2s</arg>
<arg>BulkomaticKeywords.Get Bulk Flow And Verify Count In Cluster</arg>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:53:32.076617" elapsed="16.072085"/>
</kw>
<doc>10000 Flows preserved in all controller instances.</doc>
<status status="PASS" start="2026-04-10T00:53:31.618965" elapsed="16.529875"/>
</test>
<test id="s1-s2-t27" name="Verify Flows In Switch After Follower Restart" line="231">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:53:48.153115" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:53:48.152838" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.154426" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.154311" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.154288" elapsed="0.000211"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.160815" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.160704" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.160685" elapsed="0.000202"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.161954" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:48.161528" elapsed="0.000513"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.162565" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:48.162215" elapsed="0.000380"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:48.162641" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:53:48.162845" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:48.161127" elapsed="0.001743"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.168623" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.168488" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.168469" 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-04-10T00:53:48.169920" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.169812" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.169794" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:48.170469" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:48.170143" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.170967" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:48.170715" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.204337" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:48.171499" elapsed="0.033031"/>
</kw>
<msg time="2026-04-10T00:53:48.204826" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:48.204893" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.171156" elapsed="0.033791"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.282503" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:48.205813" elapsed="0.077197"/>
</kw>
<msg time="2026-04-10T00:53:48.283426" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:48.283533" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.205232" elapsed="0.078435"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.284333" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.283874" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.283819" elapsed="0.000637"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.285212" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:48.284695" elapsed="0.000661"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.285885" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.285457" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.285431" elapsed="0.000587"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:48.286073" elapsed="0.000104"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:48.290155" elapsed="0.000250"/>
</kw>
<msg time="2026-04-10T00:53:48.290502" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:48.288578" elapsed="0.002147"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.291637" elapsed="0.000116"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.292075" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:48.287515" elapsed="0.004756"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:48.286643" elapsed="0.005695"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:48.169467" elapsed="0.122972"/>
</kw>
<msg time="2026-04-10T00:53:48.292542" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:48.292610" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.168853" elapsed="0.123800"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:48.292887" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:53:48.292757" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.292733" 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-04-10T00:53:48.293426" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.293792" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.293868" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:48.168138" elapsed="0.125842"/>
</kw>
<msg time="2026-04-10T00:53:48.294076" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:48.294122" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.163264" elapsed="0.130897"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.294507" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.294238" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.294219" elapsed="0.000385"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:48.163116" elapsed="0.131513"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.300644" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.300510" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.300490" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.301906" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.301795" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.301777" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:48.302463" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:48.302130" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.302943" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:48.302674" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.340045" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:48.303474" elapsed="0.036780"/>
</kw>
<msg time="2026-04-10T00:53:48.340480" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:48.340530" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.303131" elapsed="0.037465"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.419182" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:48.341284" elapsed="0.078243"/>
</kw>
<msg time="2026-04-10T00:53:48.419779" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:48.419828" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.340846" elapsed="0.079021"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.420304" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.419984" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.419950" elapsed="0.000441"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.420929" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:48.420540" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.421325" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.421098" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.421078" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:48.421442" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:48.424057" elapsed="0.000164"/>
</kw>
<msg time="2026-04-10T00:53:48.424282" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:48.423008" elapsed="0.001406"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.424708" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.425041" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:48.422347" elapsed="0.002879"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:48.421774" elapsed="0.003516"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:48.301464" elapsed="0.123925"/>
</kw>
<msg time="2026-04-10T00:53:48.425487" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:48.425533" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.300874" elapsed="0.124716"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:48.426018" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:53:48.425670" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.425652" elapsed="0.000455"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.426512" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.426875" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.426948" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:48.300114" elapsed="0.126964"/>
</kw>
<msg time="2026-04-10T00:53:48.427177" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:48.427221" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.294944" elapsed="0.132315"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.427605" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.427333" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.427316" elapsed="0.000367"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:48.294765" elapsed="0.132941"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.433394" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.433284" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.433266" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.434644" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.434511" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.434494" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:48.435186" level="INFO">${karaf_connection_index} = 212</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:48.434863" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.435621" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:48.435374" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.491467" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:48.436151" elapsed="0.055608"/>
</kw>
<msg time="2026-04-10T00:53:48.492013" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:48.492063" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.435809" elapsed="0.056292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.611204" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:48.492890" elapsed="0.118575"/>
</kw>
<msg time="2026-04-10T00:53:48.611720" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:48.611771" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.492368" elapsed="0.119442"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.612292" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.611948" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.611909" elapsed="0.000470"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.612927" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:48.612529" elapsed="0.000497"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.613322" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.613099" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.613080" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:48.613438" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:48.616103" elapsed="0.000165"/>
</kw>
<msg time="2026-04-10T00:53:48.616329" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:48.615014" elapsed="0.001453"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.616921" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.617279" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:48.614340" elapsed="0.003127"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:48.613766" elapsed="0.003767"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:48.434205" elapsed="0.183446"/>
</kw>
<msg time="2026-04-10T00:53:48.617750" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:48.617797" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.433634" elapsed="0.184284"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:48.618112" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-04-10T00:53:48.618002" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.617983" 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 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.618916" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.619263" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.619336" elapsed="0.000044"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:48.432885" elapsed="0.186591"/>
</kw>
<msg time="2026-04-10T00:53:48.619774" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:48.619826" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.427982" elapsed="0.191883"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.620201" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.619945" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.619928" elapsed="0.000351"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:48.427837" elapsed="0.192466"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:48.162932" elapsed="0.457404"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:53:48.160314" elapsed="0.460082"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:53:48.154002" elapsed="0.466453"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.153538" elapsed="0.466965"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:53:48.150253" elapsed="0.470322"/>
</kw>
<kw name="Verify Aggregate Flow From Mininet Session" owner="MininetKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:48.622452" elapsed="0.000169"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:48.622232" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.622214" elapsed="0.000467"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.623109" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:48.622851" elapsed="0.000284"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:48.624020" elapsed="0.000148"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:48.623804" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.623788" elapsed="0.000439"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.628443" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:48.624366" elapsed="0.004133"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.650163" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<msg time="2026-04-10T00:53:48.650270" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:53:48.628673" elapsed="0.021624"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:53:48.650350" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:53:48.650516" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=10000
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 202 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:53:48.623491" elapsed="0.027065"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:53:48.650984" level="INFO">${flows} = ['10000']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:53:48.650729" elapsed="0.000281"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.651613" level="INFO">${total_flows} = 10000</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:48.651172" elapsed="0.000532"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.652202" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-04-10T00:53:48.651904" elapsed="0.000358"/>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="PASS" start="2026-04-10T00:53:48.621928" elapsed="0.030392"/>
</kw>
<arg>${time_out}</arg>
<arg>2s</arg>
<arg>MininetKeywords.Check Flows In Mininet</arg>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:53:48.621282" elapsed="0.031087"/>
</kw>
<arg>${mininet_conn_id}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${operation_timeout}</arg>
<doc>Verify flow count per switch</doc>
<status status="PASS" start="2026-04-10T00:53:48.620792" elapsed="0.031638"/>
</kw>
<doc>Verify flows are installed in switch after cluster restart.</doc>
<status status="PASS" start="2026-04-10T00:53:48.149309" elapsed="0.503261"/>
</test>
<test id="s1-s2-t28" name="Stop Mininet Connected To Follower Node" line="238">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:53:48.656446" elapsed="0.000231"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:53:48.656178" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.657749" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.657634" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.657614" elapsed="0.000205"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.662960" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.662854" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.662836" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.664055" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:48.663667" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.664582" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:48.664246" elapsed="0.000364"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:48.664656" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:53:48.664818" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:48.663257" elapsed="0.001585"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.670406" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.670299" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.670281" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.671697" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.671586" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.671567" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:48.672215" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:48.671912" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.672660" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:48.672405" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.705572" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:48.673182" elapsed="0.032597"/>
</kw>
<msg time="2026-04-10T00:53:48.706046" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:48.706195" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.672847" elapsed="0.033416"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.776502" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:48.707327" elapsed="0.069527"/>
</kw>
<msg time="2026-04-10T00:53:48.777267" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:48.777339" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.706697" elapsed="0.070698"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.778012" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.777578" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.777506" elapsed="0.000630"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.778897" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:48.778343" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.779446" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.779133" elapsed="0.000393"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.779107" elapsed="0.000509"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:48.779674" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:48.782678" elapsed="0.000164"/>
</kw>
<msg time="2026-04-10T00:53:48.782905" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:48.781481" elapsed="0.001702"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.783460" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.784043" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:48.780675" elapsed="0.003564"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:48.780069" elapsed="0.004236"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:48.671237" elapsed="0.113171"/>
</kw>
<msg time="2026-04-10T00:53:48.784506" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:48.784567" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.670639" elapsed="0.113968"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:48.784797" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:48.784687" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.784668" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.785292" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.785650" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.785724" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:48.669964" elapsed="0.115869"/>
</kw>
<msg time="2026-04-10T00:53:48.785928" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:48.785973" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.665226" elapsed="0.120786"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.786340" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.786088" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.786071" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:48.665079" elapsed="0.121362"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.792075" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.791966" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.791948" elapsed="0.000238"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.793341" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.793233" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.793215" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:48.793873" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:48.793570" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.794304" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:48.794076" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.832165" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:48.794904" elapsed="0.037448"/>
</kw>
<msg time="2026-04-10T00:53:48.832592" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:48.832645" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.794490" elapsed="0.038194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.921027" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:48.833366" elapsed="0.087929"/>
</kw>
<msg time="2026-04-10T00:53:48.921522" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:48.921597" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.832938" elapsed="0.088700"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.922086" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.921761" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.921725" elapsed="0.000448"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:48.922724" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:48.922322" elapsed="0.000501"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.923117" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.922891" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.922873" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:48.923235" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:48.925844" elapsed="0.000165"/>
</kw>
<msg time="2026-04-10T00:53:48.926070" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:48.924834" elapsed="0.001370"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.926480" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.926831" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:48.924176" elapsed="0.002841"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:48.923581" elapsed="0.003500"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:48.792929" elapsed="0.134250"/>
</kw>
<msg time="2026-04-10T00:53:48.927276" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:48.927320" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.792344" elapsed="0.135014"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:48.927630" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:48.927496" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.927477" elapsed="0.000238"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.928148" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.928488" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.928580" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:48.791621" elapsed="0.137069"/>
</kw>
<msg time="2026-04-10T00:53:48.928785" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:48.928829" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.786743" elapsed="0.142122"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:48.929212" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:48.928941" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.928923" elapsed="0.000366"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:48.786597" elapsed="0.142716"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.934984" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.934874" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.934856" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:48.936224" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:48.936118" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:48.936100" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:48.936765" level="INFO">${karaf_connection_index} = 212</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:48.936438" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.937178" level="INFO">${current_connection_index} = 202</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:48.936952" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:48.975758" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:48.937719" elapsed="0.038281"/>
</kw>
<msg time="2026-04-10T00:53:48.976209" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:48.976256" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.937363" elapsed="0.038930"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:49.068918" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:48.976938" elapsed="0.092599"/>
</kw>
<msg time="2026-04-10T00:53:49.069798" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:49.069848" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.976508" elapsed="0.093380"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:49.070336" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:49.070002" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:49.069966" elapsed="0.000460"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:49.070990" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:49.070594" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:49.071438" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:49.071214" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:49.071196" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:49.071572" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:49.074205" elapsed="0.000183"/>
</kw>
<msg time="2026-04-10T00:53:49.074455" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:49.073172" elapsed="0.001440"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:49.074895" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:49.075276" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:49.072515" elapsed="0.002950"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:49.071894" elapsed="0.003638"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:48.935789" elapsed="0.139858"/>
</kw>
<msg time="2026-04-10T00:53:49.075744" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:49.075787" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.935210" elapsed="0.140614"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:49.076060" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:53:49.075903" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:49.075883" elapsed="0.000273"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:49.076589" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:49.076937" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:49.077013" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:48.934515" elapsed="0.142607"/>
</kw>
<msg time="2026-04-10T00:53:49.077217" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:49.077262" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.929649" elapsed="0.147650"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:49.077663" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:49.077375" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:49.077358" elapsed="0.000385"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:48.929445" elapsed="0.148321"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:48.664901" elapsed="0.412901"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:53:48.662485" elapsed="0.415377"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:53:48.657325" elapsed="0.420596"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:48.656886" elapsed="0.421083"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:53:48.653434" elapsed="0.424593"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:49.083251" elapsed="0.000156"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:49.083026" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:49.083009" elapsed="0.000458"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:49.086129" level="INFO">exit</msg>
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:49.083647" elapsed="0.002539"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:53:49.188315" level="INFO">*** Stopping 1 controllers
c0 
*** Stopping 1 links
.
*** Stopping 1 switches
s1 
*** Stopping 1 hosts
h1 
*** Done
completed in 69.795 seconds
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:53:49.086427" elapsed="0.102047"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:49.188771" elapsed="0.000220"/>
</kw>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="PASS" start="2026-04-10T00:53:49.082743" elapsed="0.106320"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:49.191909" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:49.191584" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:49.191557" elapsed="0.000439"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:49.192339" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:49.192152" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:49.193055" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:49.192664" elapsed="0.000437"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:49.195818" level="INFO">${conn_id} = 213</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:49.193263" elapsed="0.002584"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:53:49.196856" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:53:49.196934" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:53:49.196540" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:49.197128" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:53:49.198390" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:53:49.779718" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:53:49 UTC 2026

  System load:  0.02               Processes:             108
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:52:39 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:53:49.198032" elapsed="0.581846"/>
</kw>
<msg time="2026-04-10T00:53:49.779965" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:49.197669" elapsed="0.582377"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:53:49.196078" elapsed="0.584083"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:53:49.780689" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:53:50.999771" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:53:51.000118" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:53:51.000225" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:53:49.780419" elapsed="1.219866"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:51.000801" elapsed="0.000512"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.002401" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.001770" elapsed="0.000891"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.003180" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:51.002875" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.002828" elapsed="0.000511"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:53:51.003727" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-04-10T00:53:51.003456" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.003423" elapsed="0.000497"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.003996" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:51.066715" elapsed="0.000438"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:51.067342" elapsed="0.000187"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:51.067709" elapsed="0.000105"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:51.004925" elapsed="0.062948"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:53:49.191004" elapsed="1.876969"/>
</kw>
<msg time="2026-04-10T00:53:51.068039" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:49.190310" elapsed="1.877794"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:53:49.189763" elapsed="1.878424"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.070415" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.070110" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.070086" elapsed="0.000413"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:51.070862" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:53:51.070670" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.071574" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.071161" elapsed="0.000467"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:51.072167" level="INFO">${conn_id} = 215</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:51.071789" elapsed="0.000404"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.073116" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:53:51.073194" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:53:51.072833" elapsed="0.000385"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:51.073379" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:53:51.074590" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:53:51.407979" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:53:49 UTC 2026

  System load:  0.02               Processes:             108
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:53:49 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:53:51.074250" elapsed="0.333877"/>
</kw>
<msg time="2026-04-10T00:53:51.408320" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:51.073888" elapsed="0.334513"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:53:51.072414" elapsed="0.336098"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:53:51.409035" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:53:51.441793" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:53:51.442085" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:53:51.442182" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:53:51.408778" elapsed="0.033455"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:51.442686" elapsed="0.000477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.444269" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.443659" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.444852" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:51.444531" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.444484" elapsed="0.000528"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:53:51.445358" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-04-10T00:53:51.445130" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.445095" elapsed="0.000478"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.445655" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:51.450700" elapsed="0.000475"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:51.451450" elapsed="0.000254"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:51.451927" 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-04-10T00:53:51.446348" elapsed="0.005798"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:53:51.069565" elapsed="0.382715"/>
</kw>
<msg time="2026-04-10T00:53:51.452360" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:51.068948" elapsed="0.383485"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:53:51.068403" elapsed="0.384165"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:49.189317" elapsed="2.263340"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="PASS" start="2026-04-10T00:53:48.652869" elapsed="2.799941"/>
</test>
<test id="s1-s2-t29" name="Delete All Flows From Follower Node" line="243">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:53:51.457407" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:53:51.457139" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.458718" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:51.458601" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.458581" elapsed="0.000206"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.464166" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:51.464048" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.464028" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.465379" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:51.464955" elapsed="0.000453"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.465901" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:51.465586" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:51.465973" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:53:51.466140" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:51.464527" elapsed="0.001638"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.472229" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:51.472105" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.472083" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.473538" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:51.473429" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.473411" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:51.474107" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:51.473789" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:51.474522" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:51.474300" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:51.505791" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:51.475084" elapsed="0.030874"/>
</kw>
<msg time="2026-04-10T00:53:51.506169" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:51.506217" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:51.474733" elapsed="0.031521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:51.572884" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:51.506926" elapsed="0.066201"/>
</kw>
<msg time="2026-04-10T00:53:51.573349" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:51.573399" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:51.506484" elapsed="0.066954"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.573894" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.573575" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.573522" elapsed="0.000461"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.574511" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.574132" elapsed="0.000492"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.574921" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.574695" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.574676" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:51.575040" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:51.576663" elapsed="0.000783"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:51.577747" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:51.578483" elapsed="0.000381"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:51.575988" elapsed="0.002976"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:51.575370" elapsed="0.003661"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:51.473123" elapsed="0.106008"/>
</kw>
<msg time="2026-04-10T00:53:51.579228" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:51.579273" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:51.472469" elapsed="0.106842"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:51.579620" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:53:51.579453" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.579434" 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-04-10T00:53:51.580122" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.580471" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.580560" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:51.471720" elapsed="0.108958"/>
</kw>
<msg time="2026-04-10T00:53:51.580779" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:51.580822" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:51.466657" elapsed="0.114203"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.581190" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.580937" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.580920" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:51.466490" elapsed="0.114800"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.587172" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:51.587061" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.587041" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.588454" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:51.588346" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.588329" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:51.588997" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:51.588690" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:51.589403" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:51.589184" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:51.621202" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:51.589952" elapsed="0.031488"/>
</kw>
<msg time="2026-04-10T00:53:51.621707" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:51.621757" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:51.589609" elapsed="0.032187"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:51.688939" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:51.622530" elapsed="0.066718"/>
</kw>
<msg time="2026-04-10T00:53:51.689518" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:51.689609" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:51.622061" elapsed="0.067598"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.690197" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.689798" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.689760" elapsed="0.000542"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.690983" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.690497" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.691569" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.691269" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.691246" elapsed="0.000454"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:51.691749" elapsed="0.000049"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:51.693699" elapsed="0.000967"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:51.695023" elapsed="0.000592"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:51.696022" elapsed="0.000433"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:51.692889" elapsed="0.003713"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:51.692153" elapsed="0.004534"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:51.588040" elapsed="0.108781"/>
</kw>
<msg time="2026-04-10T00:53:51.696950" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:51.697009" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:51.587402" elapsed="0.109656"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:51.697327" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T00:53:51.697175" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.697146" elapsed="0.000308"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.698031" elapsed="0.000036"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.698473" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.698594" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:51.586699" elapsed="0.112038"/>
</kw>
<msg time="2026-04-10T00:53:51.698859" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:51.698916" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:51.581584" elapsed="0.117380"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.699398" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.699063" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.699041" elapsed="0.000456"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:51.581425" elapsed="0.118103"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.707318" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:51.707179" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.707154" elapsed="0.000255"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.708768" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:51.708660" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.708643" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:51.709302" level="INFO">${karaf_connection_index} = 212</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:51.708985" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:51.709740" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:51.709495" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:51.745781" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:51.710267" elapsed="0.035619"/>
</kw>
<msg time="2026-04-10T00:53:51.746153" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:51.746201" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:51.709929" elapsed="0.036311"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:51.822822" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:51.746782" elapsed="0.076205"/>
</kw>
<msg time="2026-04-10T00:53:51.823181" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:51.823236" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:51.746415" elapsed="0.076868"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.823699" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.823382" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.823356" elapsed="0.000482"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.824418" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.824035" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.824922" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.824643" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.824620" elapsed="0.000402"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:51.825064" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:51.826956" elapsed="0.001052"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:51.828373" elapsed="0.000612"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:51.829324" elapsed="0.000463"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:51.826155" elapsed="0.003762"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:51.825436" elapsed="0.004565"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:51.708325" elapsed="0.121816"/>
</kw>
<msg time="2026-04-10T00:53:51.830267" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:51.830327" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:51.707624" elapsed="0.122754"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:51.830666" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T00:53:51.830497" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.830468" elapsed="0.000327"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.831599" elapsed="0.000036"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.832074" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.832167" 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-04-10T00:53:51.706624" elapsed="0.125684"/>
</kw>
<msg time="2026-04-10T00:53:51.832430" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:51.832486" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:51.699934" elapsed="0.132600"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.833084" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.832735" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.832711" elapsed="0.000468"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:51.699742" elapsed="0.133654"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:51.466305" elapsed="0.367134"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:53:51.463642" elapsed="0.369873"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:53:51.458289" elapsed="0.375337"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:51.457852" elapsed="0.375834"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:53:51.453986" elapsed="0.379772"/>
</kw>
<kw name="Delete Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Delete Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.849393" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:51.848936" elapsed="0.000498"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:51.849504" elapsed="0.000070"/>
</return>
<msg time="2026-04-10T00:53:51.849731" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:51.848443" elapsed="0.001320"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.866560" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.866234" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.867037" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.866796" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.867483" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.867241" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.867989" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.867702" elapsed="0.000331"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:51.868862" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:53:51.868657" elapsed="0.000231"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:53:51.869211" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:53:51.869041" elapsed="0.000196"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:53:51.869388" elapsed="0.000218"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.870010" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.869763" elapsed="0.000292"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:53:51.870101" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:53:51.870271" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:53:51.868234" elapsed="0.002062"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:51.883711" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01hnv3oz2ytswc8ppkdfuk3ov11.node0', 'Content-Length': '404', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:53:51.883761" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:51.883867" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:51.872778" elapsed="0.011153"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:51.870375" elapsed="0.013603"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.884213" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.884054" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.870356" elapsed="0.013946"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.891160" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.885754" elapsed="0.005501"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:51.885235" elapsed="0.006096"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.885197" elapsed="0.006188"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.895123" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.892081" elapsed="0.003089"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:51.891508" elapsed="0.003697"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.891472" elapsed="0.003758"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.895819" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:51.895409" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.896188" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.895945" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.896754" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:51.896435" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:51.896271" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.895925" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.897353" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:51.896997" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.897695" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.897448" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.898226" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:51.897936" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:51.897777" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.897431" elapsed="0.000876"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:51.898459" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:51.899259" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:51.898983" elapsed="0.000301"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:51.899438" elapsed="0.002439"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:51.884675" elapsed="0.017263"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.902113" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:51.902010" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.901991" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:51.904777" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:51.902324" elapsed="0.002479"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:51.904851" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:51.905005" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:51.863418" elapsed="0.041611"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:51.905093" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:53:51.905238" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:53:51.860569" elapsed="0.044693"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:51.905347" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:53:51.905495" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:51.847693" elapsed="0.057827"/>
</kw>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Delete Bulk Flow in member 2 according to ${json_body_del}.</doc>
<status status="PASS" start="2026-04-10T00:53:51.841376" elapsed="0.064228"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.912719" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:51.912405" elapsed="0.000342"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:51.912793" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:51.912943" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:51.912054" elapsed="0.000914"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.919717" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.919452" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.920192" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.919921" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:51.926395" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:51.926451" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:51 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:51 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782431,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:51.926563" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:51.922387" elapsed="0.004204"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:51.920304" elapsed="0.006332"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.926817" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.926663" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.920286" elapsed="0.006617"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.930426" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782431,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.927919" elapsed="0.002555"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:51.927680" elapsed="0.002830"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.927662" elapsed="0.002872"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.933666" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:51.930829" elapsed="0.002906"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:51.930607" elapsed="0.003179"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.930590" elapsed="0.003232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.934634" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:51.934069" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.935165" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.934777" elapsed="0.000477"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.936058" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:51.935572" elapsed="0.000526"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:51.935291" elapsed="0.000859"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.934751" elapsed="0.001430"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.936973" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:51.936419" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.937457" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:51.937113" elapsed="0.000495"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.938331" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:51.937894" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:51.937649" elapsed="0.000773"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.937088" elapsed="0.001366"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:51.938701" elapsed="0.000511"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:51.939839" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:51.939440" elapsed="0.000435"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:51.940138" elapsed="0.002666"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:51.927245" elapsed="0.015621"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:51.943037" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:53:51.942933" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:51.942916" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:51.943267" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:51.943337" elapsed="0.000014"/>
</return>
<msg time="2026-04-10T00:53:51.945844" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782431,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:51.913299" elapsed="0.032574"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:51.945925" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:53:51.946074" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782431,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:51.911555" elapsed="0.034545"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.947067" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782431, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:51.946672" elapsed="0.000422"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:51.947142" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:51.947293" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782431, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:51.946317" elapsed="0.001001"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:51.947689" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:51.947496" elapsed="0.000220"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.948283" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:51.947925" elapsed="0.000384"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.948760" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:51.948481" elapsed="0.000304"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:51.949300" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:51.948957" elapsed="0.000416">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:51.906813" elapsed="0.042671">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:52.958347" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:52.957961" elapsed="0.000419"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:52.958441" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:53:52.958631" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:52.957583" elapsed="0.001076"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:52.965724" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:52.965444" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:52.966263" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:52.966015" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:52.973103" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:52.973161" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:52 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:52 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782432,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:52.973255" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:52.968509" elapsed="0.004804"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:52.966383" elapsed="0.006974"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:52.973539" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:52.973385" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:52.966362" elapsed="0.007285"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:52.977131" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782432,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:52.974665" elapsed="0.002514"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:52.974427" elapsed="0.002786"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:52.974409" elapsed="0.002828"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:52.979970" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:52.977560" elapsed="0.002456"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:52.977323" elapsed="0.002727"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:52.977305" elapsed="0.002769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:52.980658" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:52.980252" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:52.980991" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:52.980755" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:52.981595" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:52.981234" elapsed="0.000388"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:52.981072" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:52.980737" elapsed="0.001079"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:52.982349" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:52.981985" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:52.982703" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:52.982446" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:52.983243" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:52.982949" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:52.982785" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:52.982428" elapsed="0.000897"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:52.983480" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:52.984304" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:52.984011" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:52.984483" elapsed="0.002463"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:52.974004" elapsed="0.013005"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:52.987227" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:53:52.987119" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:52.987099" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:52.987466" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:52.987537" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:53:52.989906" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782432,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:52.959012" elapsed="0.030923"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:52.989987" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:52.990138" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782432,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:52.956983" elapsed="0.033182"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:52.991133" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782432, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:52.990741" elapsed="0.000421"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:52.991210" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:52.991363" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782432, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:52.990385" elapsed="0.001004"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:52.991765" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:52.991584" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:52.992268" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:52.991970" elapsed="0.000324"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:52.992746" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:52.992467" elapsed="0.000306"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:53:52.992946" elapsed="0.000309"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:53:52.950668" elapsed="0.042679"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:53:51.906223" elapsed="1.087175"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 2.</doc>
<status status="PASS" start="2026-04-10T00:53:51.905823" elapsed="1.087637"/>
</kw>
<arg>${temp_json_config_del}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Delete Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:53:51.840530" elapsed="1.152985"/>
</kw>
<doc>10000 Flows deleted via Follower Node1 and verify it gets applied in all instances.</doc>
<status status="PASS" start="2026-04-10T00:53:51.453153" elapsed="1.540497"/>
</test>
<test id="s1-s2-t30" name="Verify No Flows In Leader Node After Follower Restart" line="250">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:53:52.997097" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:53:52.996830" elapsed="0.000543"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:52.998361" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:52.998253" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:52.998234" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:53.003706" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:53.003599" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.003580" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.004770" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:53.004376" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.005262" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:53.004961" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:53.005347" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:53.005501" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:53.003999" elapsed="0.001577"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:53.011109" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:53.010998" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.010979" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:53.012340" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:53.012235" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.012218" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:53.012872" level="INFO">${karaf_connection_index} = 88</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:53.012577" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:53.013491" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:53.013059" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:53.046981" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:53.014029" elapsed="0.033063"/>
</kw>
<msg time="2026-04-10T00:53:53.047258" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:53.047304" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:53.013693" elapsed="0.033647"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:53.126026" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "L "e "a "d "e "r "[C "N "o "d "e "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:53.048031" elapsed="0.078324"/>
</kw>
<msg time="2026-04-10T00:53:53.126639" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:53.126690" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:53.047513" elapsed="0.079216"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.127190" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:53.126855" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.126819" elapsed="0.000457"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.127826" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "L "e "a "d "e "r "[C "N "o "d "e "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:53.127423" elapsed="0.000501"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.128216" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:53.127994" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.127975" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:53.128331" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:53.129970" elapsed="0.000797"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:53.131052" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:53.131818" elapsed="0.000414"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:53.129249" elapsed="0.003085"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:53.128668" elapsed="0.003731"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:53.011937" elapsed="0.120562"/>
</kw>
<msg time="2026-04-10T00:53:53.132694" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:53.132739" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:53.011327" elapsed="0.121450"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:53.132964" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:53.132856" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.132837" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.133451" 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-04-10T00:53:53.133859" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:53.133931" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:53.010661" elapsed="0.123378"/>
</kw>
<msg time="2026-04-10T00:53:53.134140" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:53.134184" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:53.005966" elapsed="0.128255"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.134561" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:53.134297" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.134280" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:53.005819" elapsed="0.128844"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:53.140291" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:53.140183" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.140157" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:53.141509" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:53.141379" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.141362" elapsed="0.000238"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:53.142044" level="INFO">${karaf_connection_index} = 153</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:53.141745" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:53.142446" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:53.142229" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:53.174627" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:53.142981" elapsed="0.031745"/>
</kw>
<msg time="2026-04-10T00:53:53.174884" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:53.174929" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:53.142647" elapsed="0.032318"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:53.259089" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "L "e "a "d "e "r "[C "N "o "d "e "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:53.175471" elapsed="0.083747"/>
</kw>
<msg time="2026-04-10T00:53:53.259375" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:53.259420" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:53.175135" elapsed="0.084322"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.259774" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:53.259533" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.259514" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.260340" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "L "e "a "d "e "r "[C "N "o "d "e "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:53.260036" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.260734" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:53.260500" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.260482" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:53.260842" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:53.264144" elapsed="0.000802"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:53.265232" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:53.265986" elapsed="0.000355"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:53.263499" elapsed="0.002942"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:53.261098" elapsed="0.005408"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:53.141081" elapsed="0.125541"/>
</kw>
<msg time="2026-04-10T00:53:53.266715" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:53.266760" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:53.140509" elapsed="0.126289"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:53.266982" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:53.266877" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.266858" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.267450" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.267798" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:53.267870" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:53.139825" elapsed="0.128155"/>
</kw>
<msg time="2026-04-10T00:53:53.268073" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:53.268118" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:53.134946" elapsed="0.133210"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.268481" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:53.268231" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.268214" elapsed="0.000364"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:53:53.134802" elapsed="0.133801"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:53.274104" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:53.273997" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.273978" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:53:53.275301" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:53.275196" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.275178" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:53.275825" level="INFO">${karaf_connection_index} = 212</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:53.275513" elapsed="0.000338"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:53:53.276273" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:53:53.276050" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:53:53.312109" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:53:53.276851" elapsed="0.035358"/>
</kw>
<msg time="2026-04-10T00:53:53.312388" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:53:53.312434" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:53.276463" elapsed="0.036008"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:53:53.409289" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "L "e "a "d "e "r "[C "N "o "d "e "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:53:53.313004" elapsed="0.096449"/>
</kw>
<msg time="2026-04-10T00:53:53.409650" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:53:53.409696" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:53.312664" elapsed="0.097068"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.410105" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:53.409848" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.409800" elapsed="0.000386"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.410681" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "2 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "L "e "a "d "e "r "[C "N "o "d "e "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:53.410331" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.411060" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:53.410844" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.410826" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:53:53.411171" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:53.412662" elapsed="0.000774"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:53:53.413733" elapsed="0.000503"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:53:53.414502" elapsed="0.000391"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:53:53.412017" elapsed="0.002976"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:53:53.411453" elapsed="0.003605"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:53:53.274895" elapsed="0.140261"/>
</kw>
<msg time="2026-04-10T00:53:53.415250" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:53.415294" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:53.274324" elapsed="0.141008"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:53:53.415515" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T00:53:53.415408" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.415390" 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-04-10T00:53:53.416018" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.416607" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:53:53.416726" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:53:53.273656" elapsed="0.143187"/>
</kw>
<msg time="2026-04-10T00:53:53.416938" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:53:53.416983" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:53.268871" elapsed="0.148150"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.417349" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:53.417097" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.417080" elapsed="0.000348"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:53:53.268727" elapsed="0.148726"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:53.005638" elapsed="0.411847"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:53:53.003227" elapsed="0.414327"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:53:52.997966" elapsed="0.419647"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:53:52.997526" elapsed="0.420134"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:53:52.994425" elapsed="0.423291"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.428714" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:53:53.428245" elapsed="0.000504"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.429304" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:53:53.428958" elapsed="0.000376"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:53:53.429383" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:53:53.429577" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:53:53.427796" elapsed="0.001811"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.440614" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:53.440296" elapsed="0.000344"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:53.440686" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:53.440834" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:53.439946" elapsed="0.000925"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.454974" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:53.454717" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.455415" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:53.455177" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.455875" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:53.455629" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.456308" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:53.456073" elapsed="0.000277"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:53.457180" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:53:53.456968" elapsed="0.000237"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:53:53.457529" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:53:53.457359" elapsed="0.000231"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:53:53.457748" elapsed="0.000219"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.458367" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:53.458122" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:53:53.458538" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:53:53.458718" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:53:53.456565" elapsed="0.002178"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:53.470310" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01wejn0htbvife15t29m5b6i3601.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:53:53.470357" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:53.470460" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:53.460915" elapsed="0.009571"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:53.458817" elapsed="0.011716"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.470739" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:53.470583" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.458798" elapsed="0.012030"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.478703" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:53.473141" elapsed="0.005662"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:53.472524" elapsed="0.006359"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.472483" elapsed="0.006456"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.481704" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:53.479306" elapsed="0.002447"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:53.479063" elapsed="0.002725"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.479025" elapsed="0.002787"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.482405" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:53.482014" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.482759" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:53.482503" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.483302" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:53.483003" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:53.482841" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.482485" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.483918" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:53.483557" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.484249" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:53.484013" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.484798" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:53.484488" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:53.484329" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.483995" elapsed="0.000885"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:53.485034" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:53.485848" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:53.485558" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:53.486075" elapsed="0.002616"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:53.471429" elapsed="0.017330"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:53:53.489006" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:53:53.488894" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.488874" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:53:53.491846" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:53:53.489225" elapsed="0.002647"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:53:53.491921" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:53:53.492082" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:53.451603" elapsed="0.040503"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:53.492174" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:53:53.492323" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:53:53.448997" elapsed="0.043351"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:53.492398" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:53:53.492557" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:53.439484" elapsed="0.053100"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:53:53.434891" elapsed="0.057758"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:53.429826" elapsed="0.062858"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:53.429670" elapsed="0.063048"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.504304" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:53.504008" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:53.504377" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:53.504524" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:53.503662" elapsed="0.000901"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.511332" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:53.511081" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.511790" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:53.511532" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:53.517771" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:53.517828" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:53 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:53 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782433,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:53.517920" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:53.514073" elapsed="0.003912"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:53.511900" elapsed="0.006130"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.518210" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:53.518056" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.511882" elapsed="0.006412"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.523156" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782433,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:53.519405" elapsed="0.003820"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:53.519090" elapsed="0.004184"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.519063" elapsed="0.004245"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.527220" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:53.523783" elapsed="0.003485"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:53.523445" elapsed="0.003858"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.523419" elapsed="0.003908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.527898" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:53.527496" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.528231" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:53.527995" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.528793" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:53.528474" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:53.528313" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.527977" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.529395" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:53.529037" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.529743" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:53.529491" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.530296" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:53.530001" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:53.529824" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.529473" elapsed="0.000906"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:53.530529" elapsed="0.000378"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:53.531349" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:53.531073" elapsed="0.000302"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:53.531531" elapsed="0.002466"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:53.518662" elapsed="0.015400"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:53.534238" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:53:53.534134" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:53.534116" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:53.534473" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:53.534568" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:53:53.536977" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782433,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:53.504902" elapsed="0.032106"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:53.537060" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:53.537211" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782433,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:53.503200" elapsed="0.034037"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.538231" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782433, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:53.537818" elapsed="0.000441"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:53.538307" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:53.538459" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782433, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:53.537457" elapsed="0.001028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:53.538862" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:53.538682" elapsed="0.000239"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.539411" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:53.539109" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.539891" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:53.539627" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:53.540449" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:53.540090" elapsed="0.000431">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:53.498660" elapsed="0.041989">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:54.553846" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:54.553404" elapsed="0.000475"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:54.553941" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:53:54.554116" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:54.553014" elapsed="0.001128"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:54.561164" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:54.560891" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:54.561638" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:54.561372" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:54.568178" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:54.568240" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:54 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:54 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782434,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:54.568334" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:54.563954" elapsed="0.004407"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:54.561776" elapsed="0.006628"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:54.568611" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:54.568432" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:54.561754" elapsed="0.006948"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:54.572442" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782434,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:54.569741" elapsed="0.002772"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:54.569496" elapsed="0.003096"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:54.569477" elapsed="0.003150"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:54.576679" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:54.573063" elapsed="0.003685"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:54.572708" elapsed="0.004089"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:54.572683" elapsed="0.004149"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:54.577720" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:54.577114" elapsed="0.000645"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:54.578214" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:54.577864" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:54.579046" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:54.578591" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:54.578333" elapsed="0.000803"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:54.577837" elapsed="0.001329"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:54.579996" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:54.579447" elapsed="0.000666"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:54.580434" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:54.580191" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:54.581001" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:54.580697" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:54.580517" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:54.580172" elapsed="0.000923"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:54.581253" elapsed="0.000375"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:54.582130" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:54.581801" elapsed="0.000356"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:54.582317" elapsed="0.002637"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:54.569072" elapsed="0.015948"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:54.585213" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:53:54.585100" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:54.585076" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:54.585454" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:54.585526" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:54.587971" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782434,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:54.554495" elapsed="0.033505"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:54.588054" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:54.588212" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782434,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:54.552476" elapsed="0.035762"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:54.589216" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782434, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:54.588819" elapsed="0.000425"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:54.589292" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:54.589445" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782434, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:54.588461" elapsed="0.001009"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:54.589845" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:54.589665" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:54.590349" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:54.590046" elapsed="0.000329"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:54.590824" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:54.590561" elapsed="0.000288"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:54.591405" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:54.591018" elapsed="0.000465">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:54.541609" elapsed="0.050000">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:55.603841" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:55.603440" elapsed="0.000433"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:55.603932" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:53:55.604194" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:55.603066" elapsed="0.001155"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:55.611679" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:55.611389" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:55.612167" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:55.611914" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:55.618878" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:55.618941" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:55 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:55 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782435,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:55.619049" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:55.614482" elapsed="0.004601"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:55.612288" elapsed="0.006854"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:55.619346" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:55.619180" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:55.612267" elapsed="0.007191"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:55.624014" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782435,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:55.620616" elapsed="0.003469"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:55.620301" elapsed="0.003836"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:55.620283" elapsed="0.003890"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:55.628156" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:55.624628" elapsed="0.003600"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:55.624255" elapsed="0.004024"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:55.624230" elapsed="0.004084"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:55.629200" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:55.628656" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:55.629564" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:55.629303" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:55.630124" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:55.629816" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:55.629649" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:55.629284" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:55.630771" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:55.630370" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:55.631110" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:55.630872" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:55.631671" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:55.631353" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:55.631191" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:55.630853" elapsed="0.000904"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:55.631916" elapsed="0.000386"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:55.632864" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:55.632518" elapsed="0.000374"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:55.633120" elapsed="0.002448"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:55.619870" elapsed="0.015769"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:55.635825" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:53:55.635712" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:55.635693" elapsed="0.000229"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:55.636076" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:55.636147" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:55.638595" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782435,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:55.604632" elapsed="0.034005"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:55.638700" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:55.638861" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782435,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:55.602529" elapsed="0.036359"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:55.639966" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782435, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:55.639520" elapsed="0.000474"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:55.640044" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:55.640206" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782435, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:55.639162" elapsed="0.001070"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:55.640665" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:55.640416" elapsed="0.000277"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:55.641180" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:55.640874" elapsed="0.000332"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:55.641664" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:55.641380" elapsed="0.000310"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:55.642215" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:55.641864" elapsed="0.000425">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:55.592725" elapsed="0.049679">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:56.653412" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:56.653029" elapsed="0.000416"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:56.653505" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T00:53:56.653724" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:56.652660" elapsed="0.001089"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:56.660671" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:56.660391" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:56.661124" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:56.660878" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:56.667912" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:56.668019" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:56 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:56 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782436,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:56.668237" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:56.663391" elapsed="0.004873"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:56.661243" elapsed="0.007066"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:56.668494" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:56.668336" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:56.661221" elapsed="0.007377"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:56.673206" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782436,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:56.669675" elapsed="0.003601"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:56.669396" elapsed="0.003932"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:56.669378" elapsed="0.003987"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:56.677372" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:56.673820" elapsed="0.003618"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:56.673447" elapsed="0.004041"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:56.673422" elapsed="0.004100"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:56.678368" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:56.677877" elapsed="0.000518"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:56.678746" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:56.678469" elapsed="0.000339"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:56.679302" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:56.678994" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:56.678832" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:56.678451" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:56.679935" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:56.679564" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:56.680274" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:56.680034" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:56.680864" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:56.680534" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:56.680355" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:56.680015" elapsed="0.000934"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:56.681105" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:56.681971" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:56.681671" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:56.682154" elapsed="0.002456"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:56.668963" elapsed="0.015714"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:56.684859" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:53:56.684749" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:56.684730" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:56.685102" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:56.685174" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:56.687598" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782436,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:56.654104" elapsed="0.033524"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:56.687683" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:56.687837" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782436,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:56.652152" elapsed="0.035749"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:56.688888" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782436, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:56.688472" elapsed="0.000444"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:56.688965" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:56.689119" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782436, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:56.688129" elapsed="0.001015"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:56.689501" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:56.689322" elapsed="0.000204"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:56.690043" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:56.689738" elapsed="0.000331"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:56.690507" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:56.690241" elapsed="0.000291"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:56.691072" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:56.690721" elapsed="0.000423">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:56.643330" elapsed="0.047923">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:57.705843" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:57.705070" elapsed="0.000839"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:57.706025" elapsed="0.000075"/>
</return>
<msg time="2026-04-10T00:53:57.706378" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:57.704241" elapsed="0.002194"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:57.713724" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:57.713443" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:57.714173" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:57.713930" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:57.721329" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:57.721389" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:57 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:57 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782437,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:57.721489" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:57.716479" elapsed="0.005038"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:57.714289" elapsed="0.007292"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:57.721768" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:57.721611" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:57.714269" elapsed="0.007585"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:57.726499" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782437,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:57.722991" elapsed="0.003608"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:57.722698" elapsed="0.003952"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:57.722678" elapsed="0.004009"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:57.730871" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:57.727118" elapsed="0.003821"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:57.726802" elapsed="0.004187"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:57.726774" elapsed="0.004250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:57.731770" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:57.731337" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:57.732116" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:57.731873" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:57.732706" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:57.732366" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:57.732200" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:57.731854" elapsed="0.000941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:57.733333" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:57.732962" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:57.733692" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:57.733432" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:57.734246" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:57.733939" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:57.733777" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:57.733414" elapsed="0.000918"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:57.734488" elapsed="0.000408"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:57.735357" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:57.735065" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:57.735540" elapsed="0.002461"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:57.722217" elapsed="0.015849"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:57.738243" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:53:57.738137" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:57.738118" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:57.738479" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:57.738569" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:53:57.741145" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782437,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:57.707301" elapsed="0.033874"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:57.741227" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:57.741378" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782437,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:57.703138" elapsed="0.038267"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:57.742566" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782437, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:57.742000" elapsed="0.000597"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:57.742647" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:57.742839" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782437, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:57.741644" elapsed="0.001225"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:57.743246" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:57.743056" elapsed="0.000215"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:57.743770" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:57.743446" elapsed="0.000352"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:57.744296" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:57.744020" elapsed="0.000302"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:57.744876" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:57.744495" elapsed="0.000455">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:57.692183" elapsed="0.052879">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:58.757077" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:58.756564" elapsed="0.000558"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:58.757202" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:53:58.757438" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:58.755984" elapsed="0.001490"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:58.768181" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:58.767916" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:58.768654" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:58.768391" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:53:58.775997" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:58.776128" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:58 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:58 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782438,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:58.776361" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:58.770901" elapsed="0.005519"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:58.768773" elapsed="0.007744"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:58.776962" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:58.776608" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:58.768753" elapsed="0.008405"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:58.784840" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782438,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:58.779477" elapsed="0.005415"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:58.778973" elapsed="0.005956"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:58.778933" elapsed="0.006021"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:58.787718" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:58.785238" elapsed="0.002527"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:58.785011" elapsed="0.002789"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:58.784994" elapsed="0.002857"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:58.788434" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:58.788035" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:58.788794" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:58.788534" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:58.789360" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:58.789046" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:58.788880" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:58.788516" elapsed="0.000930"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:58.789999" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:58.789624" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:58.790342" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:58.790098" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:58.790977" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:58.790669" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:58.790484" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:58.790081" elapsed="0.000984"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:58.791220" elapsed="0.000381"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:58.792094" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:58.791769" elapsed="0.000352"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:58.792280" elapsed="0.002472"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:58.777987" elapsed="0.016830"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:58.794999" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:53:58.794890" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:58.794870" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:58.795241" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:58.795315" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:53:58.797694" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782438,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:58.758003" elapsed="0.039721"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:58.797777" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:53:58.797929" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782438,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:58.755211" elapsed="0.042745"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:58.798945" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782438, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:58.798522" elapsed="0.000452"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:58.799023" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:53:58.799180" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782438, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:58.798178" elapsed="0.001028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:58.799590" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:58.799390" elapsed="0.000228"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:58.800143" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:58.799796" elapsed="0.000374"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:58.800626" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:58.800343" elapsed="0.000311"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:58.801182" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:58.800829" elapsed="0.000423">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:58.746049" elapsed="0.055312">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:59.810790" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:59.810310" elapsed="0.000522"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:53:59.810903" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:53:59.811107" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:53:59.809831" elapsed="0.001309"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:59.820701" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:59.820132" elapsed="0.000645"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:59.821369" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:59.821057" 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-04-10T00:53:59.829069" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:53:59.829172" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:53:59 GMT', 'Expires': 'Thu, 09 Apr 2026 23:53:59 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782439,"status":200} 
 </msg>
<msg time="2026-04-10T00:53:59.829336" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:53:59.824519" elapsed="0.004854"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:59.821532" elapsed="0.007913"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:59.829787" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:59.829496" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:59.821501" elapsed="0.008401"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:59.834960" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782439,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:59.831378" elapsed="0.003667"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:59.831062" elapsed="0.004041"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:59.831036" elapsed="0.004106"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:53:59.841127" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:53:59.835623" elapsed="0.005653"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:59.835245" elapsed="0.006129"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:59.835212" elapsed="0.006228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:59.842977" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:59.841947" elapsed="0.001094"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:59.843833" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:59.843216" elapsed="0.000752"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:59.845243" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:59.844436" elapsed="0.000868"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:59.844023" elapsed="0.001361"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:59.843172" elapsed="0.002258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:59.846698" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:59.845833" elapsed="0.000926"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:59.847472" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:53:59.846919" elapsed="0.000755"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:53:59.848858" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:53:59.848119" elapsed="0.000883"/>
</kw>
<status status="PASS" start="2026-04-10T00:53:59.847734" elapsed="0.001353"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:59.846878" elapsed="0.002257"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:53:59.849423" elapsed="0.000593"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:53:59.850732" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:59.850274" elapsed="0.000497"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:53:59.851004" elapsed="0.004269"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:53:59.830447" elapsed="0.024952"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:53:59.855849" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-04-10T00:53:59.855664" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-10T00:53:59.855621" elapsed="0.000378"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:53:59.856274" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:53:59.856386" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:53:59.860150" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782439,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:53:59.811606" elapsed="0.048598"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:53:59.860306" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T00:53:59.860588" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782439,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:59.809002" elapsed="0.051628"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:53:59.862098" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782439, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:53:59.861603" elapsed="0.000523"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:53:59.862176" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:53:59.862340" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782439, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:53:59.861093" elapsed="0.001279"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:53:59.862773" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:53:59.862576" elapsed="0.000224"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:59.863296" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:59.862982" elapsed="0.000342"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:53:59.863787" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:53:59.863496" elapsed="0.000317"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:53:59.864351" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:53:59.863992" elapsed="0.000431">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:53:59.802140" elapsed="0.062398">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:00.876850" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:00.876454" elapsed="0.000430"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:00.876945" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:54:00.877120" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:00.876081" elapsed="0.001063"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:00.884350" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:00.884080" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:00.884822" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:00.884570" 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-04-10T00:54:00.892063" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:00.892126" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:00 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782440,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:00.892224" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:00.887271" elapsed="0.004979"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:00.884941" elapsed="0.007423"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:00.892598" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:00.892395" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:00.884920" elapsed="0.007773"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:00.897301" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782440,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:00.893758" elapsed="0.003614"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:00.893493" elapsed="0.003929"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:00.893474" elapsed="0.003983"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:00.901669" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:00.897941" elapsed="0.003811"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:00.897538" elapsed="0.004273"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:00.897514" elapsed="0.004340"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:00.902647" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:00.902155" elapsed="0.000519"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:00.902991" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:00.902747" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:00.903566" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:00.903242" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:00.903075" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:00.902728" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:00.904187" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:00.903819" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:00.904577" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:00.904286" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:00.905213" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:00.904880" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:00.904670" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:00.904266" elapsed="0.001030"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:00.905456" elapsed="0.000376"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:00.906330" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:00.906028" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:00.906512" elapsed="0.002580"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:00.893068" elapsed="0.016110"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:00.909424" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-10T00:54:00.909275" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:00.909250" elapsed="0.000320"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:00.909782" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:00.909879" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:54:00.912786" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782440,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:00.877506" elapsed="0.035312"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:00.912873" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:00.913032" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782440,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:00.875561" elapsed="0.037498"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:00.914201" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782440, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:00.913730" elapsed="0.000500"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:00.914280" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:00.914439" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782440, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:00.913353" elapsed="0.001112"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:00.914894" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:00.914669" elapsed="0.000252"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:00.915411" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:00.915102" elapsed="0.000335"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:00.915900" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:00.915628" elapsed="0.000298"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:00.916461" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:00.916099" elapsed="0.000438">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:00.865512" elapsed="0.051168">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:01.929090" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:01.928699" elapsed="0.000424"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:01.929186" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:54:01.929361" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:01.928316" elapsed="0.001070"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:01.936203" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:01.935942" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:01.936666" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:01.936407" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:01.946119" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:01.946181" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:01 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:01 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782441,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:01.946280" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:01.938934" elapsed="0.007373"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:01.936787" elapsed="0.009591"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:01.946673" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:01.946419" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:01.936764" elapsed="0.010034"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:01.951834" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782441,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:01.948297" elapsed="0.003606"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:01.947975" elapsed="0.003976"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:01.947949" elapsed="0.004037"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:01.955862" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:01.952375" elapsed="0.003536"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:01.952063" elapsed="0.003883"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:01.952040" elapsed="0.003930"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:01.956670" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:01.956153" elapsed="0.000544"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:01.957013" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:01.956770" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:01.957581" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:01.957261" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:01.957096" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:01.956751" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:01.958193" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:01.957828" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:01.958525" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:01.958291" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:01.959106" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:01.958788" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:01.958624" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:01.958273" elapsed="0.000916"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:01.959344" elapsed="0.000384"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:01.960219" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:01.959904" elapsed="0.000343"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:01.960411" elapsed="0.002567"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:01.947349" elapsed="0.015695"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:01.963227" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:54:01.963117" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:01.963098" elapsed="0.000221"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:01.963470" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:01.963560" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:54:01.965907" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782441,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:01.929757" elapsed="0.036178"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:01.965986" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:01.966137" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782441,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:01.927826" elapsed="0.038337"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:01.967172" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782441, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:01.966752" elapsed="0.000448"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:01.967249" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:01.967404" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782441, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:01.966390" elapsed="0.001040"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:01.967809" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:01.967626" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:01.968314" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:01.968011" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:01.968834" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:01.968511" elapsed="0.000349"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:01.969384" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:01.969033" elapsed="0.000422">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:01.917350" elapsed="0.052232">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:02.982631" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:02.982126" elapsed="0.000539"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:02.982726" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:54:02.982902" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:02.981736" elapsed="0.001192"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:02.990195" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:02.989877" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:02.990770" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:02.990408" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:02.997188" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:02.997251" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:03 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:03 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782443,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:02.997354" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:02.993061" elapsed="0.004322"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:02.990892" elapsed="0.006536"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:02.997637" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:02.997457" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:02.990871" elapsed="0.006856"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:03.001865" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782443,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:02.998796" elapsed="0.003138"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:02.998558" elapsed="0.003426"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:02.998524" elapsed="0.003495"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:03.005993" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:03.002411" elapsed="0.003649"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:03.002098" elapsed="0.004012"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:03.002075" elapsed="0.004069"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:03.006979" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:03.006393" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:03.007454" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:03.007119" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:03.008307" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:03.007829" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:03.007594" elapsed="0.000800"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:03.007093" elapsed="0.001323"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:03.008968" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:03.008593" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:03.009308" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:03.009069" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:03.009955" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:03.009645" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:03.009455" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:03.009051" elapsed="0.000990"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:03.010221" elapsed="0.000401"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:03.011117" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:03.010797" elapsed="0.000358"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:03.011337" elapsed="0.002465"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:02.998105" elapsed="0.015765"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:03.014053" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:54:03.013943" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:03.013923" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:03.014304" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:03.014378" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:54:03.016991" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782443,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:02.983287" elapsed="0.033741"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:03.017093" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:54:03.017261" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782443,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:02.981113" elapsed="0.036174"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:03.018283" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782443, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:03.017882" elapsed="0.000430"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:03.018362" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:03.018518" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782443, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:03.017517" elapsed="0.001041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:03.018922" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:03.018741" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:03.019428" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:03.019123" elapsed="0.000331"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:03.019932" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:03.019643" elapsed="0.000316"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:03.020485" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:03.020131" elapsed="0.000442">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:02.970474" elapsed="0.050210">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:04.031575" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:04.031127" elapsed="0.000483"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:04.031671" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:54:04.031849" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:04.030691" elapsed="0.001185"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:04.040343" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:04.040075" elapsed="0.000409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:04.040985" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:04.040682" 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-04-10T00:54:04.048892" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:04.048958" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:04 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:04 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782444,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:04.049065" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:04.043761" elapsed="0.005331"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:04.041132" elapsed="0.008007"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:04.049338" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:04.049170" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:04.041106" elapsed="0.008321"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:04.054326" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782444,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:04.050533" elapsed="0.003888"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:04.050292" elapsed="0.004194"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:04.050272" elapsed="0.004264"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:04.059980" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:04.055120" elapsed="0.004957"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:04.054689" elapsed="0.005459"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:04.054654" elapsed="0.005548"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:04.061390" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:04.060568" elapsed="0.000863"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:04.061891" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:04.061536" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:04.062678" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:04.062247" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:04.062012" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:04.061509" elapsed="0.001288"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:04.063506" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:04.063029" elapsed="0.000513"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:04.063883" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:04.063638" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:04.064435" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:04.064128" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:04.063964" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:04.063618" elapsed="0.000908"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:04.064706" elapsed="0.000416"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:04.065688" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:04.065295" elapsed="0.000421"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:04.065878" elapsed="0.002793"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:04.049844" elapsed="0.018897"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:04.069011" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:54:04.068896" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:04.068874" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:04.069263" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:04.069338" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:54:04.071729" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782444,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:04.032237" elapsed="0.039522"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:04.071813" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:04.071967" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782444,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:04.030104" elapsed="0.041889"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:04.073064" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782444, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:04.072601" elapsed="0.000494"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:04.073145" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:04.073301" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782444, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:04.072222" elapsed="0.001105"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:04.073724" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:04.073511" elapsed="0.000239"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:04.074232" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:04.073930" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:04.074731" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:04.074435" elapsed="0.000323"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:04.075285" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:04.074932" elapsed="0.000424">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:04.021947" elapsed="0.053522">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:05.088412" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:05.087978" elapsed="0.000467"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:05.088507" elapsed="0.000060"/>
</return>
<msg time="2026-04-10T00:54:05.088702" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:05.087602" elapsed="0.001127"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:05.096159" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:05.095889" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:05.096672" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:05.096381" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:05.103377" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:05.103456" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:05 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:05 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782445,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:05.103620" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:05.098976" elapsed="0.004685"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:05.096804" elapsed="0.007003"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:05.104085" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:05.103857" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:05.096781" elapsed="0.007432"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:05.109382" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782445,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:05.105817" elapsed="0.003636"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:05.105398" elapsed="0.004105"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:05.105365" elapsed="0.004173"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:05.113703" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:05.110037" elapsed="0.003823"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:05.109651" elapsed="0.004262"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:05.109626" elapsed="0.004321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:05.114681" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:05.114192" elapsed="0.000516"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:05.115018" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:05.114779" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:05.115580" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:05.115262" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:05.115099" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:05.114762" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:05.116182" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:05.115823" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:05.116508" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:05.116277" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:05.117057" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:05.116765" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:05.116604" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:05.116260" elapsed="0.000878"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:05.117290" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:05.118131" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:05.117840" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:05.118310" elapsed="0.002421"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:05.104790" elapsed="0.016003"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:05.120966" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:54:05.120863" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:05.120845" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:05.121197" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:05.121268" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:54:05.123650" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782445,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:05.089091" elapsed="0.034588"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:05.123730" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:05.123880" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782445,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:05.087080" elapsed="0.036826"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:05.124925" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782445, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:05.124510" elapsed="0.000443"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:05.125002" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:05.125155" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782445, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:05.124163" elapsed="0.001018"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:05.125539" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:05.125359" elapsed="0.000222"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:05.126075" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:05.125775" elapsed="0.000326"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:05.126530" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:05.126273" elapsed="0.000297"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:05.127093" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:05.126742" elapsed="0.000423">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:05.076443" elapsed="0.050832">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:06.137831" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:06.137318" elapsed="0.000555"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:06.137964" elapsed="0.000066"/>
</return>
<msg time="2026-04-10T00:54:06.138270" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:06.136811" elapsed="0.001508"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:06.146510" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:06.146237" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:06.147011" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:06.146758" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:06.154094" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:06.154154" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:06 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782446,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:06.154250" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:06.149263" elapsed="0.005014"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:06.147135" elapsed="0.007187"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:06.154515" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:06.154351" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:06.147113" elapsed="0.007545"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:06.158330" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782446,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:06.155748" elapsed="0.002632"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:06.155498" elapsed="0.002917"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:06.155479" elapsed="0.002961"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:06.162085" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:06.158797" elapsed="0.003358"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:06.158497" elapsed="0.003709"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:06.158480" elapsed="0.003761"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:06.163100" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:06.162490" elapsed="0.000648"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:06.163687" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:06.163314" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:06.164479" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:06.164042" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:06.163808" elapsed="0.000809"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:06.163287" elapsed="0.001362"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:06.165437" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:06.164880" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:06.165947" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:06.165608" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:06.166783" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:06.166291" elapsed="0.000530"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:06.166064" elapsed="0.000810"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:06.165579" elapsed="0.001326"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:06.167122" elapsed="0.000614"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:06.168391" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:06.167979" elapsed="0.000456"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:06.168733" elapsed="0.003226"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:06.155063" elapsed="0.016961"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:06.172204" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:54:06.172096" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:06.172078" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:06.172444" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:06.172515" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:54:06.174919" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782446,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:06.139066" elapsed="0.035882"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:06.175002" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:06.175156" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782446,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:06.136116" elapsed="0.039066"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:06.176176" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782446, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:06.175773" elapsed="0.000432"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:06.176253" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:06.176438" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782446, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:06.175409" elapsed="0.001057"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:06.176853" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:06.176668" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:06.177396" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:06.177057" elapsed="0.000365"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:06.177887" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:06.177617" elapsed="0.000296"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:06.178482" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:06.178126" elapsed="0.000445">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:06.128249" elapsed="0.050478">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:07.194163" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:07.193800" elapsed="0.000394"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:07.194251" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:54:07.194418" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:07.193423" elapsed="0.001020"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:07.201637" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:07.201239" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:07.202133" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:07.201845" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:07.208885" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:07.208949" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:07 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:07 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782447,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:07.209065" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:07.204428" elapsed="0.004664"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:07.202260" elapsed="0.006879"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:07.209337" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:07.209169" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:07.202239" elapsed="0.007185"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:07.214832" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782447,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:07.211032" elapsed="0.003874"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:07.210693" elapsed="0.004265"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:07.210665" elapsed="0.004330"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:07.219212" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:07.215412" elapsed="0.003872"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:07.215079" elapsed="0.004256"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:07.215054" elapsed="0.004318"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:07.220343" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:07.219745" elapsed="0.000639"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:07.220764" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:07.220489" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:07.221319" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:07.221009" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:07.220845" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:07.220462" elapsed="0.000941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:07.221949" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:07.221581" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:07.222278" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:07.222045" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:07.222834" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:07.222519" elapsed="0.000399"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:07.222359" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:07.222028" elapsed="0.000949"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:07.223133" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:07.223983" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:07.223688" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:07.224165" elapsed="0.002608"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:07.209971" elapsed="0.016869"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:07.227019" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:54:07.226912" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:07.226893" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:07.227262" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:07.227334" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:54:07.229882" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782447,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:07.194805" elapsed="0.035107"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:07.229965" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:07.230119" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782447,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:07.192939" elapsed="0.037206"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:07.231129" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782447, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:07.230735" elapsed="0.000423"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:07.231206" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:07.231360" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782447, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:07.230368" elapsed="0.001018"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:07.231844" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:07.231652" elapsed="0.000217"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:07.232346" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:07.232046" elapsed="0.000326"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:07.232861" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:07.232580" elapsed="0.000308"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:07.233448" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:07.233078" elapsed="0.000442">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:07.179678" elapsed="0.053965">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:08.246238" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:08.245850" elapsed="0.000422"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:08.246335" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:54:08.246515" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:08.245422" elapsed="0.001136"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:08.253753" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:08.253454" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:08.254303" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:08.254048" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:08.261359" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:08.261420" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:08 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:08 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782448,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:08.261515" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:08.256625" elapsed="0.004935"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:08.254427" elapsed="0.007179"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:08.261793" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:08.261635" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:08.254404" elapsed="0.007477"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:08.265502" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782448,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:08.262911" elapsed="0.002700"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:08.262685" elapsed="0.002979"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:08.262666" elapsed="0.003034"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:08.269698" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:08.266103" elapsed="0.003667"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:08.265784" elapsed="0.004036"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:08.265759" elapsed="0.004096"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:08.270695" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:08.270102" elapsed="0.000634"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:08.271284" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:08.270864" elapsed="0.000516"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:08.272177" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:08.271741" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:08.271425" elapsed="0.000844"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:08.270822" elapsed="0.001561"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:08.273192" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:08.272672" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:08.273632" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:08.273329" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:08.274175" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:08.273877" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:08.273715" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:08.273304" elapsed="0.000956"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:08.274416" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:08.275240" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:08.274951" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:08.275422" elapsed="0.002465"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:08.262242" elapsed="0.015709"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:08.278131" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:54:08.278023" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:08.278004" elapsed="0.000257"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:08.278415" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:08.278487" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:54:08.280933" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782448,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:08.246962" elapsed="0.034001"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:08.281016" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:08.281167" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782448,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:08.244928" elapsed="0.036265"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:08.282173" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782448, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:08.281776" elapsed="0.000425"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:08.282250" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:08.282402" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782448, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:08.281414" elapsed="0.001014"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:08.282803" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:08.282621" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:08.283304" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:08.283004" elapsed="0.000326"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:08.283779" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:08.283502" elapsed="0.000303"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:08.284339" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:08.283976" elapsed="0.000435">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:08.234621" elapsed="0.049903">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:09.297720" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:09.297052" elapsed="0.000716"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:09.297852" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T00:54:09.298101" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:09.296432" elapsed="0.001710"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:09.306995" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:09.306712" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:09.307474" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:09.307225" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:09.314095" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:09.314154" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:09 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:09 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782449,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:09.314250" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:09.309862" elapsed="0.004415"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:09.307610" elapsed="0.006711"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:09.314610" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:09.314425" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:09.307589" elapsed="0.007112"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:09.318326" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782449,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:09.315768" elapsed="0.002609"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:09.315522" elapsed="0.002890"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:09.315504" elapsed="0.002933"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:09.321210" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:09.318742" elapsed="0.002516"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:09.318494" elapsed="0.002800"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:09.318476" elapsed="0.002843"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:09.321915" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:09.321499" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:09.322256" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:09.322014" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:09.322830" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:09.322502" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:09.322339" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:09.321996" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:09.323443" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:09.323079" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:09.323801" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:09.323560" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:09.324341" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:09.324044" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:09.323883" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:09.323524" elapsed="0.000900"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:09.324598" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:09.325440" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:09.325147" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:09.325642" elapsed="0.002599"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:09.315088" elapsed="0.013217"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:09.328485" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:54:09.328378" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:09.328358" elapsed="0.000237"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:09.328747" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:09.328819" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:54:09.331192" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782449,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:09.298719" elapsed="0.032502"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:09.331274" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:09.331428" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782449,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:09.295588" elapsed="0.035866"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:09.332504" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782449, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:09.332104" elapsed="0.000432"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:09.332604" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:09.332764" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782449, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:09.331707" elapsed="0.001084"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:09.333293" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:09.332971" elapsed="0.000351"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:09.333856" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:09.333518" elapsed="0.000365"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:09.334332" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:09.334063" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:09.334903" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:09.334534" elapsed="0.000439">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:09.285717" elapsed="0.049365">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:10.347866" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:10.347487" elapsed="0.000412"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:10.347956" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:54:10.348122" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:10.347122" elapsed="0.001026"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:10.355333" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:10.355018" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:10.355815" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:10.355561" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:10.362370" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:10.362432" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:10 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:10 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782450,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:10.362531" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:10.358110" elapsed="0.004469"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:10.355933" elapsed="0.006692"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:10.362818" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:10.362655" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:10.355913" elapsed="0.006993"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:10.366657" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782450,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:10.363980" elapsed="0.002753"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:10.363752" elapsed="0.003034"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:10.363732" elapsed="0.003091"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:10.371133" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:10.367243" elapsed="0.003960"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:10.366907" elapsed="0.004350"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:10.366882" elapsed="0.004413"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:10.372412" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:10.371687" elapsed="0.000775"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:10.373343" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:10.372886" elapsed="0.000562"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:10.374439" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:10.373838" elapsed="0.000650"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:10.373494" elapsed="0.001084"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:10.372851" elapsed="0.001770"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:10.375640" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:10.374940" elapsed="0.000751"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:10.376267" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:10.375822" elapsed="0.000550"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:10.377312" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:10.376763" elapsed="0.000598"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:10.376418" elapsed="0.001010"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:10.375789" elapsed="0.001679"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:10.377793" elapsed="0.000721"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:10.379154" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:10.378788" elapsed="0.000400"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:10.379392" elapsed="0.003492"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:10.363290" elapsed="0.019690"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:10.383229" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-10T00:54:10.383085" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:10.383057" elapsed="0.000295"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:10.383585" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:10.383677" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:54:10.386800" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782450,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:10.348499" elapsed="0.038341"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:10.386911" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:54:10.387114" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782450,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:10.346633" elapsed="0.040514"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:10.388595" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782450, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:10.387998" elapsed="0.000633"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:10.388692" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:54:10.388884" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782450, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:10.387473" elapsed="0.001444"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:10.389378" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:10.389152" elapsed="0.000258"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:10.390142" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:10.389697" elapsed="0.000478"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:10.390752" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:10.390399" elapsed="0.000385"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:10.391579" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:10.391012" elapsed="0.000662">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:10.336001" elapsed="0.055814">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:11.405036" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:11.404672" elapsed="0.000396"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:11.405124" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:54:11.405289" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:11.404297" elapsed="0.001017"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:11.412087" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:11.411829" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:11.412531" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:11.412289" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:11.419158" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:11.419217" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:11 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:11 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782451,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:11.419311" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:11.414802" elapsed="0.004536"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:11.412670" elapsed="0.006710"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:11.419576" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:11.419406" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:11.412650" elapsed="0.007017"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:11.423213" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782451,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:11.420685" elapsed="0.002577"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:11.420447" elapsed="0.002850"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:11.420430" elapsed="0.002892"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:11.427310" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:11.423631" elapsed="0.003745"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:11.423377" elapsed="0.004049"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:11.423361" elapsed="0.004099"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:11.428261" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:11.427728" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:11.428755" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:11.428398" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:11.429519" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:11.429097" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:11.428869" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:11.428372" elapsed="0.001292"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:11.430396" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:11.429888" elapsed="0.000546"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:11.430930" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:11.430532" elapsed="0.000482"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:11.431743" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:11.431273" elapsed="0.000562"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:11.431048" elapsed="0.000825"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:11.430507" elapsed="0.001388"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:11.432050" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:11.432870" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:11.432580" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:11.433054" elapsed="0.002441"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:11.420028" elapsed="0.015547"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:11.435754" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:54:11.435648" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:11.435630" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:11.435989" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:11.436061" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:54:11.438405" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782451,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:11.405680" elapsed="0.032754"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:11.438484" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:11.438654" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782451,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:11.403813" elapsed="0.034867"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:11.439865" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782451, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:11.439446" elapsed="0.000447"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:11.439943" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:11.440100" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782451, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:11.439099" elapsed="0.001028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:11.440487" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:11.440306" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:11.441016" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:11.440705" elapsed="0.000337"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:11.441476" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:11.441214" elapsed="0.000288"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:11.442043" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:11.441694" elapsed="0.000419">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:11.392759" elapsed="0.049464">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:12.454068" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:12.453524" elapsed="0.000590"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:12.454195" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:54:12.454432" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:12.452974" elapsed="0.001495"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:12.462726" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:12.462330" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:12.463313" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:12.463049" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:12.470659" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:12.470720" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:12 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:12 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782452,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:12.470822" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:12.465665" elapsed="0.005185"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:12.463448" elapsed="0.007447"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:12.471089" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:12.470925" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:12.463424" elapsed="0.007754"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:12.476152" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782452,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:12.472370" elapsed="0.003856"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:12.472105" elapsed="0.004175"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:12.472086" elapsed="0.004230"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:12.480643" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:12.476770" elapsed="0.003924"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:12.476404" elapsed="0.004325"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:12.476379" elapsed="0.004374"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:12.481323" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:12.480932" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:12.481676" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:12.481421" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:12.482229" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:12.481925" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:12.481759" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:12.481403" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:12.482857" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:12.482474" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:12.483189" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:12.482955" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:12.483773" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:12.483430" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:12.483269" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:12.482937" elapsed="0.000921"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:12.484012" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:12.484833" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:12.484525" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:12.485015" elapsed="0.002427"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:12.471650" elapsed="0.015875"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:12.487736" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:54:12.487624" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:12.487605" 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-04-10T00:54:12.488019" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:12.488091" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:54:12.490411" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782452,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:12.455013" elapsed="0.035426"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:12.490492" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:12.490659" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782452,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:12.452076" elapsed="0.038609"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:12.491687" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782452, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:12.491245" elapsed="0.000470"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:12.491764" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:12.491919" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782452, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:12.490907" elapsed="0.001038"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:12.492303" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:12.492123" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:12.492820" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:12.492503" elapsed="0.000344"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:12.493278" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:12.493018" elapsed="0.000285"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:12.493838" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:12.493473" elapsed="0.000436">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:12.443164" elapsed="0.050854">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:13.506764" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:13.506208" elapsed="0.000602"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:13.506893" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T00:54:13.507139" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:13.505656" elapsed="0.001520"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:13.517072" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:13.516770" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:13.517568" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:13.517292" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:13.527045" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:13.527204" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:13 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:13 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782453,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:13.527439" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:13.519853" elapsed="0.007649"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:13.517692" elapsed="0.009951"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:13.528298" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:13.527821" elapsed="0.000640"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:13.517671" elapsed="0.010842"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:13.534048" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782453,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:13.530179" elapsed="0.003940"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:13.529829" elapsed="0.004341"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:13.529801" elapsed="0.004405"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:13.538244" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:13.534648" elapsed="0.003668"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:13.534300" elapsed="0.004079"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:13.534274" elapsed="0.004143"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:13.539266" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:13.538699" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:13.539788" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:13.539421" elapsed="0.000451"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:13.540686" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:13.540138" elapsed="0.000577"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:13.539907" elapsed="0.000847"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:13.539393" elapsed="0.001383"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:13.541321" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:13.540942" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:13.541693" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:13.541431" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:13.542251" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:13.541944" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:13.541780" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:13.541411" elapsed="0.000924"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:13.542503" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:13.543356" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:13.543052" elapsed="0.000332"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:13.543592" elapsed="0.002477"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:13.529147" elapsed="0.016995"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:13.546335" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:54:13.546222" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:13.546202" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:13.546602" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:13.546675" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:54:13.549055" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782453,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:13.507720" elapsed="0.041366"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:13.549140" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:13.549293" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782453,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:13.504801" elapsed="0.044519"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:13.550370" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782453, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:13.549955" elapsed="0.000457"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:13.550483" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:54:13.550669" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782453, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:13.549561" elapsed="0.001136"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:13.551067" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:13.550878" elapsed="0.000215"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:13.551621" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:13.551277" elapsed="0.000371"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:13.552101" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:13.551829" elapsed="0.000299"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:13.552711" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:13.552333" elapsed="0.000454">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:13.494993" elapsed="0.057907">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.564113" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:14.563617" elapsed="0.000540"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:14.564232" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:54:14.564460" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:14.563059" elapsed="0.001437"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.572894" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:14.572626" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.573376" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:14.573125" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:14.579616" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:14.579689" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:14 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:14 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782454,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:14.579805" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:14.575619" elapsed="0.004212"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:14.573495" elapsed="0.006379"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:14.580060" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:14.579902" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:14.573475" elapsed="0.006670"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.583862" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782454,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:14.581298" elapsed="0.002613"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:14.581035" elapsed="0.002911"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:14.581015" elapsed="0.002955"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.588326" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:14.584249" elapsed="0.004126"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:14.584026" elapsed="0.004385"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:14.584009" elapsed="0.004427"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.589260" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:14.588637" elapsed="0.000662"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:14.589834" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:14.589467" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.590629" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:14.590177" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:14.589950" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:14.589441" elapsed="0.001307"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.591534" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:14.590976" elapsed="0.000619"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:14.592029" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:14.591697" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.592823" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:14.592374" elapsed="0.000487"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:14.592146" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:14.591671" elapsed="0.001271"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:14.593184" elapsed="0.000514"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:14.594330" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:14.593934" elapsed="0.000433"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.594605" elapsed="0.003399"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:14.580562" elapsed="0.017506"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:14.598244" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:54:14.598138" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:14.598119" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:14.598481" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:14.598567" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:54:14.600916" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782454,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:14.565019" elapsed="0.035926"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:14.601019" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:14.601171" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782454,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:14.562318" elapsed="0.038878"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.602207" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782454, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:14.601808" elapsed="0.000428"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:14.602284" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:14.602437" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782454, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:14.601432" elapsed="0.001031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:14.602837" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.602656" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.603339" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:14.603036" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.603855" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:14.603537" elapsed="0.000343"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.604050" elapsed="0.000350"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:54:14.553840" elapsed="0.050621"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:53:53.498026" elapsed="21.106483"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:53:53.497598" elapsed="21.106989"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:53:53.492922" elapsed="21.111700"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:53:53.492777" elapsed="21.111879"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.615876" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:14.615571" elapsed="0.000333"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:14.615955" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:14.616106" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:14.615190" elapsed="0.000940"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.623371" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:14.623121" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.623948" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:14.623631" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:14.630414" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:14.630473" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:14 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:14 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782454,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:14.630588" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:14.626194" elapsed="0.004422"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:14.624067" elapsed="0.006600"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:14.630967" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:14.630709" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:14.624046" elapsed="0.007039"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.636032" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782454,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:14.632601" elapsed="0.003499"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:14.632262" elapsed="0.003887"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:14.632235" elapsed="0.003948"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.639973" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:14.636587" elapsed="0.003449"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:14.636260" elapsed="0.003824"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:14.636237" elapsed="0.003880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.640928" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:14.640349" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:14.641478" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:14.641140" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.642169" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:14.641829" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:14.641617" elapsed="0.000616"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:14.641112" elapsed="0.001142"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.642802" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:14.642415" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:14.643191" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:14.642955" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.643743" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:14.643429" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:14.643271" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:14.642937" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:14.643980" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:14.644822" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:14.644494" elapsed="0.000361"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.645016" elapsed="0.002519"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:14.631598" elapsed="0.016025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:14.647811" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:54:14.647699" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:14.647680" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:14.648059" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:14.648130" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:54:14.650585" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782454,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:14.616458" elapsed="0.034158"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:14.650671" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:14.650827" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782454,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:14.614708" elapsed="0.036145"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:54:14.650901" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:54:14.651047" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782454,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 1. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:54:14.610102" elapsed="0.040970"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.652147" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782454, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:14.651696" elapsed="0.000481"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:14.652226" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:14.652379" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782454, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:14.651313" elapsed="0.001091"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:14.652781" level="INFO">${value} = 0</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.652599" elapsed="0.000208"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.653291" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:54:14.652983" elapsed="0.000365"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 0.</doc>
<status status="PASS" start="2026-04-10T00:54:14.609630" elapsed="0.043777"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:14.604860" elapsed="0.048581"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:14.604719" elapsed="0.048758"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_del}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:53:53.427036" elapsed="21.226502"/>
</kw>
<doc>Verify flow count is 0 across cluster nodes.</doc>
<status status="PASS" start="2026-04-10T00:53:52.993894" elapsed="21.659796"/>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-10T00:54:14.654355" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-10T00:54:14.654273" elapsed="0.000497"/>
</kw>
<doc>Test suite for 2Node Cluster HA with Bulk Flows - Cluster node convergance and Data consistency after leader and follower restart with one switch connected</doc>
<status status="PASS" start="2026-04-10T00:49:34.919461" elapsed="279.735347"/>
</suite>
<suite id="s1-s3" name="Cluster HA Data Recovery BulkFlow Single Switch" source="/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/suites/openflowplugin/Clustering_Bulkomatic/030__Cluster_HA_Data_Recovery_BulkFlow_Single_Switch.robot">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils" type="SETUP">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.739552" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:54:14.735291" elapsed="0.004315"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-10T00:54:14.735057" elapsed="0.004617"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.744568" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-10T00:54:14.740847" elapsed="0.003750"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-10T00:54:14.744798" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:14.744682" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:14.744659" elapsed="0.000207"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.745394" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:54:14.745025" elapsed="0.000412"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.745928" level="INFO">${cluster_size} = 3</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-10T00:54:14.745616" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:54:14.746463" elapsed="0.000300"/>
</kw>
<msg time="2026-04-10T00:54:14.746861" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:14.746908" level="INFO">${possibly_int_of_members} = 3</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:14.746124" elapsed="0.000807"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.747472" level="INFO">${int_of_members} = 3</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:14.747102" elapsed="0.000395"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.748477" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:14.748215" elapsed="0.000289"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.748928" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:14.748670" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.749426" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.749138" elapsed="0.000315"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.752554" elapsed="0.000214"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.753296" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:14.752931" elapsed="0.000391"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.753478" elapsed="0.000266"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.754562" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:14.754250" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:14.754636" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:54:14.754798" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:14.753954" elapsed="0.000869"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:14.755418" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.165:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x72c8f05bd450&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-10T00:54:14.754983" elapsed="0.000595"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.755743" elapsed="0.000190"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-10T00:54:14.751978" elapsed="0.004014"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:14.751786" elapsed="0.004314"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.757155" elapsed="0.000189"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.757842" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:14.757502" elapsed="0.000366"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.758021" elapsed="0.000220"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.759040" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:14.758743" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:14.759111" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:14.759264" level="INFO">${session_alias} = ClusterManagement__session_2</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:14.758433" elapsed="0.000856"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:14.759875" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.169:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x72c8f10c2850&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-10T00:54:14.759443" elapsed="0.000541"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.760148" elapsed="0.000189"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-10T00:54:14.756565" elapsed="0.003831"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:14.756191" elapsed="0.004249"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.761312" elapsed="0.000189"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.761998" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:14.761676" elapsed="0.000348"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.762175" elapsed="0.000219"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.763190" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:14.762897" elapsed="0.000319"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:14.763261" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:14.763411" level="INFO">${session_alias} = ClusterManagement__session_3</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:14.762605" elapsed="0.000831"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:14.764009" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.171.151:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x72c8f0346390&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-10T00:54:14.763606" elapsed="0.000507"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.764276" elapsed="0.000188"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-10T00:54:14.760721" elapsed="0.003801"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:14.760524" elapsed="0.004058"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-10T00:54:14.749509" elapsed="0.015104"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.765193" level="INFO">${ClusterManagement__member_index_list} = [1, 2, 3]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:54:14.764781" elapsed="0.000456"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.765794" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.165', 2: '10.30.170.169', 3: '10.30.171.151'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:54:14.765398" elapsed="0.000439"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.766363" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1', 'ClusterManagement__session_2', 'ClusterManagement__session_3']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:54:14.765996" elapsed="0.000409"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-10T00:54:14.747764" elapsed="0.018739"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-10T00:54:14.740476" elapsed="0.026100"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:14.766767" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:14.766648" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:14.766628" elapsed="0.000206"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.770335" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:14.769758" elapsed="0.000606"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.770851" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:14.770528" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:14.770923" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:54:14.771083" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:14.769399" elapsed="0.001710"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:14.772104" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.771843" elapsed="0.000287"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:14.772889" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:14.772718" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:14.775775" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:14.775403" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:14.775383" elapsed="0.000601"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:14.776263" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:14.776136" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.777529" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:14.776587" elapsed="0.001007"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:14.778398" level="INFO">${conn_id} = 223</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:14.777757" elapsed="0.000667"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:14.779746" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:54:14.779949" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:14.779176" elapsed="0.000821"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:14.780280" elapsed="0.000639"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:54:14.782629" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:54:15.099733" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:53:24 UTC 2026

  System load:  0.55               Processes:             124
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:53:24 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:54:14.782221" elapsed="0.318057"/>
</kw>
<msg time="2026-04-10T00:54:15.100403" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:14.781292" elapsed="0.319323"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:54:14.778659" elapsed="0.322226"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:54:15.101533" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-10T00:54:15.114406" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-10T00:54:15.114871" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:54:15.114978" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:54:15.101149" elapsed="0.013885"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:15.115483" elapsed="0.000566"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:15.117769" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:15.116493" elapsed="0.001390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:15.118430" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:15.118071" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:15.118017" elapsed="0.000623"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:54:15.119058" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-04-10T00:54:15.118763" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:15.118728" elapsed="0.000530"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:15.119336" elapsed="0.000035"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:15.125015" 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-04-10T00:54:15.126516" elapsed="0.000653"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:15.127458" elapsed="0.000326"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:15.120203" elapsed="0.007707"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:54:14.774920" elapsed="0.353137"/>
</kw>
<msg time="2026-04-10T00:54:15.128140" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:14.774225" elapsed="0.353998"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:54:14.773744" elapsed="0.354598"/>
</kw>
<msg time="2026-04-10T00:54:15.128402" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:14.773213" elapsed="0.355257"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:15.131649" elapsed="0.000334"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:15.132151" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:15.132450" elapsed="0.000129"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:15.128956" elapsed="0.003678"/>
</kw>
<msg time="2026-04-10T00:54:15.132737" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:54:14.772345" elapsed="0.360419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:15.133200" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:15.132948" elapsed="0.000296"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:54:15.133286" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:54:14.771473" elapsed="0.361967"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:14.771297" elapsed="0.362263"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:15.134736" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:15.134374" elapsed="0.000396"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:15.135507" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:15.135365" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:15.138676" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:15.138339" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:15.138321" elapsed="0.000564"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:15.139171" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:15.139038" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:15.140443" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:15.139482" elapsed="0.001009"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:15.141351" level="INFO">${conn_id} = 226</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:15.140674" elapsed="0.000742"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:15.142798" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:54:15.143017" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:15.142207" elapsed="0.000862"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:15.143355" elapsed="0.000660"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:54:15.145680" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:54:15.480983" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:53:25 UTC 2026

  System load:  0.76               Processes:             125
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.169
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:53:25 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:54:15.145238" elapsed="0.335985"/>
</kw>
<msg time="2026-04-10T00:54:15.481328" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:15.144344" elapsed="0.337184"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:54:15.141661" elapsed="0.340174"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:54:15.482388" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-10T00:54:15.495212" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-10T00:54:15.495599" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:54:15.495705" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:54:15.482084" elapsed="0.013675"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:15.496135" elapsed="0.000537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:15.498375" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:15.497089" elapsed="0.001531"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:15.499181" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:15.498823" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:15.498767" elapsed="0.000578"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:54:15.499853" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-04-10T00:54:15.499463" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:15.499429" elapsed="0.000625"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:15.500130" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:15.505595" elapsed="0.001250"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:15.507169" elapsed="0.000595"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:15.508030" 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-04-10T00:54:15.500931" elapsed="0.007483"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:54:15.137845" elapsed="0.370746"/>
</kw>
<msg time="2026-04-10T00:54:15.508675" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:15.137109" elapsed="0.371641"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:54:15.136602" elapsed="0.372259"/>
</kw>
<msg time="2026-04-10T00:54:15.508919" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:15.135826" elapsed="0.373154"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:15.512433" elapsed="0.000343"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:15.512940" elapsed="0.000147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:15.513236" elapsed="0.000096"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:15.509391" elapsed="0.003991"/>
</kw>
<msg time="2026-04-10T00:54:15.513476" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:54:15.134998" elapsed="0.378503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:15.514053" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:15.513768" elapsed="0.000327"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:54:15.514139" elapsed="0.000032"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:54:15.133876" elapsed="0.380397"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:15.133674" elapsed="0.380648"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:15.515364" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:15.515093" elapsed="0.000298"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:15.516129" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:15.515992" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:15.519090" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:15.518767" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:15.518746" elapsed="0.000543"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:15.519662" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:15.519441" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:15.520920" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:15.519975" elapsed="0.000994"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:15.521871" level="INFO">${conn_id} = 229</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:15.521131" elapsed="0.000772"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:15.523231" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:54:15.523435" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:15.522675" elapsed="0.000810"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:15.523789" elapsed="0.000814"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:54:15.526189" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:54:15.843634" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:53:25 UTC 2026

  System load:  0.91               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:53:26 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:54:15.525782" elapsed="0.318083"/>
</kw>
<msg time="2026-04-10T00:54:15.843973" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:15.524935" elapsed="0.319215"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:54:15.522134" elapsed="0.322313"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:54:15.845057" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-10T00:54:15.857465" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-10T00:54:15.857932" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:54:15.858062" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:54:15.844738" elapsed="0.013393"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:15.858590" elapsed="0.000545"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:15.860785" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:15.859601" elapsed="0.001298"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:15.861428" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:15.861081" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:15.861030" elapsed="0.000603"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:54:15.862163" elapsed="0.000076"/>
</return>
<status status="PASS" start="2026-04-10T00:54:15.861756" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:15.861721" elapsed="0.000656"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:15.862457" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:15.866799" elapsed="0.001267"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:15.868431" elapsed="0.000686"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:15.869432" elapsed="0.000319"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:15.863092" elapsed="0.006825"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:54:15.518245" elapsed="0.351833"/>
</kw>
<msg time="2026-04-10T00:54:15.870282" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:15.517475" elapsed="0.352892"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:54:15.516989" elapsed="0.353494"/>
</kw>
<msg time="2026-04-10T00:54:15.870539" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:15.516413" elapsed="0.354217"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:15.873379" elapsed="0.000340"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:15.873915" elapsed="0.000176"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:15.874254" elapsed="0.000099"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:15.870956" elapsed="0.003449"/>
</kw>
<msg time="2026-04-10T00:54:15.874497" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:54:15.515627" elapsed="0.358896"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:15.874993" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:15.874735" elapsed="0.000301"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:54:15.875081" elapsed="0.000040"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:54:15.514716" elapsed="0.360545"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:15.514429" elapsed="0.360883"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:14.771165" elapsed="1.104196"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:54:14.767058" elapsed="1.108375"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-10T00:54:15.875669" elapsed="0.000225"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:15.890079" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:15.889963" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:15.889943" elapsed="0.000207"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:15.890446" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:15.890308" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:15.891015" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:15.890753" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:15.891457" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:15.891215" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:15.892278" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-10T00:54:15.892052" elapsed="0.000471">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-10T00:54:15.892658" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:54:15.892704" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:15.891684" elapsed="0.001043"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:15.893034" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:15.892805" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:15.892786" elapsed="0.000350"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:15.894028" level="INFO">${ip_address} = 10.30.170.165</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:15.893692" elapsed="0.000368"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:54:15.894117" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:54:15.894299" level="INFO">${odl_ip} = 10.30.170.165</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:15.893340" elapsed="0.000988"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:15.894488" elapsed="0.000424"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:15.895211" level="INFO">index=232
host=10.30.170.165
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:54:15.897941" elapsed="0.240820"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:16.146262" 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-04-10T00:54:16.146929" elapsed="0.000170"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:16.147255" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:16.140344" elapsed="0.007072"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:16.139333" elapsed="0.008131"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:54:15.889635" elapsed="0.257882"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:54:15.876757" elapsed="0.270824"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:15.876305" elapsed="0.271329"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:15.876142" elapsed="0.271531"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:16.161027" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:16.160909" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.160887" elapsed="0.000216"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:16.161397" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:16.161261" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:16.161990" level="INFO">{1: 232}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:16.161722" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:16.162528" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:16.162269" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:16.163462" level="FAIL">Dictionary does not contain key '2'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-10T00:54:16.163233" elapsed="0.000353">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-04-10T00:54:16.163697" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:54:16.163743" level="INFO">${old_connection_index} = Dictionary does not contain key '2'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.162861" elapsed="0.000905"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:16.164069" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:16.163842" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.163824" elapsed="0.000344"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:16.164932" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:16.164660" elapsed="0.000299"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:54:16.165008" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:54:16.165163" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:16.164370" elapsed="0.000819"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:16.165347" elapsed="0.000419"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:16.166108" level="INFO">index=234
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:54:16.168907" elapsed="0.286371"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:16.458807" elapsed="0.000328"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:16.459311" elapsed="0.000169"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:16.459652" elapsed="0.000110"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:16.456429" elapsed="0.003388"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:16.455722" elapsed="0.004142"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:54:16.160604" elapsed="0.299315"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:54:16.148313" elapsed="0.311659"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.147934" elapsed="0.312093"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:16.147789" elapsed="0.312347"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:16.473375" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:16.473256" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.473233" elapsed="0.000220"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:16.473772" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:16.473629" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:16.474371" level="INFO">{1: 232, 2: 234}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:16.474071" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:16.474844" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:16.474595" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:16.475674" level="FAIL">Dictionary does not contain key '3'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-10T00:54:16.475425" elapsed="0.000357">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-04-10T00:54:16.475892" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:54:16.475938" level="INFO">${old_connection_index} = Dictionary does not contain key '3'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.475058" elapsed="0.000902"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:16.476264" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:16.476037" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.476018" elapsed="0.000345"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:16.477351" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:16.477073" elapsed="0.000306"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:54:16.477429" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:54:16.477606" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:16.476581" elapsed="0.001051"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:16.477798" elapsed="0.000407"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:16.478529" level="INFO">index=236
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:54:16.481194" elapsed="0.220456"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:16.705158" elapsed="0.000335"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:16.705690" elapsed="0.000177"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:16.706168" elapsed="0.000108"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:16.702769" elapsed="0.003561"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:16.702035" elapsed="0.004342"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:54:16.472958" elapsed="0.233471"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:54:16.460797" elapsed="0.245772"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.460393" elapsed="0.246239"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:16.460243" elapsed="0.246431"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-10T00:54:15.875962" elapsed="0.830755"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-10T00:54:14.740031" elapsed="1.966753"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:16.709516" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:16.709393" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.709367" elapsed="0.000252"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:16.714814" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:16.714696" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.714676" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:16.715888" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:16.715457" elapsed="0.000460"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:16.716391" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:16.716081" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:16.716464" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:54:16.716658" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:16.715116" 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-04-10T00:54:16.722269" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:16.722149" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.722128" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:16.724906" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:16.724645" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.724604" elapsed="0.000456"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:16.726055" level="INFO">${karaf_connection_index} = 232</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:16.725408" elapsed="0.000708"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:16.727064" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:16.726529" elapsed="0.000595"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:16.759944" 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 "p "e "[78Cn "[A[78Cf</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:16.728316" elapsed="0.031818"/>
</kw>
<msg time="2026-04-10T00:54:16.760256" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:16.760304" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.727505" elapsed="0.032847"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:16.836882" level="INFO">"l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "3 "0 "_ "_ "C "l "u "s "t "e "r "_ "H "A "_ "D "a "t "a "_ "R "e "c "o "v "e "r "y "_ "B "u "l "k "F "l "o "w "_ "S "i "n "g "l "e "_ "S "[78Cw "[A[78Ci
 "t "c "h ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:16.760965" elapsed="0.076348"/>
</kw>
<msg time="2026-04-10T00:54:16.837485" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:16.837534" level="INFO">${message_wait} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.760595" elapsed="0.077002"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:16.838085" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:16.837731" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.837688" elapsed="0.000489"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:16.838752" level="INFO"> "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "3 "0 "_ "_ "C "l "u "s "t "e "r "_ "H "A "_ "D "a "t "a "_ "R "e "c "o "v "e "r "y "_ "B "u "l "k "F "l "o "w "_ "S "i "n "g "l "e "_ "S "[78Cw "[A[78Ci
 "t "c "h ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:16.838327" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:16.839163" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:16.838937" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.838918" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:16.839280" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:16.840716" elapsed="0.000588"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:16.841625" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:16.842369" elapsed="0.000500"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:16.840244" elapsed="0.002768"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:16.839655" elapsed="0.003407"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:16.723995" elapsed="0.119167"/>
</kw>
<msg time="2026-04-10T00:54:16.843258" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:16.843303" level="INFO">${message} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.722729" elapsed="0.120612"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:16.843529" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T00:54:16.843420" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.843401" elapsed="0.000231"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:16.844045" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:16.844389" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:16.844463" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:16.721847" elapsed="0.122743"/>
</kw>
<msg time="2026-04-10T00:54:16.844688" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:16.844732" level="INFO">${output} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.717078" elapsed="0.127691"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:16.845100" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:16.844846" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.844829" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:16.716927" elapsed="0.128277"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:16.850527" elapsed="0.000130"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:16.850417" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.850399" elapsed="0.000363"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:16.851813" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:16.851706" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.851688" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:16.852295" level="INFO">${karaf_connection_index} = 234</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:16.852030" elapsed="0.000292"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:16.852714" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:16.852484" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:16.893688" 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 "p "e "[78Cn "[A[78Cf</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:16.853245" elapsed="0.040577"/>
</kw>
<msg time="2026-04-10T00:54:16.893926" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:16.893972" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.852903" elapsed="0.041106"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:16.978601" level="INFO">"l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "3 "0 "_ "_ "C "l "u "s "t "e "r "_ "H "A "_ "D "a "t "a "_ "R "e "c "o "v "e "r "y "_ "B "u "l "k "F "l "o "w "_ "S "i "n "g "l "e "_ "S "[78Cw "[A[78Ci
 "t "c "h ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:16.894613" elapsed="0.084287"/>
</kw>
<msg time="2026-04-10T00:54:16.979029" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:16.979076" level="INFO">${message_wait} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.894207" elapsed="0.084906"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:16.979471" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:16.979209" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.979182" elapsed="0.000404"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:16.980045" level="INFO"> "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "3 "0 "_ "_ "C "l "u "s "t "e "r "_ "H "A "_ "D "a "t "a "_ "R "e "c "o "v "e "r "y "_ "B "u "l "k "F "l "o "w "_ "S "i "n "g "l "e "_ "S "[78Cw "[A[78Ci
 "t "c "h ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:16.979739" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:16.980464" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:16.980227" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.980209" elapsed="0.000360"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:16.980609" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:16.981970" 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-04-10T00:54:16.982916" elapsed="0.000462"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:16.983669" elapsed="0.000201"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:16.981512" elapsed="0.002508"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:16.980914" elapsed="0.003154"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:16.851434" elapsed="0.132735"/>
</kw>
<msg time="2026-04-10T00:54:16.984313" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:16.984361" level="INFO">${message} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.850921" elapsed="0.133478"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:16.984665" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:54:16.984532" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.984511" elapsed="0.000240"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:16.985166" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:16.985807" elapsed="0.000059"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:16.985924" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:16.850115" elapsed="0.135930"/>
</kw>
<msg time="2026-04-10T00:54:16.986144" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:16.986199" level="INFO">${output} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.845492" elapsed="0.140760"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:16.986694" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:16.986344" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.986325" elapsed="0.000463"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:16.845344" elapsed="0.141479"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:16.992251" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:16.992141" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.992123" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:16.993401" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:16.993273" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:16.993256" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:16.993988" level="INFO">${karaf_connection_index} = 236</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:16.993687" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:16.994394" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:16.994191" elapsed="0.000229"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:17.036813" 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 "p "e "[78Cn "[A[78Cf</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:16.994967" elapsed="0.041991"/>
</kw>
<msg time="2026-04-10T00:54:17.037085" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:17.037135" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.994599" elapsed="0.042573"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:17.120084" level="INFO">"l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "3 "0 "_ "_ "C "l "u "s "t "e "r "_ "H "A "_ "D "a "t "a "_ "R "e "c "o "v "e "r "y "_ "B "u "l "k "F "l "o "w "_ "S "i "n "g "l "e "_ "S "[78Cw "[A[78Ci
 "t "c "h ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:17.037751" elapsed="0.082588"/>
</kw>
<msg time="2026-04-10T00:54:17.120465" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:17.120513" level="INFO">${message_wait} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:17.037356" elapsed="0.083216"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.120951" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.120681" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.120650" elapsed="0.000394"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.121514" level="INFO"> "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "3 "0 "_ "_ "C "l "u "s "t "e "r "_ "H "A "_ "D "a "t "a "_ "R "e "c "o "v "e "r "y "_ "B "u "l "k "F "l "o "w "_ "S "i "n "g "l "e "_ "S "[78Cw "[A[78Ci
 "t "c "h ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.121199" elapsed="0.000525"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.122032" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.121802" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.121783" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:17.122158" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:17.123594" elapsed="0.000598"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:17.124524" elapsed="0.000525"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:17.125351" elapsed="0.000224"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:17.123122" elapsed="0.002590"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:17.122467" elapsed="0.003294"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:16.993021" elapsed="0.132846"/>
</kw>
<msg time="2026-04-10T00:54:17.125963" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:17.126008" level="INFO">${message} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.992470" elapsed="0.133575"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:17.126247" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:54:17.126133" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.126109" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.126823" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.127228" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.127318" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:16.991836" elapsed="0.135600"/>
</kw>
<msg time="2026-04-10T00:54:17.127535" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:17.127607" level="INFO">${output} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.987110" elapsed="0.140540"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.128010" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.127735" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.127715" elapsed="0.000376"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:16.986963" elapsed="0.141153"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:16.716744" elapsed="0.411418"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:54:16.714308" elapsed="0.413938"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-10T00:54:16.707397" elapsed="0.420913"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:16.706948" elapsed="0.421410"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-10T00:54:14.734705" elapsed="2.393710"/>
</kw>
<test id="s1-s3-t1" name="Check Shards Status And Initialize Variables" line="30">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:54:17.132185" elapsed="0.000264"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:54:17.131866" elapsed="0.000648"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.133783" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:17.133529" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.133508" 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-04-10T00:54:17.139071" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:17.138860" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.138839" elapsed="0.000310"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.140421" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:17.139841" elapsed="0.000620"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.141156" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:17.140717" elapsed="0.000476"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:17.141257" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:54:17.141493" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:17.139397" elapsed="0.002132"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.149152" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:17.149008" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.148978" elapsed="0.000263"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.150686" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:17.150571" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.150526" elapsed="0.000266"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:17.151314" level="INFO">${karaf_connection_index} = 232</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:17.150967" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:17.151768" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:17.151514" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:17.190005" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:17.152368" elapsed="0.037870"/>
</kw>
<msg time="2026-04-10T00:54:17.190481" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:17.190531" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:17.151980" elapsed="0.038613"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:17.267395" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "n "d "[C "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:17.191397" elapsed="0.076315"/>
</kw>
<msg time="2026-04-10T00:54:17.267961" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:17.268011" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:17.190888" elapsed="0.077162"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.268540" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.268182" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.268139" elapsed="0.000517"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.269209" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "n "d "[C "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.268808" elapsed="0.000496"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.269622" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.269373" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.269354" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:17.269741" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:17.271440" elapsed="0.000857"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:17.272643" elapsed="0.000500"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:17.273422" elapsed="0.000409"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:17.270676" elapsed="0.003261"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:17.270072" elapsed="0.003931"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:17.150187" elapsed="0.123918"/>
</kw>
<msg time="2026-04-10T00:54:17.274203" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:17.274248" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:17.149446" elapsed="0.124839"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:17.274472" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:54:17.274363" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.274345" elapsed="0.000242"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.275038" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.275381" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.275453" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:17.148481" elapsed="0.127101"/>
</kw>
<msg time="2026-04-10T00:54:17.275681" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:17.275737" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:17.142106" elapsed="0.133687"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.276141" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.275882" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.275864" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:17.141897" elapsed="0.134344"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.281762" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:17.281652" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.281633" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.283231" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:17.283122" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.283104" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:17.283812" level="INFO">${karaf_connection_index} = 234</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:17.283467" elapsed="0.000372"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:17.284258" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:17.284004" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:17.319135" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:17.284844" elapsed="0.034546"/>
</kw>
<msg time="2026-04-10T00:54:17.319654" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:17.319705" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:17.284456" elapsed="0.035289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:17.397089" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "n "d "[C "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:17.320514" elapsed="0.077013"/>
</kw>
<msg time="2026-04-10T00:54:17.397788" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:17.397838" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:17.320044" elapsed="0.077833"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.398349" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.398006" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.397967" elapsed="0.000473"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.399049" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "n "d "[C "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.398623" elapsed="0.000519"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.399435" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.399212" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.399194" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:17.399570" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:17.401457" elapsed="0.000823"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:17.402576" elapsed="0.000506"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:17.403353" elapsed="0.000378"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:17.400798" elapsed="0.003037"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:17.399911" elapsed="0.003988"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:17.282702" elapsed="0.121296"/>
</kw>
<msg time="2026-04-10T00:54:17.404092" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:17.404137" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:17.281988" elapsed="0.122186"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:17.404358" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:54:17.404251" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.404234" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.404887" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.405225" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.405299" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:17.281266" elapsed="0.124141"/>
</kw>
<msg time="2026-04-10T00:54:17.405514" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:17.405579" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:17.276534" elapsed="0.129083"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.405945" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.405693" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.405676" elapsed="0.000346"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:17.276380" elapsed="0.129666"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.411503" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:17.411395" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.411377" elapsed="0.000256"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.412906" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:17.412798" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.412779" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:17.413441" level="INFO">${karaf_connection_index} = 236</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:17.413122" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:17.413876" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:17.413655" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:17.454122" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:17.414406" elapsed="0.039884"/>
</kw>
<msg time="2026-04-10T00:54:17.454514" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:17.454585" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:17.414064" elapsed="0.040559"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:17.534523" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "n "d "[C "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:17.455326" elapsed="0.079478"/>
</kw>
<msg time="2026-04-10T00:54:17.535082" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:17.535132" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:17.454864" elapsed="0.080307"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.535693" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.535321" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.535278" elapsed="0.000509"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.536342" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "s "[C "S "t "a "t "u "s "[C "A "n "d "[C "I "n "i "t "i "a "l "i "z "e "[C "V "a "r "i "a "b "l "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.535936" elapsed="0.000502"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.536749" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.536506" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.536488" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:17.536865" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:17.538789" elapsed="0.000994"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:17.540140" elapsed="0.000603"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:17.541081" elapsed="0.000433"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:17.537973" elapsed="0.003691"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:17.537238" elapsed="0.004510"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:17.412375" elapsed="0.129512"/>
</kw>
<msg time="2026-04-10T00:54:17.542016" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:17.542075" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:17.411795" elapsed="0.130330"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:17.542396" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T00:54:17.542243" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.542213" elapsed="0.000402"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.543250" 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-04-10T00:54:17.544086" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.544180" 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-04-10T00:54:17.411035" elapsed="0.133294"/>
</kw>
<msg time="2026-04-10T00:54:17.544452" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:17.544508" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:17.406340" elapsed="0.138260"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.545267" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.544705" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.544681" elapsed="0.000684"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:17.406178" elapsed="0.139219"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:17.141640" elapsed="0.403799"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:54:17.138366" elapsed="0.407144"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:54:17.133208" elapsed="0.412422"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:17.132719" elapsed="0.412975"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:54:17.129103" elapsed="0.416662"/>
</kw>
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:17.575487" elapsed="0.000342"/>
</kw>
<msg time="2026-04-10T00:54:17.575911" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:17.574497" elapsed="0.001495"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default', 'entity-ownership'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:54:17.573706" elapsed="0.002389"/>
</kw>
<msg time="2026-04-10T00:54:17.576156" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:17.561825" elapsed="0.014387"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:54:17.561079" elapsed="0.015233"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.576978" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.576622" elapsed="0.000413"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.583194" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:17.582619" elapsed="0.000610"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.583865" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:17.583442" elapsed="0.000458"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:17.583960" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:54:17.584174" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:17.582128" elapsed="0.002077"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:54:17.584411" elapsed="0.000230"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.585413" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:17.584959" elapsed="0.000487"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.585974" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:17.585671" elapsed="0.000335"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.586499" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:17.586201" elapsed="0.000331"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.590293" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:17.589786" elapsed="0.000548"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:17.590403" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:54:17.590650" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:17.589303" elapsed="0.001380"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.680641" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:17.680221" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:17.681441" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:17.681189" elapsed="0.000329">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:17.681627" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:17.680848" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.682202" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:17.681819" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:17.682531" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:17.682703" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:17.682389" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.683165" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.682889" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.684192" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.683938" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.684683" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:17.684399" 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-04-10T00:54:17.685047" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.685252" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.685429" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:17.684907" elapsed="0.000579"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.684764" elapsed="0.000753"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:17.685580" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:54:17.685747" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:17.683614" elapsed="0.002158"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.683287" elapsed="0.002517"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.685976" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.685828" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.683264" elapsed="0.002789"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.686720" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:17.686258" elapsed="0.000490"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:17.686797" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:17.679581" elapsed="0.007342"/>
</kw>
<msg time="2026-04-10T00:54:17.686977" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:17.666586" elapsed="0.020475"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.699385" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.712223" elapsed="0.000050"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.732063" elapsed="0.000107"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.733211" elapsed="0.000048"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.734175" 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-04-10T00:54:17.735015" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.734810" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:17.734784" elapsed="0.000391"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.735404" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.735684" 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-04-10T00:54:17.735931" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:17.734706" elapsed="0.001319"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.734351" elapsed="0.001725"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.737010" elapsed="0.000050"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.737175" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:54:17.737525" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:17.660384" elapsed="0.077322"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:17.742034" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:17.741357" elapsed="0.000780">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:17.742387" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:17.740703" elapsed="0.001739"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.743248" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.742650" elapsed="0.000686"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.744248" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:17.743790" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.743390" elapsed="0.000951"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.742576" elapsed="0.001812"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.748983" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:17.745322" elapsed="0.003741"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:17.749198" elapsed="0.000110"/>
</return>
<msg time="2026-04-10T00:54:17.749840" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:17.739125" elapsed="0.010842"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:17.753968" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:17.753367" elapsed="0.000705">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:17.754319" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:17.752703" elapsed="0.001672"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:17.754914" elapsed="0.000106"/>
</return>
<status status="PASS" start="2026-04-10T00:54:17.754579" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.754490" elapsed="0.000702"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.756107" elapsed="0.000047"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.757057" elapsed="0.000050"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.757207" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:54:17.760097" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:17.751112" elapsed="0.009115"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.765518" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.764929" elapsed="0.000987"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.767369" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.766826" elapsed="0.000667"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:17.784461" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:17.785682" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:54:17 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:17.786333" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:17.771412" elapsed="0.014989"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.767693" elapsed="0.018917"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.787456" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.786741" elapsed="0.000933"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.767623" elapsed="0.020135"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.795838" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.791875" elapsed="0.004418"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.791356" elapsed="0.004989"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.791304" elapsed="0.005076"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.800117" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.796844" elapsed="0.003339"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.796494" elapsed="0.003739"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.796468" elapsed="0.003799"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.801176" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:17.800608" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.801710" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.801347" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.802499" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:17.802059" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.801828" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.801319" elapsed="0.001321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.803461" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:17.802899" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.803927" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.803655" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.804478" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:17.804172" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.804009" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.803626" elapsed="0.000953"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:17.804759" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:17.805634" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:17.805305" elapsed="0.000356"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:17.805838" elapsed="0.002410"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:17.789532" elapsed="0.018842"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.808747" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:17.808505" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.808454" elapsed="0.000471"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:17.818676" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:17.809694" elapsed="0.009033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:17.818811" elapsed="0.000075"/>
</return>
<msg time="2026-04-10T00:54:17.819159" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:17.761171" elapsed="0.058132"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:17.819868" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:54:17.820051" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:17.601895" elapsed="0.218183"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.820426" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.820165" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.820148" elapsed="0.000526"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:17.820709" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:17.596315" elapsed="0.224529"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.590781" elapsed="0.230108"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.590756" elapsed="0.230157"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.821749" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:17.821639" elapsed="0.000161"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:54:17.822056" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:54:17.821822" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.821621" elapsed="0.000516"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.822290" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:54:17.822412" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:17.821339" elapsed="0.001099"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.823006" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:17.822625" elapsed="0.000408"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.823699" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:17.823210" elapsed="0.000517"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.829456" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.829013" elapsed="0.000491"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.830116" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.829677" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:17.847496" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:17.847839" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:17 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":584,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":584,"Leader":"member-2-shard-inventory-operational","LastIndex":585,"RaftState":"Follower","LastApplied":585,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":585,"LastLeadershipChangeTime":"2026-04-10 00:52:30.161","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"314.8 μs","Voting":true,"CurrentTerm":4,"LastTerm":4,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":4,"StatRetrievalError":null,"CommitIndex":585,"SnapshotTerm":4,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":63848883},"timestamp":1775782457,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:17.848034" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:17.841651" elapsed="0.006488"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.830228" elapsed="0.018165"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.848595" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.848423" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.830210" elapsed="0.018727"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.853895" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":584,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":584,"Leader":"member-2-shard-inventory-operational","LastIndex":585,"RaftState":"Follower","LastApplied":585,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":585,"LastLeadershipChangeTime":"2026-04-10 00:52:30.161","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"314.8 μs","Voting":true,"CurrentTerm":4,"LastTerm":4,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":4,"StatRetrievalError":null,"CommitIndex":585,"SnapshotTerm":4,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":63848883},"timestamp":1775782457,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.851064" elapsed="0.002948"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.850132" elapsed="0.003930"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.850113" elapsed="0.003988"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.858261" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.855063" elapsed="0.003337"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.854186" elapsed="0.004281"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.854167" elapsed="0.004354"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.860720" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:17.859439" elapsed="0.001367"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.861710" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.861039" elapsed="0.000795"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.863075" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:17.862348" elapsed="0.000791"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.861887" elapsed="0.001362"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.861010" elapsed="0.002295"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.864908" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:17.864151" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.865613" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.865135" elapsed="0.000566"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.866581" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:17.866069" elapsed="0.000560"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.865738" elapsed="0.000941"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.865115" elapsed="0.001600"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:17.866940" elapsed="0.000720"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:17.868470" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:17.867975" elapsed="0.000555"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:17.868832" elapsed="0.002490"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:17.849421" elapsed="0.022060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.871785" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:17.871654" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.871536" elapsed="0.000318"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:17.875465" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:17.872001" elapsed="0.003494"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:17.875685" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:54:17.875852" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:17.824706" elapsed="0.051212"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:17.875980" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:17.876132" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:17.823949" elapsed="0.052210"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.877225" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:17.876751" elapsed="0.000503"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:17.877302" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:17.877479" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:17.876387" elapsed="0.001119"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:17.877889" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 585, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:17.877683" elapsed="0.000233"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:17.878289" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:17.878074" elapsed="0.000241"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:17.878361" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:17.878512" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:17.588524" elapsed="0.290012"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:17.878615" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:17.878764" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:17.587585" elapsed="0.291204"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:17.879089" elapsed="0.000226"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.878870" elapsed="0.000483"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.879526" elapsed="0.000096"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.879377" elapsed="0.000282"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.879833" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.879682" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.878853" elapsed="0.001053"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:17.587300" elapsed="0.292631"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.882288" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:17.881966" elapsed="0.000349"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:17.882359" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:17.882506" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:17.881624" elapsed="0.000906"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.970711" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:17.970297" elapsed="0.000446"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:17.971619" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:17.971259" elapsed="0.000517">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:17.971876" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:17.970919" elapsed="0.000982"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.972465" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:17.972072" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:17.972824" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:17.972976" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:17.972679" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.973404" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.973159" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.974440" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:17.974183" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.974932" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:17.974661" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.975337" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.975564" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.975742" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:17.975152" elapsed="0.000647"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:17.975011" elapsed="0.000818"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:17.975877" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:54:17.976044" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:17.973860" elapsed="0.002209"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.973527" elapsed="0.002574"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.976274" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:17.976127" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.973503" elapsed="0.002845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:17.976948" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:17.976492" elapsed="0.000484"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:17.977025" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:17.969665" elapsed="0.007483"/>
</kw>
<msg time="2026-04-10T00:54:17.977203" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:17.955696" elapsed="0.021590"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:17.992492" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.005235" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.017963" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.018833" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.019700" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.020323" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.020154" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:18.020128" elapsed="0.000283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.020620" 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-04-10T00:54:18.020826" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.021014" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:18.020071" elapsed="0.001018"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.019833" elapsed="0.001298"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.021875" elapsed="0.000037"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.021997" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:54:18.022259" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:17.949507" elapsed="0.072863"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:18.025996" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:18.025673" elapsed="0.000403">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:18.026281" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:18.025132" elapsed="0.001197"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.026920" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.026477" elapsed="0.000514"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.027798" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.027364" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.027035" elapsed="0.000837"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.026420" elapsed="0.001490"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.031248" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:18.028664" elapsed="0.002631"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:18.031436" elapsed="0.000080"/>
</return>
<msg time="2026-04-10T00:54:18.031954" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:18.023508" elapsed="0.008554"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:18.034784" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:18.034511" elapsed="0.000345">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:18.035147" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:18.034061" elapsed="0.001134"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:18.035739" elapsed="0.000084"/>
</return>
<status status="PASS" start="2026-04-10T00:54:18.035364" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.035280" elapsed="0.000662"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.036690" 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-04-10T00:54:18.037477" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.037603" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:54:18.039969" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:18.032918" elapsed="0.007157"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.044063" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.043524" elapsed="0.000639"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.045265" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.044877" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:18.070384" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:18.071420" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:54:18 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:18.071912" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:18.047804" elapsed="0.024146"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.045489" elapsed="0.026568"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.072533" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.072136" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.045439" elapsed="0.027266"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.078846" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.075080" elapsed="0.004229"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.074768" elapsed="0.004641"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.074739" elapsed="0.004710"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.082994" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.079895" elapsed="0.003160"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.079581" elapsed="0.003517"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.079540" elapsed="0.003590"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.083980" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.083456" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.084439" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.084128" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.085157" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.084772" elapsed="0.000419"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.084540" elapsed="0.000696"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.084103" elapsed="0.001159"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.085973" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.085494" elapsed="0.000512"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.086420" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.086119" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.087127" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.086755" elapsed="0.000405"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.086522" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.086095" elapsed="0.001137"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:18.087483" elapsed="0.000459"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:18.088569" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.088181" elapsed="0.000423"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.088828" elapsed="0.003149"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:18.073766" elapsed="0.018350"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.092483" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:18.092254" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.092200" elapsed="0.000458"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:18.102510" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:18.093503" elapsed="0.009080"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:18.102681" elapsed="0.000079"/>
</return>
<msg time="2026-04-10T00:54:18.103039" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:18.040747" elapsed="0.062400"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:18.103709" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:54:18.103902" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:17.891092" elapsed="0.212837"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.104337" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.104025" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.104006" elapsed="0.000605"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:18.104646" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:17.886884" elapsed="0.217893"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:17.882614" elapsed="0.222208"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:17.882596" elapsed="0.222252"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.105505" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:18.105393" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:54:18.105703" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:54:18.105601" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.105376" elapsed="0.000410"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.105956" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:54:18.106078" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:18.105091" elapsed="0.001014"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.106744" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.106292" elapsed="0.000479"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.107419" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.106927" elapsed="0.000527"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.113486" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.112968" elapsed="0.000702"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.114278" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.113839" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:18.134034" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:18.134180" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":97,"SnapshotIndex":584,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":584,"Leader":"member-2-shard-inventory-operational","LastIndex":585,"RaftState":"Leader","LastApplied":585,"LastCommittedTransactionTime":"2026-04-10 00:53:49.973","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational","LastLogIndex":585,"LastLeadershipChangeTime":"2026-04-10 00:52:30.149","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.056","active":true,"matchIndex":585,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":586},{"timeSinceLastActivity":"00:00:00.056","active":true,"matchIndex":585,"voting":true,"id":"member-3-shard-inventory-operational","nextIndex":586}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"734.7 μs","CurrentTerm":4,"LastTerm":4,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":74,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-3-shard-inventory-operational: true","LastLogTerm":4,"StatRetrievalError":null,"CommitIndex":585,"SnapshotTerm":4,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":23971489},"timestamp":1775782458,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:18.134388" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:18.125900" elapsed="0.008596"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.114404" elapsed="0.020407"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.135014" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.134846" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.114380" elapsed="0.021115"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.142743" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":97,"SnapshotIndex":584,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":584,"Leader":"member-2-shard-inventory-operational","LastIndex":585,"RaftState":"Leader","LastApplied":585,"LastCommittedTransactionTime":"2026-04-10 00:53:49.973","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational","LastLogIndex":585,"LastLeadershipChangeTime":"2026-04-10 00:52:30.149","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.056","active":true,"matchIndex":585,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":586},{"timeSinceLastActivity":"00:00:00.056","active":true,"matchIndex":585,"voting":true,"id":"member-3-shard-inventory-operational","nextIndex":586}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"734.7 μs","CurrentTerm":4,"LastTerm":4,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":74,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-3-shard-inventory-operational: true","LastLogTerm":4,"StatRetrievalError":null,"CommitIndex":585,"SnapshotTerm":4,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":23971489},"timestamp":1775782458,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.138764" elapsed="0.004148"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.137436" elapsed="0.005546"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.137409" elapsed="0.005628"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.148016" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.144463" elapsed="0.003653"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.143155" elapsed="0.005010"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.143129" elapsed="0.005074"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.149686" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.148873" elapsed="0.000876"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.150394" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.149919" elapsed="0.000564"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.151398" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.150887" elapsed="0.000593"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.150521" elapsed="0.001020"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.149898" elapsed="0.001707"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.153025" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.152254" elapsed="0.000834"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.153742" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.153256" elapsed="0.000574"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.154824" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.154199" elapsed="0.000672"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.153867" elapsed="0.001054"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.153236" elapsed="0.001720"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:18.155185" elapsed="0.000710"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:18.156737" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.156208" elapsed="0.000589"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.157083" elapsed="0.002851"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:18.136427" elapsed="0.023670"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.160302" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:18.160173" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.160154" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:18.164221" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:18.160519" elapsed="0.003732"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:18.164345" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:54:18.164512" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:18.108507" elapsed="0.056032"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:18.164612" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:18.164764" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:18.107736" elapsed="0.057054"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.165862" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.165366" elapsed="0.000525"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:18.165940" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:18.166118" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:18.165019" elapsed="0.001126"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:18.166505" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 585, 'CommittedTransactionsCount': 74, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.166302" elapsed="0.000230"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:18.166984" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.166784" elapsed="0.000225"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:18.167056" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:18.167207" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:17.881007" elapsed="0.286224"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:18.167289" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:54:18.167491" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:17.880271" elapsed="0.287251"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.167877" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.167640" elapsed="0.000294"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.168166" elapsed="0.000189"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.167958" elapsed="0.000435"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.168581" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.168417" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.167617" elapsed="0.001040"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:17.880099" elapsed="0.288582"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.171064" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.170742" elapsed="0.000350"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:18.171137" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:18.171284" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:18.170362" elapsed="0.000946"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.262231" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.261780" elapsed="0.000575"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:18.263176" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:18.262911" elapsed="0.000340">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:18.263347" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:18.262539" elapsed="0.000834"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.264027" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:18.263598" elapsed="0.000456"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:18.264363" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:18.264524" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:18.264218" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.264977" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.264729" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.266104" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.265845" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.266603" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.266314" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.266962" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.267175" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.267364" elapsed="0.000033"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:18.266825" elapsed="0.000622"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.266684" elapsed="0.000848"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:18.267615" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:54:18.267830" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:18.265476" elapsed="0.002382"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.265108" elapsed="0.002788"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.268081" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.267924" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.265083" elapsed="0.003111"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.268898" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.268357" elapsed="0.000569"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:18.268976" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:18.260943" elapsed="0.008163"/>
</kw>
<msg time="2026-04-10T00:54:18.269164" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:18.246954" elapsed="0.022340"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.282510" elapsed="0.000083"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.295192" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.307860" elapsed="0.000048"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.308692" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.309468" 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-04-10T00:54:18.310093" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.309936" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:18.309916" 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-04-10T00:54:18.310336" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.310521" 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-04-10T00:54:18.310723" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:18.309858" elapsed="0.000939"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.309622" elapsed="0.001218"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.311613" elapsed="0.000043"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.311759" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:54:18.312031" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:18.239764" elapsed="0.072376"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:18.315149" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:18.314850" elapsed="0.000376">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:18.315414" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:18.314340" elapsed="0.001119"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.316044" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.315650" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.316748" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.316429" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.316151" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.315596" elapsed="0.001265"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.320097" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:18.317684" elapsed="0.002458"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:18.320219" elapsed="0.000063"/>
</return>
<msg time="2026-04-10T00:54:18.320533" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:18.313149" elapsed="0.007506"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:18.323443" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:18.323198" elapsed="0.000308">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:18.323761" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:18.322766" elapsed="0.001048"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:18.324205" elapsed="0.000080"/>
</return>
<status status="PASS" start="2026-04-10T00:54:18.323958" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.323905" elapsed="0.000487"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.325168" elapsed="0.000038"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.326057" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.326166" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:54:18.328426" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:18.321520" elapsed="0.007015"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.332520" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.332110" elapsed="0.000533"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.333924" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.333358" 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-04-10T00:54:18.362723" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:18.363745" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:54:18 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:18.364252" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:18.336412" elapsed="0.027901"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.334153" elapsed="0.030294"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.365285" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.364611" elapsed="0.000867"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.334102" elapsed="0.031495"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.373890" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.369721" elapsed="0.004501"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.369173" elapsed="0.005086"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.369124" elapsed="0.005160"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.376945" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.374606" elapsed="0.002385"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.374365" elapsed="0.002661"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.374346" elapsed="0.002703"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.377693" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.377252" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.378053" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.377812" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.378628" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.378298" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.378135" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.377793" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.379259" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.378898" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.379720" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.379375" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.380482" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.380177" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.379819" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.379356" elapsed="0.001226"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:18.380760" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:18.381614" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.381300" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.381823" elapsed="0.003935"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:18.367354" elapsed="0.018538"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.386247" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:18.386026" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.385974" elapsed="0.000421"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:18.396975" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:18.387149" elapsed="0.009897"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:18.397158" elapsed="0.000092"/>
</return>
<msg time="2026-04-10T00:54:18.397571" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:18.329218" elapsed="0.068468"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:18.398169" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:54:18.398354" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:18.179952" elapsed="0.218430"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.398872" elapsed="0.000217"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.398485" elapsed="0.000812"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.398464" elapsed="0.000863"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:18.399362" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:18.175697" elapsed="0.223801"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.171375" elapsed="0.228185"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.171358" elapsed="0.229165"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.401279" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:18.401154" elapsed="0.000172"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:54:18.401451" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:54:18.401349" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.401135" elapsed="0.000402"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.401769" elapsed="0.000032"/>
</kw>
<msg time="2026-04-10T00:54:18.401925" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:18.400822" elapsed="0.001131"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.402622" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.402148" elapsed="0.000503"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.403290" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.402814" elapsed="0.000506"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.410403" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.409746" elapsed="0.000724"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.411286" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.410804" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:18.432934" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:18.433159" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":584,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":584,"Leader":"member-2-shard-inventory-operational","LastIndex":585,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":585,"LastLogIndex":585,"LastLeadershipChangeTime":"2026-04-10 00:53:13.340","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"362.6 μs","Voting":true,"CurrentTerm":4,"LastTerm":4,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":4,"StatRetrievalError":null,"CommitIndex":585,"SnapshotTerm":4,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":13690270},"timestamp":1775782458,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:18.433441" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:18.424233" elapsed="0.009368"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.411433" elapsed="0.022460"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.434204" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.433938" elapsed="0.000644"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.411404" elapsed="0.023208"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.444418" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":584,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":584,"Leader":"member-2-shard-inventory-operational","LastIndex":585,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":585,"LastLogIndex":585,"LastLeadershipChangeTime":"2026-04-10 00:53:13.340","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"362.6 μs","Voting":true,"CurrentTerm":4,"LastTerm":4,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":4,"StatRetrievalError":null,"CommitIndex":585,"SnapshotTerm":4,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":13690270},"timestamp":1775782458,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.437503" elapsed="0.007241"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.436113" elapsed="0.008755"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.436090" elapsed="0.008856"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.451256" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.446780" elapsed="0.004651"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.445106" elapsed="0.006416"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.445068" elapsed="0.006572"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.454205" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.452830" elapsed="0.001469"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.455310" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.454604" elapsed="0.000846"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.457041" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.456060" elapsed="0.001049"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.455511" elapsed="0.001671"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.454537" elapsed="0.002692"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.458934" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.457949" elapsed="0.001054"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.459829" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.459199" elapsed="0.000728"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.461089" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.460419" elapsed="0.000734"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.459969" elapsed="0.001253"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.459173" elapsed="0.002099"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:18.461786" elapsed="0.000862"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:18.463768" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.463022" elapsed="0.000816"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.464205" elapsed="0.003696"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:18.435228" elapsed="0.032872"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.468391" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:18.468215" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.468183" elapsed="0.000313"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:18.472719" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:18.468752" elapsed="0.003999"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:18.472811" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:54:18.472984" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:18.404733" elapsed="0.068278"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:18.473143" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:18.473300" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:18.403754" elapsed="0.069572"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.474525" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.474007" elapsed="0.000564"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:18.474622" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:18.474798" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:18.473601" elapsed="0.001224"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:18.475189" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 585, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.474985" elapsed="0.000232"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:18.475590" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.475374" elapsed="0.000284"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:18.475718" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:54:18.475900" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:18.169756" elapsed="0.306171"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:18.475986" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:18.476138" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:18.169022" elapsed="0.307141"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.476472" elapsed="0.000268"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.476250" elapsed="0.000531"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.476954" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.476808" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.477177" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.477032" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.476232" elapsed="0.001018"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:18.168850" elapsed="0.308424"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:17.586623" elapsed="0.890684"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:54:18.477351" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:18.477569" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:54:18.477618" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:54:17.581277" elapsed="0.896364"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.478099" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:54:18.478176" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:18.477817" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.478484" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.478269" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.478252" elapsed="0.000325"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.480951" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:54:18.478749" elapsed="0.002251"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:54:18.481406" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.481214" elapsed="0.000217"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:54:18.481478" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:54:17.578304" elapsed="0.903394"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:54:17.578059" elapsed="0.903688"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.486305" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:18.485910" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.486844" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:18.486493" elapsed="0.000379"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:18.486918" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:18.487074" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:18.485510" elapsed="0.001589"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:54:18.487255" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.487969" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:18.487586" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.488393" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:18.488155" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.488818" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:18.488584" elapsed="0.000260"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.491338" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.490995" elapsed="0.000372"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:18.491413" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:54:18.491592" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:18.490650" elapsed="0.000968"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.582499" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.582068" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:18.583357" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:18.583094" elapsed="0.000340">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:18.583532" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:18.582737" elapsed="0.000839"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.584185" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:18.583784" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:18.584572" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:18.584743" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:18.584404" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.585283" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.585007" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.586721" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.586432" elapsed="0.000336"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.587214" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.586940" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.587605" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.587872" elapsed="0.000214"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.588260" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:18.587439" elapsed="0.000880"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.587295" elapsed="0.001055"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:18.588399" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:54:18.588594" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:18.585821" elapsed="0.002800"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.585429" elapsed="0.003227"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.588836" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.588682" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.585402" elapsed="0.003512"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.589535" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.589063" elapsed="0.000518"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:18.589632" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:18.581350" elapsed="0.008410"/>
</kw>
<msg time="2026-04-10T00:54:18.589817" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:18.567963" elapsed="0.021982"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.604493" elapsed="0.000119"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.618445" elapsed="0.000093"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.634977" elapsed="0.000085"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.636075" elapsed="0.000046"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.636936" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.637713" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.637538" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:18.637517" elapsed="0.000282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.637963" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.638154" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.638341" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:18.637457" elapsed="0.000959"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.637185" elapsed="0.001272"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.639199" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.639325" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:54:18.639621" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:18.561233" elapsed="0.078539"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:18.643906" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:18.643411" elapsed="0.000603">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:18.644275" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:18.642742" elapsed="0.001594"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.645494" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.644536" elapsed="0.001128"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.647014" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.646307" elapsed="0.000760"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.645746" elapsed="0.001395"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.644460" elapsed="0.002738"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.653124" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:18.649154" elapsed="0.004032"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:18.653288" elapsed="0.000084"/>
</return>
<msg time="2026-04-10T00:54:18.653691" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:18.641183" elapsed="0.012621"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:18.657162" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:18.656814" elapsed="0.000431">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:18.657449" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:18.656183" elapsed="0.001311"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:18.657938" elapsed="0.000087"/>
</return>
<status status="PASS" start="2026-04-10T00:54:18.657657" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.657599" elapsed="0.000539"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.658914" elapsed="0.000039"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.659723" elapsed="0.000092"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.659895" elapsed="0.000090"/>
</return>
<msg time="2026-04-10T00:54:18.662530" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:18.654857" elapsed="0.007802"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.667028" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.666579" elapsed="0.000558"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.668350" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.667960" elapsed="0.000489"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:18.680901" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:18.681874" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:18.682301" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:18.670983" elapsed="0.011369"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.668787" elapsed="0.013682"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.683116" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.682589" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.668531" elapsed="0.014814"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.692589" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.686817" elapsed="0.006386"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.686389" elapsed="0.006882"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.686347" elapsed="0.006972"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.697939" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.693938" elapsed="0.004064"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.693475" elapsed="0.004572"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.693438" elapsed="0.004641"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.698935" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.698371" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.699415" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.699091" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.700214" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.699790" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.699521" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.699065" elapsed="0.001262"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.701093" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.700605" elapsed="0.000524"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.701596" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.701250" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.702342" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.701932" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.701710" elapsed="0.000718"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.701223" elapsed="0.001233"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:18.702723" elapsed="0.000471"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:18.703911" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.703447" elapsed="0.000498"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.704164" elapsed="0.002641"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:18.684982" elapsed="0.021975"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.707491" elapsed="0.000088"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:18.707189" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.707117" elapsed="0.000623"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:18.721724" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:18.708753" elapsed="0.013134"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:18.722152" elapsed="0.000197"/>
</return>
<msg time="2026-04-10T00:54:18.723103" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:18.663397" elapsed="0.059979"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:18.724798" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:54:18.724999" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:18.500486" elapsed="0.224542"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.725533" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.725142" elapsed="0.000730"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.725118" elapsed="0.000787"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:18.725945" 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="PASS" start="2026-04-10T00:54:18.496028" elapsed="0.230066"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.491736" elapsed="0.234406"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.491713" elapsed="0.234455"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.726902" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:18.726784" elapsed="0.000169"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:54:18.727102" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:54:18.726984" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.726764" elapsed="0.000423"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.727379" elapsed="0.000026"/>
</kw>
<msg time="2026-04-10T00:54:18.727514" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:18.726423" elapsed="0.001150"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.728307" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.727836" elapsed="0.000499"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.729015" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.728501" elapsed="0.000546"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.734973" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.734470" elapsed="0.000554"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.735656" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.735185" elapsed="0.000518"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:18.753874" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:18.754093" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":9,"SnapshotIndex":63,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":63,"Leader":"member-1-shard-topology-operational","LastIndex":64,"RaftState":"Leader","LastApplied":64,"LastCommittedTransactionTime":"2026-04-10 00:53:49.949","LastLogIndex":64,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.428","active":true,"matchIndex":64,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":65},{"timeSinceLastActivity":"00:00:00.427","active":true,"matchIndex":64,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":65}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"483.2 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":9,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":64,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":1962},"timestamp":1775782458,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:18.754393" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:18.747228" elapsed="0.007345"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.735773" elapsed="0.019219"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.755272" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.755040" elapsed="0.001154"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.735754" elapsed="0.020487"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.763864" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":9,"SnapshotIndex":63,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":63,"Leader":"member-1-shard-topology-operational","LastIndex":64,"RaftState":"Leader","LastApplied":64,"LastCommittedTransactionTime":"2026-04-10 00:53:49.949","LastLogIndex":64,"LastLeadershipChangeTime":"2026-04-10 00:49:56.055","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.428","active":true,"matchIndex":64,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":65},{"timeSinceLastActivity":"00:00:00.427","active":true,"matchIndex":64,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":65}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"483.2 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":9,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":64,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":1962},"timestamp":1775782458,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.759369" elapsed="0.004667"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.758101" elapsed="0.006005"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.758072" elapsed="0.006089"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.769327" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.765864" elapsed="0.003566"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.764281" elapsed="0.005199"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.764253" elapsed="0.005266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.771107" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.770246" elapsed="0.000924"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.771873" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.771340" elapsed="0.000624"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.772899" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.772345" elapsed="0.000613"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.772002" elapsed="0.001008"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.771319" elapsed="0.001727"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.774680" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.773723" elapsed="0.001029"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.775432" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.774927" elapsed="0.000598"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.776569" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.776031" elapsed="0.000587"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.775581" elapsed="0.001092"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.774905" elapsed="0.001804"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:18.776943" elapsed="0.000650"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:18.778516" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.777908" elapsed="0.000787"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.778986" elapsed="0.002532"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:18.757049" elapsed="0.024661"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.781937" elapsed="0.000205"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:18.781799" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.781774" elapsed="0.000423"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:18.786204" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:18.782352" elapsed="0.003882"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:18.786353" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:54:18.786529" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:18.730055" elapsed="0.056643"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:18.786761" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:54:18.787171" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:18.729270" elapsed="0.057937"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.789080" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757824...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.788306" elapsed="0.000809"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:18.789168" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:18.789354" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757824...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:18.787568" elapsed="0.001814"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:18.789774" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 64, 'CommittedTransactionsCount': 9, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.789558" elapsed="0.000243"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:18.790176" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.789968" elapsed="0.000240"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:18.790259" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:18.790418" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:18.490030" elapsed="0.300413"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:18.790502" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:18.790721" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:18.489269" elapsed="0.301478"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.791061" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.790837" elapsed="0.000281"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.791398" elapsed="0.000229"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.791142" elapsed="0.000525"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.791902" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.791692" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.790819" elapsed="0.001182"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:18.489099" elapsed="0.302931"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.794696" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.794255" elapsed="0.000471"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:18.794774" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:54:18.794930" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:18.793903" elapsed="0.001052"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.881419" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.881020" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:18.882395" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:18.882137" elapsed="0.000335">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:18.882588" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:18.881786" elapsed="0.000829"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.883166" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:18.882783" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:18.883496" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:18.883671" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:18.883353" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.884139" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.883856" 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-04-10T00:54:18.885243" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.884985" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.885740" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.885451" elapsed="0.000314"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.886107" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.886312" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.886487" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:18.885966" elapsed="0.000591"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.885820" elapsed="0.000771"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:18.886640" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:54:18.886810" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:18.884644" elapsed="0.002190"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.884280" elapsed="0.002586"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.887041" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.886891" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.884256" elapsed="0.002861"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.887734" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.887261" elapsed="0.000501"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:18.887811" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:18.880365" elapsed="0.007776"/>
</kw>
<msg time="2026-04-10T00:54:18.888195" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:18.867405" elapsed="0.020884"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.901172" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.913689" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.926195" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.927021" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.927988" 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-04-10T00:54:18.928627" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.928454" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:18.928435" 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-04-10T00:54:18.928876" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.929064" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.929249" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:18.928378" elapsed="0.000944"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.928143" elapsed="0.001221"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.930104" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.930226" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:54:18.930476" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:18.860949" elapsed="0.069652"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:18.933842" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:18.933462" elapsed="0.000459">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:18.934115" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:18.932969" elapsed="0.001192"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.934705" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.934291" elapsed="0.000483"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.935395" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.935095" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.934818" elapsed="0.000648"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.934241" elapsed="0.001264"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.938954" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:18.936401" elapsed="0.002600"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:18.939078" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:54:18.939402" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:18.931694" elapsed="0.007816"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:18.942730" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:18.942398" elapsed="0.000415">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:18.943090" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:18.941774" elapsed="0.001379"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:18.943789" elapsed="0.000119"/>
</return>
<status status="PASS" start="2026-04-10T00:54:18.943344" elapsed="0.000710"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.943270" elapsed="0.000840"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.945111" elapsed="0.000041"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.945924" elapsed="0.000039"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.946039" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:54:18.948502" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:18.940627" elapsed="0.008001"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.952780" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.952347" elapsed="0.000543"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.954054" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.953645" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:18.973469" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:18.974509" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:18.975072" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:18.956611" elapsed="0.018523"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.954285" elapsed="0.020979"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.976136" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.975383" elapsed="0.000943"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.954233" elapsed="0.022220"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.985163" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.981013" elapsed="0.004736"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.980473" elapsed="0.005334"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.980400" elapsed="0.005446"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.989745" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:18.986330" elapsed="0.003495"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.985969" elapsed="0.003906"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.985942" elapsed="0.003968"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.990802" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.990208" elapsed="0.000634"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.991317" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.990974" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.992185" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.991688" elapsed="0.000535"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.991434" elapsed="0.000840"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.990947" elapsed="0.001356"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.993024" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.992594" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:18.993402" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:18.993144" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:18.993981" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:18.993671" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.993489" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.993124" elapsed="0.000942"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:18.994245" elapsed="0.000378"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:18.995126" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:18.994816" elapsed="0.000336"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:18.995332" elapsed="0.002525"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:18.978535" elapsed="0.019475"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:18.998379" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:18.998151" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.998098" elapsed="0.000431"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:19.008011" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:18.999319" elapsed="0.008748"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:19.008154" elapsed="0.000079"/>
</return>
<msg time="2026-04-10T00:54:19.008509" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:18.949347" elapsed="0.059294"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:19.009159" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:54:19.009355" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:18.803560" elapsed="0.205825"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.009863" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.009476" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.009458" elapsed="0.000653"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:19.010146" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:18.799316" elapsed="0.210964"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:18.795025" elapsed="0.215301"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:18.795007" elapsed="0.215343"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.011046" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:19.010931" elapsed="0.000161"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:54:19.011217" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:54:19.011114" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.010912" elapsed="0.000425"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.011510" elapsed="0.000024"/>
</kw>
<msg time="2026-04-10T00:54:19.011656" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:19.010608" elapsed="0.001075"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.012338" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.011863" elapsed="0.000508"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.013077" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.012567" elapsed="0.000541"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.018999" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.018511" elapsed="0.000550"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.019774" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.019237" 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-04-10T00:54:19.038391" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:19.038833" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":63,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":63,"Leader":"member-1-shard-topology-operational","LastIndex":64,"RaftState":"Follower","LastApplied":64,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":64,"LastLeadershipChangeTime":"2026-04-10 00:51:03.906","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"253.2 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":64,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":3763},"timestamp":1775782459,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:19.039066" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:19.031762" elapsed="0.007421"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.019892" elapsed="0.019550"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.039655" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.039475" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.019873" elapsed="0.020243"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.049201" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":63,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":63,"Leader":"member-1-shard-topology-operational","LastIndex":64,"RaftState":"Follower","LastApplied":64,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":64,"LastLeadershipChangeTime":"2026-04-10 00:51:03.906","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"253.2 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":64,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":3763},"timestamp":1775782459,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.043353" elapsed="0.006013"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.041660" elapsed="0.007776"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.041632" elapsed="0.007858"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.054085" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.051056" elapsed="0.003135"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.049637" elapsed="0.004606"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.049610" elapsed="0.004672"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.055845" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.054997" elapsed="0.000918"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.056666" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.056138" elapsed="0.000622"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.057728" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.057172" elapsed="0.000605"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.056802" elapsed="0.001028"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.056116" elapsed="0.001751"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.059361" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.058516" elapsed="0.000908"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.060188" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.059614" elapsed="0.000670"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.061210" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.060684" elapsed="0.000575"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.060324" elapsed="0.000987"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.059594" elapsed="0.001753"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:19.061613" elapsed="0.000698"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:19.063236" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.062695" elapsed="0.000605"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.063616" elapsed="0.002771"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:19.040655" elapsed="0.026074"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.066948" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:19.066811" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.066791" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:19.071250" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:19.067188" elapsed="0.004095"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:19.071348" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:54:19.071536" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:19.014120" elapsed="0.057465"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:19.071721" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:19.071882" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:19.013344" elapsed="0.058566"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.073196" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757824...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.072648" elapsed="0.000578"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:19.073277" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:19.073488" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757824...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:19.072201" elapsed="0.001316"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:19.073914" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 64, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.073702" elapsed="0.000246"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:19.074340" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.074129" elapsed="0.000241"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:19.074438" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:54:19.074689" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:18.793265" elapsed="0.281451"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:19.074777" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:19.074933" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:18.792474" elapsed="0.282485"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.075276" elapsed="0.000212"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.075047" elapsed="0.000480"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.075721" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.075568" elapsed="0.000209"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.075950" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.075801" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.075028" elapsed="0.001072"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:18.792252" elapsed="0.283873"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.078899" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.078491" elapsed="0.000437"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:19.078975" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:19.079125" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:19.078134" elapsed="0.001016"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.172569" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.172051" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:19.173441" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:19.173147" elapsed="0.000376">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:19.173803" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:19.172789" elapsed="0.001041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.174423" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:19.174017" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:19.174813" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:19.174983" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:19.174652" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.175443" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.175175" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.176601" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.176323" elapsed="0.000325"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.177085" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.176813" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.177454" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.177678" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.177910" elapsed="0.000024"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:19.177313" elapsed="0.000671"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.177167" elapsed="0.000853"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:19.178070" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:54:19.178245" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:19.175959" elapsed="0.002313"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.175596" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.178484" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.178330" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.175567" elapsed="0.003014"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.179180" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.178733" elapsed="0.000475"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:19.179258" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:19.171350" elapsed="0.008034"/>
</kw>
<msg time="2026-04-10T00:54:19.179439" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:19.157856" elapsed="0.021676"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.192472" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.204933" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.217613" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.218467" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.219274" 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-04-10T00:54:19.219971" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.219812" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:19.219791" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.220256" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.220447" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.220647" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:19.219723" elapsed="0.001002"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.219419" elapsed="0.001349"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.221528" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.221672" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:54:19.221938" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:19.151020" elapsed="0.071031"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:19.225167" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:19.224865" elapsed="0.000379">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:19.225455" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:19.224324" elapsed="0.001177"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.226062" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.225654" elapsed="0.000475"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.226924" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.226451" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.226168" elapsed="0.000831"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.225602" elapsed="0.001435"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.230327" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:19.227785" elapsed="0.002591"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:19.230462" elapsed="0.000335"/>
</return>
<msg time="2026-04-10T00:54:19.231096" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:19.223114" elapsed="0.008089"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:19.234150" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:19.233858" elapsed="0.000366">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:19.234495" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:19.233366" elapsed="0.001300"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:19.235075" elapsed="0.000082"/>
</return>
<status status="PASS" start="2026-04-10T00:54:19.234811" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.234758" elapsed="0.000508"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.236244" elapsed="0.000039"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.237060" elapsed="0.000039"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.237173" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:54:19.239612" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:19.232096" elapsed="0.007633"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.243827" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.243405" elapsed="0.000526"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.245242" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.244721" 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-04-10T00:54:19.266527" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:19.267504" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:19.268028" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:19.247699" elapsed="0.020393"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.245472" elapsed="0.022811"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.269027" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.268396" elapsed="0.000806"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.245420" elapsed="0.023865"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.275965" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.273178" elapsed="0.003162"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.272946" elapsed="0.003432"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.272924" elapsed="0.003479"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.279128" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.276730" elapsed="0.002444"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.276485" elapsed="0.002723"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.276466" elapsed="0.002766"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.279848" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.279437" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.280343" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.279966" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.280919" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.280605" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.280425" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.279947" elapsed="0.001054"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.281711" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.281184" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.282072" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.281830" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.282631" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.282314" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.282154" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.281811" elapsed="0.000902"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:19.282888" elapsed="0.000403"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:19.283798" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.283480" elapsed="0.000348"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.284005" elapsed="0.002460"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:19.271022" elapsed="0.015584"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.287051" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:19.286830" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.286774" elapsed="0.000427"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:19.296307" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:19.287968" elapsed="0.008392"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:19.296457" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:54:19.296814" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:19.240504" elapsed="0.056420"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:19.297391" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:19.297661" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:19.087886" elapsed="0.209804"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.298039" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.297777" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.297759" elapsed="0.000543"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:19.298336" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:19.083608" elapsed="0.214859"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.079220" elapsed="0.219290"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.079202" elapsed="0.219332"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.299212" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:19.299103" elapsed="0.000163"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:54:19.299392" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:54:19.299289" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.299086" elapsed="0.000389"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.299647" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:54:19.299768" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:19.298817" elapsed="0.000978"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.300383" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.299975" elapsed="0.000434"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.301049" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.300582" elapsed="0.000496"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.306963" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.306494" elapsed="0.000518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.307661" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.307182" elapsed="0.000524"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:19.327895" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:19.328134" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":63,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":63,"Leader":"member-1-shard-topology-operational","LastIndex":64,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":64,"LastLogIndex":64,"LastLeadershipChangeTime":"2026-04-10 00:53:13.333","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"330.3 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":64,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":1212},"timestamp":1775782459,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:19.328488" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:19.319488" elapsed="0.009179"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.307775" elapsed="0.021286"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.329430" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.329126" elapsed="0.000812"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.307757" elapsed="0.022219"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.338111" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":63,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":63,"Leader":"member-1-shard-topology-operational","LastIndex":64,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":64,"LastLogIndex":64,"LastLeadershipChangeTime":"2026-04-10 00:53:13.333","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"330.3 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":64,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":1212},"timestamp":1775782459,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.333749" elapsed="0.004529"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.332239" elapsed="0.006109"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.332172" elapsed="0.006230"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.343484" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.339825" elapsed="0.003825"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.338522" elapsed="0.005198"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.338496" elapsed="0.005277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.347578" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.345268" elapsed="0.002490"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.349478" elapsed="0.000128"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.348242" elapsed="0.001497"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.352479" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.351065" elapsed="0.001567"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.349835" elapsed="0.002938"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.348140" elapsed="0.004685"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.354271" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.353477" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.354999" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.354504" elapsed="0.000586"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.356074" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.355468" elapsed="0.000654"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.355128" elapsed="0.001045"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.354483" elapsed="0.001751"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:19.356479" elapsed="0.000667"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:19.358014" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.357465" elapsed="0.000611"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.358373" elapsed="0.002684"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:19.331040" elapsed="0.030183"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.361432" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:19.361300" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.361281" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:19.365235" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:19.361675" elapsed="0.003590"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:19.365320" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:54:19.365491" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:19.302059" elapsed="0.063458"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:19.365728" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:19.365888" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:19.301292" elapsed="0.064622"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.367034" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757824...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.366529" elapsed="0.000534"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:19.367114" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:19.367294" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757824...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:19.366156" elapsed="0.001165"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:19.367712" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 64, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.367485" elapsed="0.000256"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:19.368112" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.367903" elapsed="0.000237"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:19.368190" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:54:19.368385" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:19.077389" elapsed="0.291025"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:19.368479" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:19.368654" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:19.076599" elapsed="0.292080"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.368995" elapsed="0.000196"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.368764" elapsed="0.000465"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.369405" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.369254" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.369645" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.369484" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.368746" elapsed="0.000974"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:19.076343" elapsed="0.293402"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:18.488894" elapsed="0.880884"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:54:19.369825" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:19.370034" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:54:19.370081" level="INFO">${follower_list} = [2, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:54:18.484795" elapsed="0.885310"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.370723" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:54:19.370809" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:19.370285" elapsed="0.000549"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.371129" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.370906" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.370888" elapsed="0.000319"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.373407" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:54:19.371345" elapsed="0.002111"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:54:19.373909" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.373696" elapsed="0.000241"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:54:19.373987" 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="PASS" start="2026-04-10T00:54:18.482090" elapsed="0.892057"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:54:18.481844" elapsed="0.892354"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.378813" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:19.378375" elapsed="0.000466"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.379322" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:19.379006" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:19.379409" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:54:19.379619" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:19.377987" elapsed="0.001658"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:54:19.379833" elapsed="0.000204"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.380671" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:19.380260" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.381116" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:19.380867" elapsed="0.000276"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.381582" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:19.381294" elapsed="0.000316"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.384582" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.384012" elapsed="0.000613"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:19.384692" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:54:19.384918" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:19.383515" elapsed="0.001440"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.474633" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.474204" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:19.475468" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:19.475200" elapsed="0.000364">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:19.475662" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:19.474854" elapsed="0.000833"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.476259" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:19.475866" elapsed="0.000444"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:19.476638" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:19.476802" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:19.476477" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.477328" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.477070" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.478401" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.478140" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.478924" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.478632" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.479292" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.479503" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.479853" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:19.479150" elapsed="0.000772"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.479006" elapsed="0.000948"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:19.480001" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:54:19.480196" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:19.477795" elapsed="0.002428"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.477456" elapsed="0.002800"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.480482" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.480327" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.477433" elapsed="0.003146"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.481192" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.480730" elapsed="0.000492"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:19.481271" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:19.473552" elapsed="0.007846"/>
</kw>
<msg time="2026-04-10T00:54:19.481452" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:19.460661" elapsed="0.020876"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.494681" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.508004" elapsed="0.000078"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.521418" elapsed="0.000082"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.522369" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.523186" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.523926" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.523769" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:19.523750" 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-04-10T00:54:19.524173" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.524449" elapsed="0.000030"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.524678" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:19.523688" elapsed="0.001071"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.523398" elapsed="0.001403"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.525536" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.525679" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:54:19.525960" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:19.454258" elapsed="0.071816"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:19.529473" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:19.529055" elapsed="0.000550">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:19.529898" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:19.528447" elapsed="0.001516"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.531161" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.530166" elapsed="0.001098"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.532448" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.531757" elapsed="0.000732"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.531324" elapsed="0.001253"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.530088" elapsed="0.002547"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.537230" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:19.533704" elapsed="0.003573"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:19.537359" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:54:19.537711" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:19.527165" elapsed="0.010652"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:19.540736" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:19.540421" elapsed="0.000389">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:19.541003" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:19.539943" elapsed="0.001104"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:19.541448" elapsed="0.000083"/>
</return>
<status status="PASS" start="2026-04-10T00:54:19.541186" elapsed="0.000433"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.541133" elapsed="0.000526"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.542402" 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-04-10T00:54:19.543264" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.543374" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:54:19.545830" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:19.538794" elapsed="0.007146"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.549993" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.549554" elapsed="0.000544"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.551433" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.551048" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:19.562795" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:19.563462" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:19.563855" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:19.553994" elapsed="0.009905"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.551691" elapsed="0.012320"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.564598" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.564092" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.551634" elapsed="0.013134"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.571714" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.567463" elapsed="0.004775"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.567101" elapsed="0.005200"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.567069" elapsed="0.005297"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.576537" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.572936" elapsed="0.003691"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.572519" elapsed="0.004160"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.572487" elapsed="0.004227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.577674" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.577035" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.578208" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.577849" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.579082" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.578593" elapsed="0.000528"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.578328" elapsed="0.000846"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.577821" elapsed="0.001384"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.580034" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.579475" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.580630" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.580207" elapsed="0.000509"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.581246" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.580945" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.580751" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.580179" elapsed="0.001149"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:19.581504" elapsed="0.000375"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:19.582366" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.582065" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.582584" elapsed="0.002448"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:19.565953" elapsed="0.019211"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.585516" elapsed="0.000070"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:19.585296" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.585244" elapsed="0.000445"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:19.594855" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:19.586429" elapsed="0.008477"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:19.594986" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:54:19.595330" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:19.546769" elapsed="0.048672"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:19.595935" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:54:19.596118" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:19.395844" elapsed="0.200301"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.596540" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.596234" elapsed="0.000764"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.596216" elapsed="0.000812"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:19.597063" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:19.391098" elapsed="0.206110"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.385066" elapsed="0.212188"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.385037" elapsed="0.212242"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.597943" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:19.597835" elapsed="0.000154"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:54:19.598110" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:54:19.598011" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.597818" elapsed="0.000373"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.598348" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:54:19.598468" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:19.597521" elapsed="0.000973"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.599071" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.598688" elapsed="0.000410"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.599740" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.599257" elapsed="0.000512"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.605473" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.605022" elapsed="0.000499"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.606201" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.605764" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:19.625264" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:19.625408" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":55,"SnapshotIndex":335,"InMemoryJournalLogSize":3,"ReplicatedToAllIndex":335,"Leader":"member-1-shard-default-operational","LastIndex":338,"RaftState":"Leader","LastApplied":337,"LastCommittedTransactionTime":"2026-04-10 00:53:15.200","LastLogIndex":338,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.244","active":true,"matchIndex":337,"voting":true,"id":"member-3-shard-default-operational","nextIndex":338},{"timeSinceLastActivity":"00:00:00.248","active":true,"matchIndex":335,"voting":true,"id":"member-2-shard-default-operational","nextIndex":336}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"599.8 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":6,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":337,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":60,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":4584},"timestamp":1775782459,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:19.625883" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:19.617855" elapsed="0.008137"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.606312" elapsed="0.019941"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.626463" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.626289" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.606295" elapsed="0.020588"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.633598" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":55,"SnapshotIndex":335,"InMemoryJournalLogSize":3,"ReplicatedToAllIndex":335,"Leader":"member-1-shard-default-operational","LastIndex":338,"RaftState":"Leader","LastApplied":337,"LastCommittedTransactionTime":"2026-04-10 00:53:15.200","LastLogIndex":338,"LastLeadershipChangeTime":"2026-04-10 00:49:56.074","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.244","active":true,"matchIndex":337,"voting":true,"id":"member-3-shard-default-operational","nextIndex":338},{"timeSinceLastActivity":"00:00:00.248","active":true,"matchIndex":335,"voting":true,"id":"member-2-shard-default-operational","nextIndex":336}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"599.8 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":6,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":337,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":60,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":4584},"timestamp":1775782459,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.629229" elapsed="0.004544"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.628157" elapsed="0.005687"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.628137" elapsed="0.005765"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.638416" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.635347" elapsed="0.003170"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.634043" elapsed="0.004540"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.634014" elapsed="0.004608"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.640074" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.639266" elapsed="0.000870"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.640823" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.640305" elapsed="0.000607"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.641845" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.641282" elapsed="0.000610"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.640949" elapsed="0.001001"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.640285" elapsed="0.001712"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.643395" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.642644" elapsed="0.000811"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.644108" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.643640" elapsed="0.000554"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.645108" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.644608" elapsed="0.000545"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.644231" elapsed="0.000972"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.643619" elapsed="0.001618"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:19.645460" elapsed="0.000698"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:19.646989" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.646466" elapsed="0.000584"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.647337" elapsed="0.002615"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:19.627419" elapsed="0.022700"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.650322" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:19.650193" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.650175" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:19.654270" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:19.650555" elapsed="0.003745"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:19.654396" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:54:19.654585" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:19.600775" elapsed="0.053839"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:19.654673" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:19.654825" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:19.599986" elapsed="0.054864"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.656004" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578245...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.655435" elapsed="0.000600"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:19.656087" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:54:19.656288" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578245...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:19.655083" elapsed="0.001233"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:19.656741" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 337, 'CommittedTransactionsCount': 6, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.656510" elapsed="0.000274"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:19.657163" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.656961" elapsed="0.000227"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:19.657234" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:19.657388" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:19.382867" elapsed="0.274546"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:19.657471" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:54:19.657702" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:19.382102" elapsed="0.275626"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.658076" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.657824" elapsed="0.000316"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.658379" elapsed="0.000208"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.658164" elapsed="0.000461"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.658804" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.658649" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.657800" elapsed="0.001104"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:19.381906" elapsed="0.277022"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.661801" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.661351" elapsed="0.000481"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:19.661884" elapsed="0.001678"/>
</return>
<msg time="2026-04-10T00:54:19.663705" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:19.660803" elapsed="0.002928"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.751108" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.750702" elapsed="0.000440"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:19.752018" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:19.751755" elapsed="0.000341">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:19.752191" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:19.751398" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.752834" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:19.752387" elapsed="0.000475"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:19.753178" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:19.753335" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:19.753030" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.753798" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.753525" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.754826" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.754569" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.755306" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.755035" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.755683" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.755891" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.756069" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:19.755526" elapsed="0.000601"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.755384" elapsed="0.000774"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:19.756205" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:54:19.756374" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:19.754228" elapsed="0.002172"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.753923" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.756651" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.756483" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.753900" elapsed="0.002830"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.757327" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.756883" elapsed="0.000472"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:19.757403" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:19.750060" elapsed="0.007468"/>
</kw>
<msg time="2026-04-10T00:54:19.757600" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:19.737129" elapsed="0.020567"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.770730" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.783427" elapsed="0.000043"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.795877" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.796720" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.797500" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.798120" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.797964" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:19.797944" 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-04-10T00:54:19.798370" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.798575" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.798765" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:19.797886" elapsed="0.000958"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.797649" elapsed="0.001237"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.799616" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.799737" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:54:19.799991" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:19.730806" elapsed="0.069295"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:19.803196" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:19.802895" elapsed="0.000377">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:19.803467" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:19.802380" elapsed="0.001132"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.804244" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.803663" elapsed="0.000651"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.804968" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.804667" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.804355" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.803611" elapsed="0.001467"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.808763" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:19.805911" elapsed="0.002900"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:19.808893" elapsed="0.000066"/>
</return>
<msg time="2026-04-10T00:54:19.809215" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:19.801146" elapsed="0.008176"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:19.812057" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:19.811809" elapsed="0.000312">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:19.812311" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:19.811351" elapsed="0.001006"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:19.812885" elapsed="0.000080"/>
</return>
<status status="PASS" start="2026-04-10T00:54:19.812510" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.812439" elapsed="0.000634"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.813830" elapsed="0.000038"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.814617" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.814727" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:54:19.817029" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:19.810211" elapsed="0.006926"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.821177" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.820775" elapsed="0.000501"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.822387" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.822002" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:19.839406" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:19.839876" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:19.840126" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:19.824914" elapsed="0.015240"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.822626" elapsed="0.017591"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.840585" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.840266" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.822576" elapsed="0.018125"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.845453" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.842496" elapsed="0.003452"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.842254" elapsed="0.003745"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.842233" elapsed="0.003800"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.849795" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.846462" elapsed="0.003398"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.846146" elapsed="0.003761"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.846120" elapsed="0.003821"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.850776" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.850215" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.851283" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.850948" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.852073" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.851643" elapsed="0.000467"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.851396" elapsed="0.000764"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.850921" elapsed="0.001268"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.852983" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.852441" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.853333" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.853101" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.853908" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.853601" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.853415" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.853082" elapsed="0.000909"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:19.854164" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:19.855186" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.854721" elapsed="0.000491"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.855389" elapsed="0.002336"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:19.841467" elapsed="0.016380"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.858200" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:19.857982" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.857930" elapsed="0.000419"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:19.867729" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:19.859098" elapsed="0.008680"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:19.867857" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:54:19.868191" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:19.817816" elapsed="0.050486"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:19.868823" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:54:19.869004" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:19.671974" elapsed="0.197057"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.869364" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.869116" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.869098" elapsed="0.000515"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:19.869648" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:19.667781" elapsed="0.201996"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.663803" elapsed="0.206018"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.663785" elapsed="0.206060"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.870457" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:19.870351" elapsed="0.000151"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:54:19.870650" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:54:19.870524" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.870333" elapsed="0.000398"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.870883" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:54:19.871002" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:19.870079" elapsed="0.000948"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.871618" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.871214" elapsed="0.000431"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.872285" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.871813" elapsed="0.000499"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.878121" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.877672" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.878848" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.878323" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:19.898171" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:19.898308" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":338,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":338,"Leader":"member-1-shard-default-operational","LastIndex":339,"RaftState":"Follower","LastApplied":339,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":339,"LastLeadershipChangeTime":"2026-04-10 00:51:03.908","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"341.0 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":339,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":7909},"timestamp":1775782459,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:19.898503" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:19.890072" elapsed="0.008720"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.878959" elapsed="0.020095"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.899245" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.899087" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.878941" elapsed="0.020660"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.905901" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":338,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":338,"Leader":"member-1-shard-default-operational","LastIndex":339,"RaftState":"Follower","LastApplied":339,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":339,"LastLeadershipChangeTime":"2026-04-10 00:51:03.908","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"341.0 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":339,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":7909},"timestamp":1775782459,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.902079" elapsed="0.003981"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.900864" elapsed="0.005265"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.900835" elapsed="0.005347"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.910808" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:19.907557" elapsed="0.003356"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.906298" elapsed="0.004665"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.906272" elapsed="0.004728"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.912459" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.911680" elapsed="0.000840"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.913287" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.912808" elapsed="0.000567"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.914341" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.913832" elapsed="0.000555"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.913413" elapsed="0.001026"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.912787" elapsed="0.001686"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.915889" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.915125" elapsed="0.000825"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.916619" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.916117" elapsed="0.000590"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.917604" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.917081" elapsed="0.000571"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.916744" elapsed="0.000958"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.916098" elapsed="0.001640"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:19.917992" elapsed="0.000649"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:19.919460" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.918953" elapsed="0.000568"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.919827" elapsed="0.002591"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:19.900099" elapsed="0.022496"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:19.922798" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:19.922669" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.922650" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:19.926762" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:19.923127" elapsed="0.003664"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:19.926844" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:54:19.927006" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:19.873319" elapsed="0.053713"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:19.927166" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:19.927324" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:19.872572" elapsed="0.054778"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.928417" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578245...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:19.927949" elapsed="0.000497"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:19.928494" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:19.928717" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578245...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:19.927599" elapsed="0.001145"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:19.929102" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 339, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.928902" elapsed="0.000227"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:19.929485" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.929286" elapsed="0.000223"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:19.929620" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:19.929775" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:19.660091" elapsed="0.269709"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:19.929862" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:54:19.930009" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:19.659279" elapsed="0.270754"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:19.930331" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.930113" elapsed="0.000461"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.930746" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.930598" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:19.930966" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:19.930823" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.930096" elapsed="0.000942"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:19.659103" elapsed="0.271959"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:19.933445" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:19.933124" elapsed="0.000349"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:19.933518" elapsed="0.000066"/>
</return>
<msg time="2026-04-10T00:54:19.933707" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:19.932773" elapsed="0.000959"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.020263" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.019869" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.021109" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:20.020850" elapsed="0.000336">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:20.021349" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:20.020466" elapsed="0.000908"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.021948" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:20.021542" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.022279" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:20.022430" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:20.022138" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.022880" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.022634" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.023906" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.023650" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.024383" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.024114" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.024761" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.025141" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.025318" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:20.024620" elapsed="0.000755"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.024461" elapsed="0.000944"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:20.025451" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:54:20.025632" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:20.023306" elapsed="0.002351"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.023001" elapsed="0.002689"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.025861" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.025714" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.022979" elapsed="0.002958"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.026514" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.026082" elapsed="0.000462"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:20.026607" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:20.019231" elapsed="0.007500"/>
</kw>
<msg time="2026-04-10T00:54:20.026784" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:20.006415" elapsed="0.020452"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.040057" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.052469" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.064878" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.065717" elapsed="0.000038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.066496" 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-04-10T00:54:20.067084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.066934" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:20.066917" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.067326" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.067513" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.067718" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:20.066866" elapsed="0.000928"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.066638" elapsed="0.001196"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.068558" elapsed="0.000049"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.068691" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:54:20.068930" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:19.999929" elapsed="0.069111"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.072022" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:20.071748" elapsed="0.000346">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:20.072285" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:20.071269" elapsed="0.001062"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.072884" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.072467" elapsed="0.000485"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.073585" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.073269" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.072991" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.072414" elapsed="0.001284"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.076967" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:20.074471" elapsed="0.002540"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:20.077090" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:54:20.077409" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:20.070077" elapsed="0.007436"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.080375" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:20.080116" elapsed="0.000325">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:20.080771" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:20.079677" elapsed="0.001142"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:20.081202" elapsed="0.000081"/>
</return>
<status status="PASS" start="2026-04-10T00:54:20.080950" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.080899" elapsed="0.000493"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.082319" elapsed="0.000039"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.083095" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.083205" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:54:20.085423" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:20.078383" elapsed="0.007147"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.089311" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.088920" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.090726" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.090314" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:20.111911" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:20.112862" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:20.113312" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:20.093087" elapsed="0.020285"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.090954" elapsed="0.022540"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.114204" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.113639" elapsed="0.000731"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.090905" elapsed="0.023545"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.121183" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.117439" elapsed="0.004304"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.117123" elapsed="0.004673"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.117094" elapsed="0.004737"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.125070" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.122261" elapsed="0.002856"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.121944" elapsed="0.003207"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.121918" elapsed="0.003257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.125788" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.125377" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.126146" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.125907" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.126712" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.126388" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.126226" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.125888" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.127357" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.126998" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.127810" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.127473" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.128354" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.128052" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.127892" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.127455" elapsed="0.000980"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:20.128631" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:20.129465" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.129168" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.129692" elapsed="0.002438"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:20.116097" elapsed="0.016157"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.132628" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:20.132385" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.132334" elapsed="0.000441"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:20.142073" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:20.133501" elapsed="0.008623"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:20.142203" elapsed="0.000069"/>
</return>
<msg time="2026-04-10T00:54:20.142533" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:20.086233" elapsed="0.056427"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:20.143132" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:20.143330" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:19.942182" elapsed="0.201175"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.143703" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.143444" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.143426" elapsed="0.000514"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:20.143973" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:19.937991" elapsed="0.206111"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:19.933800" elapsed="0.210346"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:19.933783" elapsed="0.210387"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.144796" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:20.144689" elapsed="0.000152"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:54:20.144966" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:54:20.144865" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.144671" elapsed="0.000562"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.145378" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:54:20.145496" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:20.144399" elapsed="0.001121"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.146088" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.145714" elapsed="0.000400"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.146745" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.146270" elapsed="0.000503"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.152559" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.152119" elapsed="0.000502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.153205" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.152777" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:20.172218" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:20.172354" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":340,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":340,"Leader":"member-1-shard-default-operational","LastIndex":341,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":341,"LastLogIndex":341,"LastLeadershipChangeTime":"2026-04-10 00:53:13.343","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"284.8 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":341,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":3713},"timestamp":1775782460,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:20.172544" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:20.164432" elapsed="0.008237"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.153315" elapsed="0.019655"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.173228" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.173012" elapsed="0.000946"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.153297" elapsed="0.020698"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.180699" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":340,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":340,"Leader":"member-1-shard-default-operational","LastIndex":341,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":341,"LastLogIndex":341,"LastLeadershipChangeTime":"2026-04-10 00:53:13.343","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"284.8 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":341,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":3713},"timestamp":1775782460,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.176957" elapsed="0.003898"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.175655" elapsed="0.005250"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.175629" elapsed="0.005315"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.184398" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.181946" elapsed="0.002550"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.181028" elapsed="0.003516"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.181009" elapsed="0.003591"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.186159" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.185233" elapsed="0.000989"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.186883" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.186390" elapsed="0.000581"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.187876" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.187344" elapsed="0.000580"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.187009" elapsed="0.000966"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.186370" elapsed="0.001641"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.189475" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.188721" elapsed="0.000815"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.190266" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.189795" elapsed="0.000558"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.191246" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.190747" elapsed="0.000545"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.190390" elapsed="0.000952"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.189774" elapsed="0.001602"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:20.191624" elapsed="0.000644"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:20.193109" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.192599" elapsed="0.000571"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.193458" elapsed="0.002549"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:20.174684" elapsed="0.021484"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.196408" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:20.196240" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.196222" elapsed="0.000256"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:20.200218" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:20.196641" elapsed="0.003607"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:20.200300" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:54:20.200485" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:20.147759" elapsed="0.052753"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:20.200629" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:20.200785" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:20.146985" elapsed="0.053825"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.201985" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578246...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.201388" elapsed="0.000626"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:20.202061" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:20.202235" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578246...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:20.201041" elapsed="0.001220"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:20.202639" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 341, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.202418" elapsed="0.000248"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:20.203019" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.202821" elapsed="0.000222"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:20.203089" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:20.203242" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:19.932133" elapsed="0.271133"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:20.203323" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:20.203472" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:19.931402" elapsed="0.272094"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.203813" elapsed="0.000189"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.203593" elapsed="0.000447"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.204210" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.204064" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.204447" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.204288" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.203574" elapsed="0.000979"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:19.931232" elapsed="0.273361"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:19.381665" elapsed="0.822962"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:54:20.204672" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:20.204881" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:54:20.204927" level="INFO">${follower_list} = [2, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:54:19.377230" elapsed="0.827721"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.205395" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:54:20.205471" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:20.205128" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.205813" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.205598" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.205549" elapsed="0.000340"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.208077" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:54:20.206025" elapsed="0.002100"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:54:20.208517" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.208327" elapsed="0.000219"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:54:20.208627" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:54:19.374577" elapsed="0.834209"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:54:19.374296" elapsed="0.834536"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:54:17.577908" elapsed="2.630956"/>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:54:17.577358" elapsed="2.631562"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.214095" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:20.213710" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.214627" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:20.214281" elapsed="0.000371"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:20.214697" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:20.214852" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:20.213316" elapsed="0.001561"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:54:20.215032" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.215706" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:20.215347" elapsed="0.000385"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.216139" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:20.215890" elapsed="0.000274"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.216576" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:20.216318" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.219059" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.218740" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:20.219131" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:20.219277" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:20.218382" elapsed="0.000920"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.307078" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.306635" elapsed="0.000477"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.307926" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:20.307658" elapsed="0.000346">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:20.308101" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:20.307292" elapsed="0.000834"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.308692" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:20.308290" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.309030" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:20.309268" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:20.308887" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.309731" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.309453" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.311009" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.310539" elapsed="0.000517"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.311493" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.311221" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.311956" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.312162" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.312338" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:20.311813" elapsed="0.000581"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.311664" elapsed="0.000762"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:20.312474" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:54:20.312664" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:20.310211" elapsed="0.002479"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.309859" elapsed="0.002863"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.312901" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.312746" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.309835" elapsed="0.003140"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.313715" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.313120" elapsed="0.000630"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:20.313798" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:20.305845" elapsed="0.008080"/>
</kw>
<msg time="2026-04-10T00:54:20.313980" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:20.292712" elapsed="0.021381"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.328545" elapsed="0.000075"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.341421" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.354706" elapsed="0.000058"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.355738" 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-04-10T00:54:20.356576" elapsed="0.000039"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.357203" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.357047" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:20.357027" 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-04-10T00:54:20.357454" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.357659" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.357847" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:20.356965" elapsed="0.000957"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.356713" elapsed="0.001252"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.358713" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.358836" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:54:20.359105" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:20.286237" elapsed="0.072979"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.362447" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:20.362140" elapsed="0.000389">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:20.362739" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:20.361632" elapsed="0.001152"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.363319" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.362916" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.364140" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.363744" elapsed="0.000423"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.363426" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.362863" elapsed="0.001391"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.367642" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:20.365113" elapsed="0.002579"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:20.367773" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:54:20.368205" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:20.360383" elapsed="0.007931"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.371241" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:20.370978" elapsed="0.000332">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:20.371501" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:20.370517" elapsed="0.001032"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:20.371962" elapsed="0.000107"/>
</return>
<status status="PASS" start="2026-04-10T00:54:20.371700" elapsed="0.000438"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.371648" elapsed="0.000531"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.373141" elapsed="0.000039"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.373946" elapsed="0.000038"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.374058" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:54:20.376382" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:20.369364" elapsed="0.007128"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.380532" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.380084" elapsed="0.000733"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.381945" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.381537" elapsed="0.000507"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:20.395623" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:20.396110" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:20.396376" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:20.384428" elapsed="0.011976"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.382180" elapsed="0.014289"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.396839" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.396541" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.382126" elapsed="0.014829"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.401665" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.398840" elapsed="0.003162"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.398590" elapsed="0.003449"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.398554" elapsed="0.003510"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.404887" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.402389" elapsed="0.002565"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.402151" elapsed="0.002853"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.402132" elapsed="0.002905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.406068" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.405339" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.406596" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.406238" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.407371" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.406939" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.406711" elapsed="0.000747"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.406211" elapsed="0.001276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.408272" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.407764" elapsed="0.000544"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.408847" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.408437" elapsed="0.000494"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.409667" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.409188" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.408965" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.408411" elapsed="0.001373"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:20.410001" elapsed="0.000375"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:20.410890" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.410584" elapsed="0.000332"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.411093" elapsed="0.002439"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:20.397786" elapsed="0.015898"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.414042" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:20.413818" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.413767" elapsed="0.000430"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:20.423751" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:20.414978" elapsed="0.008825"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:20.423883" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:54:20.424223" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:20.377308" elapsed="0.047023"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:20.424815" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:54:20.425001" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:20.227814" elapsed="0.197216"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.425426" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.425162" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.425144" elapsed="0.000592"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:20.425772" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:20.223491" elapsed="0.202410"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.219369" elapsed="0.206576"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.219351" elapsed="0.206619"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:54:20.426817" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:54:20.426708" elapsed="0.000182"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.426953" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:20.426915" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.426691" elapsed="0.000323"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.427166" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:54:20.427287" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:20.426404" elapsed="0.000908"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.427883" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.427484" elapsed="0.000426"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.428538" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.428071" elapsed="0.000513"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.434773" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.434305" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.435411" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.434979" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:20.457267" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:20.458214" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":60004,"SnapshotIndex":160052,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":160052,"Leader":"member-1-shard-inventory-config","LastIndex":160053,"RaftState":"Leader","LastApplied":160053,"LastCommittedTransactionTime":"2026-04-10 00:53:51.978","LastLogIndex":160053,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.430","active":true,"matchIndex":160053,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":160054},{"timeSinceLastActivity":"00:00:00.430","active":true,"matchIndex":160053,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":160054}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"693.6 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":4,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":160053,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":4,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":2128},"timestamp":1775782460,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:20.458760" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:20.447288" elapsed="0.011665"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.435526" elapsed="0.023802"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.459675" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.459382" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.435508" elapsed="0.024749"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.467401" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":60004,"SnapshotIndex":160052,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":160052,"Leader":"member-1-shard-inventory-config","LastIndex":160053,"RaftState":"Leader","LastApplied":160053,"LastCommittedTransactionTime":"2026-04-10 00:53:51.978","LastLogIndex":160053,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.430","active":true,"matchIndex":160053,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":160054},{"timeSinceLastActivity":"00:00:00.430","active":true,"matchIndex":160053,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":160054}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"693.6 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":4,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":160053,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":4,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":2128},"timestamp":1775782460,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.463551" elapsed="0.003977"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.462225" elapsed="0.005376"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.462194" elapsed="0.005450"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.471424" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.468769" elapsed="0.002757"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.467732" elapsed="0.003863"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.467713" elapsed="0.003923"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.473127" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.472303" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.473854" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.473358" elapsed="0.000587"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.474947" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.474410" elapsed="0.000584"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.473983" elapsed="0.001063"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.473337" elapsed="0.001744"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.476478" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.475731" elapsed="0.000812"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.477259" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.476797" elapsed="0.000549"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.478258" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.477733" elapsed="0.000573"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.477383" elapsed="0.000974"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.476776" elapsed="0.001616"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:20.478641" elapsed="0.000628"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:20.480112" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.479597" elapsed="0.000579"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.480464" elapsed="0.002619"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:20.461037" elapsed="0.022209"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.483452" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:20.483322" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.483304" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:20.487477" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:20.483692" elapsed="0.003817"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:20.487646" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:54:20.487829" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:20.429619" elapsed="0.058244"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:20.487928" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:20.488094" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:20.428819" elapsed="0.059303"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.489442" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782460, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.488936" elapsed="0.000537"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:20.489522" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:54:20.489728" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782460, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:20.488409" elapsed="0.001348"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:20.490184" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 160053, 'CommittedTransactionsCount': 4, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.489918" elapsed="0.000296"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:20.490646" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.490375" elapsed="0.000299"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:20.490722" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:20.490878" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:20.217781" elapsed="0.273121"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:20.490961" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:54:20.491111" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:20.217053" elapsed="0.274083"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.491445" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.491220" elapsed="0.000286"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.491764" elapsed="0.000196"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.491529" elapsed="0.000469"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.492173" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.492022" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.491203" elapsed="0.001048"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:20.216886" elapsed="0.275389"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.494785" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.494395" elapsed="0.000418"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:20.494864" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:20.495016" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:20.494034" elapsed="0.001006"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.584721" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.584203" elapsed="0.000554"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.585695" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:20.585408" elapsed="0.000367">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:20.585876" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:20.585057" elapsed="0.000845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.586503" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:20.586089" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.586862" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:20.587021" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:20.586718" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.587502" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.587206" elapsed="0.000347"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.588627" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.588300" elapsed="0.000374"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.589180" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.588847" elapsed="0.000360"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.589552" 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-04-10T00:54:20.589779" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.589957" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:20.589409" elapsed="0.000612"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.589263" elapsed="0.000794"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:20.590107" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:54:20.590281" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:20.587975" elapsed="0.002331"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.587651" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.590514" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.590364" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.587626" elapsed="0.002985"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.591208" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.590762" elapsed="0.000474"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:20.591285" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:20.583447" elapsed="0.007963"/>
</kw>
<msg time="2026-04-10T00:54:20.591465" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:20.570237" elapsed="0.021316"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.604589" elapsed="0.000080"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.617445" elapsed="0.000076"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.630008" elapsed="0.000048"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.630852" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.631649" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.632265" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.632108" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:20.632088" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.632512" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.632725" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.632911" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:20.632030" elapsed="0.000956"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.631784" elapsed="0.001244"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.633788" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.633912" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:54:20.634181" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:20.563277" elapsed="0.071015"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.637344" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:20.637038" elapsed="0.000385">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:20.637674" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:20.636519" elapsed="0.001201"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.638249" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.637849" elapsed="0.000469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.638951" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.638650" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.638357" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.637799" elapsed="0.001264"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.642259" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:20.639895" elapsed="0.002410"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:20.642381" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:54:20.642716" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:20.635326" elapsed="0.007496"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.645760" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:20.645456" elapsed="0.000370">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:20.646018" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:20.645013" elapsed="0.001052"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:20.646447" elapsed="0.000080"/>
</return>
<status status="PASS" start="2026-04-10T00:54:20.646197" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.646145" elapsed="0.000513"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.647409" 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-04-10T00:54:20.648221" elapsed="0.000035"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.648330" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:54:20.650689" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:20.643871" elapsed="0.006926"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.654895" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.654476" elapsed="0.000523"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.656359" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.655976" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:20.673627" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:20.674641" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:20.675154" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:20.658801" elapsed="0.016416"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.656603" elapsed="0.018765"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.676131" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.675480" elapsed="0.000820"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.656533" elapsed="0.019848"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.684822" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.680435" elapsed="0.004729"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.679921" elapsed="0.005280"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.679875" elapsed="0.005351"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.687961" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.685548" elapsed="0.002461"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.685311" elapsed="0.002733"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.685292" elapsed="0.002776"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.688714" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.688283" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.689081" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.688836" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.689672" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.689328" elapsed="0.000371"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.689163" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.688817" elapsed="0.000939"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.690331" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.689961" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.690748" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.690452" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.691304" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.690998" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.690833" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.690432" elapsed="0.000955"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:20.691580" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:20.692430" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.692127" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.692651" elapsed="0.002509"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:20.678189" elapsed="0.017100"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.695666" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:20.695421" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.695370" elapsed="0.000452"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:20.705075" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:20.696575" elapsed="0.008554"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:20.705213" elapsed="0.000076"/>
</return>
<msg time="2026-04-10T00:54:20.705597" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:20.651712" elapsed="0.054001"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:20.706212" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:54:20.706399" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:20.503833" elapsed="0.202594"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.706834" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.706519" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.706500" elapsed="0.000668"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:20.707204" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:20.499508" elapsed="0.207829"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.495108" elapsed="0.212275"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.495091" elapsed="0.212318"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:54:20.708081" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:54:20.707973" elapsed="0.000169"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.708285" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:20.708165" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.707955" elapsed="0.000399"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.708518" elapsed="0.000025"/>
</kw>
<msg time="2026-04-10T00:54:20.708738" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:20.707674" elapsed="0.001097"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.709369" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.708958" elapsed="0.000438"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.710072" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.709589" elapsed="0.000513"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.716394" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.715783" elapsed="0.000675"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.717128" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.716663" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:20.736547" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:20.736709" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":160052,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":160052,"Leader":"member-1-shard-inventory-config","LastIndex":160053,"RaftState":"Follower","LastApplied":160053,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":160053,"LastLeadershipChangeTime":"2026-04-10 00:51:04.372","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"225.1 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":160053,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":45030},"timestamp":1775782460,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:20.736948" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:20.729245" elapsed="0.007813"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.717247" elapsed="0.020071"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.737526" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.737353" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.717226" elapsed="0.020681"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.744671" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":160052,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":160052,"Leader":"member-1-shard-inventory-config","LastIndex":160053,"RaftState":"Follower","LastApplied":160053,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":160053,"LastLeadershipChangeTime":"2026-04-10 00:51:04.372","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"225.1 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":160053,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":45030},"timestamp":1775782460,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.740635" elapsed="0.004290"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.739429" elapsed="0.005576"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.739409" elapsed="0.005657"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.749956" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.746524" elapsed="0.003577"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.745198" elapsed="0.004963"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.745167" elapsed="0.005035"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.751771" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.750909" elapsed="0.000981"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.752637" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.752088" elapsed="0.000642"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.753655" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.753111" elapsed="0.000592"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.752769" elapsed="0.000986"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.752064" elapsed="0.001727"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.755253" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.754464" elapsed="0.000854"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.756074" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.755492" elapsed="0.000675"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.757548" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.756810" elapsed="0.000860"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.756207" elapsed="0.001537"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.755472" elapsed="0.002323"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:20.758145" elapsed="0.000945"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:20.760364" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.759531" elapsed="0.000920"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.761042" elapsed="0.002560"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:20.738463" elapsed="0.025314"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.763986" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:20.763853" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.763834" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:20.767991" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:20.764251" elapsed="0.003771"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:20.768076" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:54:20.768297" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:20.711150" elapsed="0.057175"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:20.768631" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:54:20.768800" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:20.710320" elapsed="0.058509"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.769950" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782460, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.769448" elapsed="0.000533"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:20.770040" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:20.770221" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782460, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:20.769082" elapsed="0.001167"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:20.770636" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 160053, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerIni...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.770410" elapsed="0.000255"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:20.771027" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.770823" elapsed="0.000229"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:20.771100" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:20.771255" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:20.493394" elapsed="0.277885"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:20.771340" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:54:20.771491" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:20.492666" elapsed="0.278850"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.771846" elapsed="0.000195"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.771624" elapsed="0.000456"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.772305" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.772112" elapsed="0.000254"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.772548" elapsed="0.000083"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.772390" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.771605" elapsed="0.001086"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:20.492448" elapsed="0.280273"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.775203" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.774866" elapsed="0.000371"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:20.775289" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:54:20.775465" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:20.774496" elapsed="0.000997"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.866248" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.865735" elapsed="0.000550"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.867151" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:20.866870" elapsed="0.000362">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:20.867482" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:20.866484" elapsed="0.001026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.868103" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:20.867705" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.868443" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:20.868620" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:20.868297" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.869062" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.868809" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.870199" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.869928" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.870803" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.870450" elapsed="0.000380"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.871243" elapsed="0.000025"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.871456" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.871654" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:20.871085" elapsed="0.000629"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.870898" elapsed="0.000849"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:20.871828" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:54:20.872030" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:20.869582" elapsed="0.002476"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.869205" elapsed="0.002887"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.872272" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.872119" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.869175" elapsed="0.003174"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.872974" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.872494" elapsed="0.000510"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:20.873054" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:20.865001" elapsed="0.008180"/>
</kw>
<msg time="2026-04-10T00:54:20.873234" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:20.851341" elapsed="0.021984"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.886359" elapsed="0.000048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.899003" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.912624" elapsed="0.000052"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.913477" 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-04-10T00:54:20.914324" 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-04-10T00:54:20.914957" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.914800" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:20.914781" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.915248" 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-04-10T00:54:20.915446" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.915654" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:20.914724" elapsed="0.001010"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.914461" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.916552" elapsed="0.000064"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.916729" elapsed="0.000064"/>
</return>
<msg time="2026-04-10T00:54:20.917052" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:20.844416" elapsed="0.072780"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.920772" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:20.920391" elapsed="0.000459">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:20.921049" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:20.919895" elapsed="0.001200"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.921836" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.921278" elapsed="0.000630"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.922628" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.922267" elapsed="0.000389"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.921949" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.921219" elapsed="0.001527"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.926622" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:20.923668" elapsed="0.003004"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:20.926756" elapsed="0.000068"/>
</return>
<msg time="2026-04-10T00:54:20.927092" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:20.918606" elapsed="0.008594"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:20.930152" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:20.929867" elapsed="0.000355">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:20.930487" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:20.929268" elapsed="0.001267"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:20.930991" elapsed="0.000084"/>
</return>
<status status="PASS" start="2026-04-10T00:54:20.930692" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.930640" elapsed="0.000547"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.932027" elapsed="0.000041"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.932947" elapsed="0.000041"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.933079" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:54:20.935641" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:20.928102" elapsed="0.007652"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.939969" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.939482" elapsed="0.000594"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.941341" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.940951" elapsed="0.000497"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:20.961616" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:20.962693" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:20.963339" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:20.943817" elapsed="0.019587"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.941596" elapsed="0.021997"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.964476" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.963711" elapsed="0.001018"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.941527" elapsed="0.023296"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.973134" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.969108" elapsed="0.004506"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.968721" elapsed="0.004945"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.968669" elapsed="0.005031"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.977339" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:20.974174" elapsed="0.003213"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.973817" elapsed="0.003605"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.973789" elapsed="0.003657"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.978096" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.977674" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.978466" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.978220" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.979049" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.978734" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.978553" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.978200" elapsed="0.000936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.979837" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.979442" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.980193" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.979958" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:20.980860" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:20.980432" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.980274" elapsed="0.000649"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.979938" elapsed="0.001006"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:20.981122" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:20.982009" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:20.981683" elapsed="0.000356"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:20.982218" elapsed="0.004031"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:20.966686" elapsed="0.019703"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.986781" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:20.986530" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.986475" elapsed="0.000470"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:20.996591" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:20.987722" elapsed="0.008936"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:20.996765" elapsed="0.000098"/>
</return>
<msg time="2026-04-10T00:54:20.997180" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:20.936539" elapsed="0.060751"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:20.997828" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:54:20.998025" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:20.784337" elapsed="0.213718"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:20.998443" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:20.998147" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.998128" elapsed="0.000620"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:20.998782" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:20.779983" elapsed="0.218928"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:20.775587" elapsed="0.223368"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.775549" elapsed="0.223430"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:54:20.999665" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:54:20.999509" elapsed="0.000218"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:20.999789" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:20.999751" elapsed="0.000078"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:20.999491" elapsed="0.000363"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.000017" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:54:21.000139" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:20.999217" elapsed="0.000949"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.000781" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.000349" elapsed="0.000460"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.001508" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.001017" elapsed="0.000520"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.007538" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.007072" elapsed="0.000535"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.008207" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.007764" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:21.027524" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:21.027754" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:21 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":160052,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":160052,"Leader":"member-1-shard-inventory-config","LastIndex":160053,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":160053,"LastLogIndex":160053,"LastLeadershipChangeTime":"2026-04-10 00:53:13.793","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"274.4 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":160053,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":19038},"timestamp":1775782461,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:21.028041" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:21.020654" elapsed="0.007559"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.008319" elapsed="0.020295"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.028895" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.028664" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.008300" elapsed="0.021081"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.083453" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":160052,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":160052,"Leader":"member-1-shard-inventory-config","LastIndex":160053,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":160053,"LastLogIndex":160053,"LastLeadershipChangeTime":"2026-04-10 00:53:13.793","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"274.4 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":160053,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":19038},"timestamp":1775782461,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.032983" elapsed="0.050706"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.031534" elapsed="0.052220"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.031501" elapsed="0.052301"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.087730" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.085039" elapsed="0.002795"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.083913" elapsed="0.003975"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.083887" elapsed="0.004040"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.089406" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.088610" elapsed="0.000860"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.090145" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.089664" elapsed="0.000571"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.091290" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.090770" elapsed="0.000566"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.090274" elapsed="0.001113"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.089642" elapsed="0.001780"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.092839" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.092069" elapsed="0.000832"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.093552" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.093068" elapsed="0.000590"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.094542" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.094036" elapsed="0.000571"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.093696" elapsed="0.000963"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.093048" elapsed="0.001650"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:21.094987" elapsed="0.000781"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:21.096606" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.096079" elapsed="0.000589"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.096961" elapsed="0.002718"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:21.030221" elapsed="0.069629"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.100071" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:21.099936" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.099913" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:21.104014" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:21.100296" elapsed="0.003750"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:21.104099" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:54:21.104273" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:21.002532" elapsed="0.101769"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:21.104432" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:21.104610" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:21.001785" elapsed="0.102853"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.105889" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782461, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.105284" elapsed="0.000634"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:21.105967" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:21.106146" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782461, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:21.104892" elapsed="0.001281"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:21.106540" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 160053, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerIni...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.106335" elapsed="0.000251"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:21.106953" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.106745" elapsed="0.000265"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:21.107059" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:21.107217" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:20.773853" elapsed="0.333389"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:21.107300" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:54:21.107450" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:20.773104" elapsed="0.334370"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.107793" elapsed="0.000198"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.107559" elapsed="0.000469"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.108198" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.108052" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.108418" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.108275" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.107539" elapsed="0.000951"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:20.772927" elapsed="0.335587"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:20.216658" elapsed="0.891892"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:54:21.108610" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:21.108812" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:54:21.108858" level="INFO">${follower_list} = [2, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:54:20.212529" elapsed="0.896352"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.109327" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:54:21.109402" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:21.109055" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.109783" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.109493" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.109476" elapsed="0.000388"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.112112" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:54:21.110002" elapsed="0.002158"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:54:21.112557" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.112363" elapsed="0.000234"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:54:21.112645" 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="PASS" start="2026-04-10T00:54:20.209973" elapsed="0.902829"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:54:20.209751" elapsed="0.903100"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.117335" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:21.116939" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.117851" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:21.117525" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:21.117924" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:21.118082" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:21.116535" elapsed="0.001572"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:54:21.118265" elapsed="0.000157"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.118938" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:21.118601" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.119383" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:21.119124" elapsed="0.000285"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.119809" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:21.119573" elapsed="0.000262"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.122333" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.121983" elapsed="0.000377"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:21.122406" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:54:21.122585" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:21.121634" elapsed="0.000978"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.210881" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.210438" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:21.211800" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:21.211481" elapsed="0.000403">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:21.211981" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:21.211120" elapsed="0.000885"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.212595" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:21.212175" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:21.212984" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:21.213153" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:21.212790" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.213637" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.213345" 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-04-10T00:54:21.214860" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.214584" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.215355" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.215074" elapsed="0.000312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.215748" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.215960" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.216140" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:21.215606" elapsed="0.000594"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.215441" elapsed="0.000791"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:21.216279" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:54:21.216461" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:21.214184" elapsed="0.002304"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.213850" elapsed="0.002670"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.216717" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.216549" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.213823" elapsed="0.002972"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.217437" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.216945" elapsed="0.000520"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:21.217514" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:21.209702" elapsed="0.007960"/>
</kw>
<msg time="2026-04-10T00:54:21.217715" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:21.196443" elapsed="0.021371"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.232035" elapsed="0.000077"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.248553" elapsed="0.000150"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.265778" elapsed="0.000127"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.266975" elapsed="0.000052"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.267966" elapsed="0.000049"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.268814" elapsed="0.000112"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.268612" elapsed="0.000367"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:21.268585" elapsed="0.000430"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.269246" 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-04-10T00:54:21.269512" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.269803" elapsed="0.000033"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:21.268490" elapsed="0.001427"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.268145" elapsed="0.001886"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.270980" elapsed="0.000045"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.271130" elapsed="0.000060"/>
</return>
<msg time="2026-04-10T00:54:21.271459" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:21.189646" elapsed="0.082020"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:21.275353" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:21.275018" elapsed="0.000433">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:21.275823" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:21.274421" elapsed="0.001467"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.276546" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.276057" elapsed="0.000594"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.277451" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.277056" elapsed="0.000433"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.276702" elapsed="0.000851"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.275995" elapsed="0.001628"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.282429" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:21.278706" elapsed="0.003784"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:21.282626" elapsed="0.000102"/>
</return>
<msg time="2026-04-10T00:54:21.283108" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:21.272933" elapsed="0.010317"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:21.287888" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:21.287155" elapsed="0.000849">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:21.288282" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:21.286431" elapsed="0.001914"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:21.288929" elapsed="0.000117"/>
</return>
<status status="PASS" start="2026-04-10T00:54:21.288555" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.288480" elapsed="0.000729"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.290381" elapsed="0.000059"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.291445" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.291720" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:54:21.295256" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:21.284713" elapsed="0.011034"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.303885" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.302827" elapsed="0.001294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.306853" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.305804" elapsed="0.001276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:21.320616" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:21.321211" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:21.321596" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:21.312592" elapsed="0.009051"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.307403" elapsed="0.014347"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.322294" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.321833" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.307258" elapsed="0.015208"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.329814" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.325310" elapsed="0.005032"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.324909" elapsed="0.005489"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.324875" elapsed="0.005562"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.333867" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.330944" elapsed="0.002988"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.330589" elapsed="0.003387"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.330535" elapsed="0.003471"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.334790" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.334308" elapsed="0.000509"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.335275" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.334922" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.335898" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.335531" elapsed="0.000395"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.335364" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.334899" elapsed="0.001097"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.336595" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.336194" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.336969" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.336728" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.337576" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.337244" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.337052" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.336699" elapsed="0.000966"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:21.337859" elapsed="0.000390"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:21.338781" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.338452" elapsed="0.000355"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.338989" elapsed="0.002665"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:21.323748" elapsed="0.018049"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.342216" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:21.341973" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.341903" elapsed="0.000471"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:21.352528" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:21.343355" elapsed="0.009336"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:21.352809" elapsed="0.000140"/>
</return>
<msg time="2026-04-10T00:54:21.353364" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:21.296815" elapsed="0.056696"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:21.354068" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:54:21.354262" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:21.131156" elapsed="0.223135"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.354867" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.354430" elapsed="0.000700"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.354403" elapsed="0.000757"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:21.355196" 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="PASS" start="2026-04-10T00:54:21.126929" elapsed="0.228441"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.122686" elapsed="0.232744"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.122667" elapsed="0.232798"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:54:21.356374" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:54:21.356218" elapsed="0.000242"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.356552" elapsed="0.000122"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:21.356495" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.356192" elapsed="0.000553"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.356931" elapsed="0.000030"/>
</kw>
<msg time="2026-04-10T00:54:21.357074" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:21.355836" elapsed="0.001265"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.357820" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.357296" elapsed="0.000562"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.358588" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.358038" elapsed="0.000591"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.365826" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.365129" elapsed="0.000767"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.366657" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.366116" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:21.386496" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:21.386695" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:21 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:52:30.281","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"245.1 μs","Voting":true,"CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782461,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:21.386938" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:21.379511" elapsed="0.007539"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.366792" elapsed="0.020531"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.387610" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.387365" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.366767" elapsed="0.021209"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.394198" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:52:30.281","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"245.1 μs","Voting":true,"CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782461,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.390496" elapsed="0.003889"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.389339" elapsed="0.005099"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.389319" elapsed="0.005160"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.398046" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.395518" elapsed="0.002633"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.394599" elapsed="0.003604"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.394554" elapsed="0.003690"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.399949" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.399121" elapsed="0.000893"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.400938" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.400189" elapsed="0.000841"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.401958" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.401410" elapsed="0.000595"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.401068" elapsed="0.000989"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.400167" elapsed="0.001926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.403658" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.402852" elapsed="0.000869"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.404416" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.403896" elapsed="0.000612"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.405425" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.404905" elapsed="0.000567"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.404546" elapsed="0.000978"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.403875" elapsed="0.001702"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:21.405822" elapsed="0.000728"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:21.407446" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.406930" elapsed="0.000577"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.407819" elapsed="0.003198"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:21.388558" elapsed="0.022636"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.411422" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:21.411282" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.411257" elapsed="0.000236"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:21.415286" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:21.411669" elapsed="0.003648"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:21.415370" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:54:21.415540" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:21.359758" elapsed="0.055827"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:21.415644" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:21.415799" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:21.358874" elapsed="0.056951"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.417000" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782461, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.416448" elapsed="0.000581"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:21.417146" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:21.417327" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782461, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:21.416068" elapsed="0.001286"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:21.417798" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.417515" elapsed="0.000312"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:21.418188" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.417987" elapsed="0.000227"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:21.418261" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:21.418418" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:21.121012" elapsed="0.297431"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:21.418502" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:54:21.418671" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:21.120271" elapsed="0.298426"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.419003" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.418782" elapsed="0.000452"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.419408" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.419259" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.419648" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.419487" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.418764" elapsed="0.000960"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:21.120097" elapsed="0.299651"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.422184" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.421848" elapsed="0.000363"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:21.422256" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:21.422406" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:21.421465" elapsed="0.000967"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.513952" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.513525" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:21.514849" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:21.514548" elapsed="0.000384">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:21.515028" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:21.514170" elapsed="0.000882"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.515628" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:21.515221" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:21.515961" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:21.516174" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:21.515819" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.516715" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.516439" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.517767" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.517487" elapsed="0.000326"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.518255" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.517981" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.518664" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.518875" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.519052" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:21.518507" elapsed="0.000602"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.518338" elapsed="0.000803"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:21.519192" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:54:21.519365" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:21.517161" elapsed="0.002229"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.516848" elapsed="0.002573"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.519613" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.519447" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.516821" elapsed="0.002869"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.520284" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.519838" elapsed="0.000474"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:21.520359" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:21.512895" elapsed="0.007588"/>
</kw>
<msg time="2026-04-10T00:54:21.520536" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:21.499789" elapsed="0.020846"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.533249" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.545884" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.558688" elapsed="0.000083"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.559658" 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-04-10T00:54:21.560497" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.561237" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.561080" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:21.561060" 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-04-10T00:54:21.561484" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.561697" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.561886" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:21.561000" elapsed="0.000967"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.560735" elapsed="0.001275"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.562766" elapsed="0.000039"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.562893" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:54:21.563173" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:21.493193" elapsed="0.070135"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:21.566583" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:21.566262" elapsed="0.000399">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:21.566858" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:21.565759" elapsed="0.001145"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.567482" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.567044" elapsed="0.000506"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.568207" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.567901" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.567608" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.566989" elapsed="0.001331"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.571708" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:21.569093" elapsed="0.002664"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:21.571842" elapsed="0.000080"/>
</return>
<msg time="2026-04-10T00:54:21.572191" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:21.564403" elapsed="0.007899"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:21.575387" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:21.575088" elapsed="0.000379">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:21.575695" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:21.574612" elapsed="0.001127"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:21.576142" elapsed="0.000083"/>
</return>
<status status="PASS" start="2026-04-10T00:54:21.575879" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.575824" elapsed="0.000511"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.577108" 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-04-10T00:54:21.578021" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.578201" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:54:21.580489" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:21.573211" elapsed="0.007405"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.584520" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.584122" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.585902" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.585361" 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-04-10T00:54:21.608839" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:21.609798" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:21.610277" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:21.588307" elapsed="0.022030"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.586127" elapsed="0.024345"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.611210" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.610623" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.586075" elapsed="0.025377"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.619055" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.615429" elapsed="0.003977"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.614921" elapsed="0.004523"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.614876" elapsed="0.004593"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.622141" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.619845" elapsed="0.002342"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.619554" elapsed="0.002667"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.619533" elapsed="0.002712"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.622865" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.622449" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.623225" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.622985" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.623842" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.623471" elapsed="0.000398"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.623307" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.622966" elapsed="0.000960"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.624512" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.624109" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.624885" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.624649" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.625434" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.625129" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.624967" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.624630" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:21.625711" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:21.626559" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.626258" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.626776" elapsed="0.002450"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:21.613238" elapsed="0.016117"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.629728" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:21.629486" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.629435" elapsed="0.000446"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:21.639241" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:21.630652" elapsed="0.008640"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:21.639376" elapsed="0.000070"/>
</return>
<msg time="2026-04-10T00:54:21.639798" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:21.581298" elapsed="0.058615"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:21.640379" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:54:21.640576" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:21.432471" elapsed="0.208133"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.641179" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.640730" elapsed="0.000648"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.640710" elapsed="0.000694"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:21.641439" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:21.426791" elapsed="0.214794"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.422704" elapsed="0.218926"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.422482" elapsed="0.219173"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:54:21.642276" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:54:21.642170" elapsed="0.000166"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.642396" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:21.642359" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.642152" elapsed="0.000305"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.642623" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:54:21.642745" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:21.641890" elapsed="0.000881"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.643479" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.642943" elapsed="0.000563"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.644147" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.643687" elapsed="0.000489"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.649904" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.649443" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.650557" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.650114" elapsed="0.000504"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:21.669868" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:21.670009" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:21 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:52:30.268","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.111","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.109","active":true,"matchIndex":-1,"voting":true,"id":"member-3-shard-topology-config","nextIndex":0}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"551.9 μs","CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782461,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:21.670206" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:21.662028" elapsed="0.008287"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.650687" elapsed="0.019906"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.670781" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.670624" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.650668" elapsed="0.020461"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.676121" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:52:30.268","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.111","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.109","active":true,"matchIndex":-1,"voting":true,"id":"member-3-shard-topology-config","nextIndex":0}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"551.9 μs","CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782461,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.673459" elapsed="0.002780"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.672540" elapsed="0.003749"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.672522" elapsed="0.003805"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.679816" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.677287" elapsed="0.002629"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.676410" elapsed="0.003555"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.676392" elapsed="0.003612"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.681422" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.680643" elapsed="0.000842"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.682138" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.681671" elapsed="0.000555"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.683122" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.682614" elapsed="0.000555"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.682265" elapsed="0.000955"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.681651" elapsed="0.001605"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.684747" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.683989" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.685436" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.684975" elapsed="0.000597"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.686435" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.685941" elapsed="0.000540"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.685613" elapsed="0.000917"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.684956" elapsed="0.001625"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:21.686809" elapsed="0.000611"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:21.688255" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.687767" elapsed="0.000547"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.688642" elapsed="0.002551"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:21.671840" elapsed="0.019512"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.691555" elapsed="0.000163"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:21.691426" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.691408" elapsed="0.000364"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:21.695481" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:21.691920" elapsed="0.003591"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:21.695727" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:54:21.695930" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:21.645184" elapsed="0.050774"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:21.696015" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:21.696166" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:21.644391" elapsed="0.051801"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.697274" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782461, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.696785" elapsed="0.000518"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:21.697351" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:21.697530" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782461, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:21.696419" elapsed="0.001154"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:21.698000" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.697764" elapsed="0.000264"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:21.698386" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.698186" elapsed="0.000225"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:21.698457" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:21.698628" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:21.420858" elapsed="0.277796"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:21.698713" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:21.698864" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:21.420091" elapsed="0.278797"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.699187" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.698969" elapsed="0.000275"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.699474" elapsed="0.000238"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.699267" elapsed="0.000484"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.699926" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.699775" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.698952" elapsed="0.001049"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:21.419918" elapsed="0.280106"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.702511" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.702185" elapsed="0.000353"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:21.702602" elapsed="0.001611"/>
</return>
<msg time="2026-04-10T00:54:21.704357" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:21.701768" 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-04-10T00:54:21.793384" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.792979" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:21.794295" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:21.794036" elapsed="0.000335">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:21.794467" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:21.793613" elapsed="0.000879"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.795085" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:21.794685" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:21.795419" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:21.795619" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:21.795276" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.796073" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.795809" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.797129" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.796868" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.797629" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.797339" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.797997" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.798205" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.798384" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:21.797854" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.797711" elapsed="0.000762"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:21.798522" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:54:21.798709" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:21.796513" elapsed="0.002221"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.796198" elapsed="0.002569"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.798942" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.798791" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.796175" elapsed="0.002842"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.799640" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.799162" elapsed="0.000507"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:21.799716" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:21.792340" elapsed="0.007500"/>
</kw>
<msg time="2026-04-10T00:54:21.799894" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:21.779461" elapsed="0.020513"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.812860" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.825652" elapsed="0.000086"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.838637" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.839408" elapsed="0.000036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.840180" elapsed="0.000035"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.840779" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.840628" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:21.840611" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.841022" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.841209" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.841394" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:21.840544" elapsed="0.000924"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.840321" elapsed="0.001186"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.842229" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.842348" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:54:21.842585" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:21.773141" elapsed="0.069554"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:21.845547" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:21.845292" elapsed="0.000336">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:21.845818" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:21.844853" elapsed="0.001007"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.846373" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.845995" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.847069" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.846771" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.846479" elapsed="0.000661"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.845945" elapsed="0.001232"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.850697" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:21.848021" elapsed="0.002729"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:21.850828" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:54:21.851161" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:21.843696" elapsed="0.007569"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:21.854147" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:21.853896" elapsed="0.000316">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:21.854400" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:21.853433" elapsed="0.001011"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:21.854842" elapsed="0.000078"/>
</return>
<status status="PASS" start="2026-04-10T00:54:21.854593" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.854525" elapsed="0.000503"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.855852" elapsed="0.000038"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.856636" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.856745" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:54:21.858951" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:21.852292" elapsed="0.006768"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.862899" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.862492" elapsed="0.000506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.864232" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.863854" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:21.890082" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:21.890589" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:21.890898" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:21.866632" elapsed="0.024297"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.864453" elapsed="0.026564"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.891402" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.891079" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.864404" elapsed="0.027120"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.896353" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.893474" elapsed="0.003264"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.893189" elapsed="0.003588"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.893164" elapsed="0.003641"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.899531" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.897143" elapsed="0.002457"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.896897" elapsed="0.002740"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.896877" elapsed="0.002785"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.900310" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.899896" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.900782" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.900432" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.901351" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.901035" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.900868" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.900412" elapsed="0.001052"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.902033" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.901664" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.902392" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.902153" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.902962" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.902655" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.902475" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.902133" elapsed="0.000912"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:21.903233" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:21.904108" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.903802" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.904313" elapsed="0.002453"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:21.892367" elapsed="0.014534"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.907268" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:21.907042" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.906988" elapsed="0.000434"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:21.917327" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:21.908179" elapsed="0.009198"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:21.917476" elapsed="0.000095"/>
</return>
<msg time="2026-04-10T00:54:21.917941" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:21.859809" elapsed="0.058243"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:21.918530" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T00:54:21.918742" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:21.713017" elapsed="0.205752"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.919120" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.918854" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.918837" elapsed="0.000554"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:21.919426" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:21.708474" elapsed="0.211084"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.704455" elapsed="0.215163"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.704437" elapsed="0.215205"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:54:21.920268" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:54:21.920161" elapsed="0.000167"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.920389" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:21.920351" elapsed="0.000078"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.920143" elapsed="0.000308"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.920619" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:54:21.920741" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:21.919880" elapsed="0.000886"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.921331" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.920946" elapsed="0.000411"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.922041" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.921516" elapsed="0.000553"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.927985" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.927519" elapsed="0.000514"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.928650" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.928190" elapsed="0.000505"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:21.947714" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:21.947904" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:21 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:53:13.451","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"266.8 μs","Voting":true,"CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782461,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:21.948177" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:21.940323" elapsed="0.008000"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.928762" elapsed="0.020245"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.949272" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.949052" elapsed="0.000679"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.928744" elapsed="0.021024"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.956168" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":-1,"LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:53:13.451","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"266.8 μs","Voting":true,"CurrentTerm":4,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782461,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.952835" elapsed="0.003502"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.951493" elapsed="0.004895"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.951466" elapsed="0.004961"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.959917" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:21.957391" elapsed="0.002627"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.956511" elapsed="0.003556"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.956492" elapsed="0.003614"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.961598" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.960805" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.962302" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.961829" elapsed="0.000562"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.963309" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.962807" elapsed="0.000548"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.962428" elapsed="0.000977"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.961810" elapsed="0.001629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.964885" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.964134" elapsed="0.000811"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.965590" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.965112" elapsed="0.000566"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.966538" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.966046" elapsed="0.000571"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.965716" elapsed="0.000952"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.965092" elapsed="0.001611"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:21.966933" elapsed="0.000623"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:21.968440" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.967942" elapsed="0.000559"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.968847" elapsed="0.002487"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:21.950499" elapsed="0.020995"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:21.971840" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:21.971709" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.971552" elapsed="0.000359"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:21.975813" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:21.972058" elapsed="0.003786"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:21.975896" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:54:21.976059" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:21.923212" elapsed="0.052874"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:21.976143" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:21.976319" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:21.922285" elapsed="0.054061"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.977459" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782461, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:21.976995" elapsed="0.000493"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:21.977590" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:54:21.977770" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782461, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:21.976643" elapsed="0.001154"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:21.978156" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 4, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.977955" elapsed="0.000229"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:21.978538" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.978340" elapsed="0.000240"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:21.978628" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:21.978782" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:21.701100" elapsed="0.277736"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:21.978897" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:21.979237" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:21.700364" elapsed="0.278897"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.979573" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.979341" elapsed="0.000461"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.979972" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.979826" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.980337" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.980194" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.979324" elapsed="0.001085"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:21.700194" elapsed="0.280238"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:21.119887" elapsed="0.860577"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:54:21.980507" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:21.980789" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:54:21.980836" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:54:21.115811" elapsed="0.865050"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.981310" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:54:21.981386" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:21.981042" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:21.981712" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:21.981478" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.981461" elapsed="0.000327"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.983941" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:54:21.981925" elapsed="0.002063"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:54:21.984339" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:21.984153" elapsed="0.000211"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:54:21.984410" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:54:21.113178" elapsed="0.871405"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:54:21.112948" elapsed="0.871684"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.989053" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:21.988668" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.989612" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:21.989281" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:21.989686" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:21.989843" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:21.988279" elapsed="0.001590"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:54:21.990030" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.990703" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:21.990349" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.991157" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:21.990892" elapsed="0.000292"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.991589" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:21.991335" elapsed="0.000281"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:21.994077" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:21.993754" elapsed="0.000351"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:21.994151" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:21.994301" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:21.993390" elapsed="0.000936"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.083349" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.082940" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:22.084182" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:22.083911" elapsed="0.000349">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:22.084353" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:22.083575" elapsed="0.000803"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.085067" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:22.084549" elapsed="0.000549"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:22.085419" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:22.085601" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:22.085271" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.086052" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.085791" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.087101" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.086845" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.087600" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.087310" 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-04-10T00:54:22.087964" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.088170" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.088347" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:22.087820" elapsed="0.000663"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.087681" elapsed="0.000835"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:22.088580" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:54:22.088808" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:22.086499" elapsed="0.002336"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.086180" elapsed="0.002689"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.089051" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.088897" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.086157" elapsed="0.002972"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.089745" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.089276" elapsed="0.000498"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:22.089823" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:22.082252" elapsed="0.007873"/>
</kw>
<msg time="2026-04-10T00:54:22.090252" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:22.069013" elapsed="0.021421"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.107661" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.120155" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.132810" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.133649" 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-04-10T00:54:22.134579" elapsed="0.000039"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.135194" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.135003" elapsed="0.000254"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:22.134986" 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-04-10T00:54:22.135449" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.135660" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.135852" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:22.134934" elapsed="0.001000"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.134705" elapsed="0.001269"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.136909" elapsed="0.000081"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.137080" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:54:22.137312" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:22.062269" elapsed="0.075149"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:22.140550" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:22.140286" elapsed="0.000348">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:22.140830" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:22.139841" elapsed="0.001036"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.141399" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.141011" elapsed="0.000456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.142131" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.141829" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.141507" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.140960" elapsed="0.001283"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.145504" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:22.143074" elapsed="0.002482"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:22.145808" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:54:22.146145" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:22.138713" elapsed="0.007540"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:22.149106" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:22.148857" elapsed="0.000312">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:22.149365" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:22.148373" elapsed="0.001037"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:22.149856" elapsed="0.000082"/>
</return>
<status status="PASS" start="2026-04-10T00:54:22.149548" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.149493" elapsed="0.000555"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.150929" elapsed="0.000039"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.151718" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.151829" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:54:22.154109" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:22.147210" elapsed="0.007008"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.158223" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.157802" elapsed="0.000525"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.159591" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.159191" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:22.169979" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:22.170491" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:22.170763" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:22.162020" elapsed="0.008771"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.159817" elapsed="0.011032"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.171278" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.170903" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.159766" elapsed="0.011678"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.178227" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.174056" elapsed="0.004671"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.173717" elapsed="0.005064"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.173686" elapsed="0.005132"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.181476" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.179145" elapsed="0.002378"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.178916" elapsed="0.002657"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.178898" elapsed="0.002701"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.182183" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.181791" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.182587" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.182330" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.183143" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.182833" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.182670" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.182311" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.183787" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.183408" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.184141" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.183907" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.184867" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.184411" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.184222" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.183888" elapsed="0.001064"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:22.185125" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:22.185987" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.185687" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.186189" elapsed="0.002488"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:22.172623" elapsed="0.016181"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.189157" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:22.188936" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.188885" elapsed="0.000420"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:22.198411" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:22.190058" elapsed="0.008408"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:22.198578" elapsed="0.000067"/>
</return>
<msg time="2026-04-10T00:54:22.198904" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:22.154988" elapsed="0.044023"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:22.199470" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:22.199664" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:22.002740" elapsed="0.196951"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.200015" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.199775" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.199757" elapsed="0.000473"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:22.200265" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:21.998534" elapsed="0.201858"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:21.994395" elapsed="0.206041"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:21.994377" elapsed="0.206083"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:54:22.201137" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:54:22.201030" elapsed="0.000169"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.201259" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:22.201222" elapsed="0.000077"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.201013" elapsed="0.000309"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.201469" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:54:22.201606" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:22.200761" elapsed="0.000873"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.202177" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.201806" elapsed="0.000398"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.202873" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.202359" elapsed="0.000544"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.208678" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.208216" elapsed="0.000510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.209315" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.208882" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:22.227147" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:22.227450" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:22 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:22 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":4,"SnapshotIndex":117,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":117,"Leader":"member-1-shard-default-config","LastIndex":118,"RaftState":"Leader","LastApplied":118,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":118,"LastLeadershipChangeTime":"2026-04-10 00:49:56.029","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.252","active":true,"matchIndex":118,"voting":true,"id":"member-3-shard-default-config","nextIndex":119},{"timeSinceLastActivity":"00:00:00.251","active":true,"matchIndex":118,"voting":true,"id":"member-2-shard-default-config","nextIndex":119}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"335.6 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":118,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":18,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":12295},"timestamp":1775782462,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:22.228596" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:22.220800" elapsed="0.008041"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.209427" elapsed="0.019988"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.229863" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.229480" elapsed="0.001134"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.209409" elapsed="0.021263"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.238520" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":4,"SnapshotIndex":117,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":117,"Leader":"member-1-shard-default-config","LastIndex":118,"RaftState":"Leader","LastApplied":118,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":118,"LastLeadershipChangeTime":"2026-04-10 00:49:56.029","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.252","active":true,"matchIndex":118,"voting":true,"id":"member-3-shard-default-config","nextIndex":119},{"timeSinceLastActivity":"00:00:00.251","active":true,"matchIndex":118,"voting":true,"id":"member-2-shard-default-config","nextIndex":119}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"335.6 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":118,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":18,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":12295},"timestamp":1775782462,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.234471" elapsed="0.004247"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.233092" elapsed="0.005700"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.233064" elapsed="0.005784"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.243024" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.240533" elapsed="0.002590"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.238976" elapsed="0.004196"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.238950" elapsed="0.004280"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.244707" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.243943" elapsed="0.000825"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.245396" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.244935" elapsed="0.000549"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.246379" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.245871" elapsed="0.000554"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.245522" elapsed="0.000954"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.244915" elapsed="0.001596"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.248118" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.247344" elapsed="0.000836"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.248836" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.248347" elapsed="0.000581"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.249822" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.249298" elapsed="0.000572"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.248966" elapsed="0.000953"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.248327" elapsed="0.001627"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:22.250178" elapsed="0.000719"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:22.252141" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.251384" elapsed="0.000820"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.252494" elapsed="0.002651"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:22.232039" elapsed="0.023266"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.255581" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:22.255423" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.255361" elapsed="0.000292"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:22.261520" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:22.255810" elapsed="0.005780"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:22.261673" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:54:22.261979" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:22.203872" elapsed="0.058149"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:22.262110" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:54:22.262336" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:22.203117" elapsed="0.059259"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.264379" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782462, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.263357" elapsed="0.001067"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:22.264498" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:54:22.264862" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782462, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:22.262837" elapsed="0.002081"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:22.265472" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 118, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.265161" elapsed="0.000351"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:22.266158" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.265843" elapsed="0.000354"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:22.266267" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:54:22.266489" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:21.992778" elapsed="0.273748"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:22.266671" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:54:22.266998" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:21.992042" elapsed="0.274997"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.267662" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.267184" elapsed="0.000585"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.268138" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.267812" elapsed="0.000663"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.268759" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.268510" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.267154" elapsed="0.001729"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:21.991871" elapsed="0.277046"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.272363" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.272036" elapsed="0.000355"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:22.272436" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:22.272604" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:22.271510" elapsed="0.001120"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.366819" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.366267" elapsed="0.000586"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:22.367795" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:22.367506" elapsed="0.000368">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:22.367972" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:22.367036" elapsed="0.000962"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.368587" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:22.368174" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:22.368926" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:22.369093" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:22.368780" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.369613" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.369332" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.370672" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.370391" elapsed="0.000329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.371166" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.370885" 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-04-10T00:54:22.371533" elapsed="0.000040"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.371764" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.371950" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:22.371394" elapsed="0.000616"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.371249" elapsed="0.000792"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:22.372089" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:54:22.372274" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:22.370051" elapsed="0.002250"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.369741" elapsed="0.002593"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.372513" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.372360" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.369718" elapsed="0.002891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.373203" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.372757" elapsed="0.000483"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:22.373339" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:22.365629" elapsed="0.007842"/>
</kw>
<msg time="2026-04-10T00:54:22.373527" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:22.352705" elapsed="0.020921"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.387861" elapsed="0.000044"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.400588" elapsed="0.000101"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.413534" elapsed="0.000070"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.414392" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.415220" elapsed="0.000039"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.415837" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.415683" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:22.415665" 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-04-10T00:54:22.416081" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.416267" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.416450" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:22.415609" elapsed="0.000915"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.415354" elapsed="0.001227"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.417297" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.417417" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:54:22.417676" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:22.346287" elapsed="0.071499"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:22.420740" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:22.420440" elapsed="0.000375">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:22.421004" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:22.419957" elapsed="0.001090"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.421577" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.421178" elapsed="0.000469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.422295" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.421968" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.421687" elapsed="0.000679"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.421127" elapsed="0.001277"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.425634" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:22.423250" elapsed="0.002431"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:22.425759" elapsed="0.000063"/>
</return>
<msg time="2026-04-10T00:54:22.426075" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:22.418818" elapsed="0.007387"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:22.429033" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:22.428790" elapsed="0.000306">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:22.429283" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:22.428338" elapsed="0.000989"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:22.429727" elapsed="0.000081"/>
</return>
<status status="PASS" start="2026-04-10T00:54:22.429458" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.429407" elapsed="0.000508"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.430722" elapsed="0.000039"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.431476" elapsed="0.000035"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.431652" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:54:22.433868" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:22.427219" elapsed="0.006757"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.437877" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.437461" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.439291" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.438908" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:22.458386" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:22.459375" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:22.459891" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:22.441806" elapsed="0.018147"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.439515" elapsed="0.020561"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.460780" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.460174" elapsed="0.000854"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.439464" elapsed="0.021650"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.469603" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.465498" elapsed="0.004431"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.464961" elapsed="0.005004"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.464911" elapsed="0.005079"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.472679" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.470298" elapsed="0.002428"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.470070" elapsed="0.002692"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.470052" elapsed="0.002734"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.473371" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.472984" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.473748" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.473490" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.474298" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.473992" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.473830" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.473471" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.474979" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.474579" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.475335" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.475098" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.475896" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.475595" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.475417" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.475079" elapsed="0.000901"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:22.476153" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:22.477111" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.476737" elapsed="0.000405"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.477368" elapsed="0.002934"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:22.463021" elapsed="0.017432"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.480893" elapsed="0.000059"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:22.480630" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.480554" elapsed="0.000524"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:22.494352" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:22.481999" elapsed="0.012433"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:22.494575" elapsed="0.000110"/>
</return>
<msg time="2026-04-10T00:54:22.495037" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:22.434763" elapsed="0.060405"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:22.495793" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:54:22.496017" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:22.281511" elapsed="0.214542"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.496597" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.496176" elapsed="0.000724"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.496151" elapsed="0.000787"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:22.496983" 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="PASS" start="2026-04-10T00:54:22.277174" elapsed="0.219976"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.272697" elapsed="0.224511"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.272680" elapsed="0.224560"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:54:22.498107" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:54:22.497971" elapsed="0.000215"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.498264" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:22.498217" elapsed="0.000099"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.497948" elapsed="0.000396"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.498579" elapsed="0.000029"/>
</kw>
<msg time="2026-04-10T00:54:22.498731" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:22.497552" elapsed="0.001211"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.499607" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.499004" elapsed="0.000638"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.500427" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.499847" elapsed="0.000615"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.509250" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.508000" elapsed="0.001420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.511155" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.509907" elapsed="0.001358"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:22.536751" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:22.536944" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:22 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:22 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":117,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":117,"Leader":"member-1-shard-default-config","LastIndex":118,"RaftState":"Follower","LastApplied":118,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":118,"LastLeadershipChangeTime":"2026-04-10 00:51:04.137","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"288.8 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":118,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":12295},"timestamp":1775782462,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:22.537206" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:22.528900" elapsed="0.008422"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.511540" elapsed="0.026092"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.537938" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.537690" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.511390" elapsed="0.026909"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.545618" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":117,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":117,"Leader":"member-1-shard-default-config","LastIndex":118,"RaftState":"Follower","LastApplied":118,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":118,"LastLeadershipChangeTime":"2026-04-10 00:51:04.137","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"288.8 μs","CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":118,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":12295},"timestamp":1775782462,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.541249" elapsed="0.004765"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.540098" elapsed="0.006026"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.540071" elapsed="0.006133"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.551111" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.547995" elapsed="0.003227"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.546371" elapsed="0.004907"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.546336" elapsed="0.004993"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.553048" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.552184" elapsed="0.000928"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.553838" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.553299" elapsed="0.000637"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.554917" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.554335" elapsed="0.000632"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.553976" elapsed="0.001046"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.553275" elapsed="0.001784"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.556838" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.555884" elapsed="0.001018"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.557610" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.557080" elapsed="0.000623"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.558770" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.558086" elapsed="0.000733"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.557743" elapsed="0.001129"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.557058" elapsed="0.001851"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:22.559156" elapsed="0.000680"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:22.560819" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.560190" elapsed="0.000692"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.561177" elapsed="0.003064"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:22.539129" elapsed="0.025392"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.564789" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:22.564643" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.564614" elapsed="0.000252"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:22.568968" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:22.565036" elapsed="0.003965"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:22.569058" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:54:22.569239" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:22.501735" elapsed="0.067531"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:22.569328" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:22.569487" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:22.500758" elapsed="0.068758"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.570887" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782462, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.570218" elapsed="0.000700"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:22.571048" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:54:22.571238" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782462, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:22.569809" elapsed="0.001457"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:22.571675" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 118, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.571431" elapsed="0.000275"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:22.572083" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.571871" elapsed="0.000239"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:22.572161" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:22.572324" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:22.270600" elapsed="0.301749"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:22.572410" elapsed="0.000081"/>
</return>
<msg time="2026-04-10T00:54:22.572645" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:22.269405" elapsed="0.303270"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.573003" elapsed="0.000204"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.572769" elapsed="0.000478"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.573422" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.573272" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.573674" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.573501" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.572749" elapsed="0.001015"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:22.269153" elapsed="0.304638"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.576375" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.575989" elapsed="0.000416"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:22.576451" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:54:22.576664" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:22.575616" elapsed="0.001075"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.668463" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.668059" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:22.669410" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:22.669109" elapsed="0.000380">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:22.669625" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:22.668695" elapsed="0.000960"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.670301" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:22.669834" elapsed="0.000496"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:22.670667" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:22.670829" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:22.670501" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.671362" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.671101" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.672444" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.672182" elapsed="0.000310"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.672954" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.672677" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.673332" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.673547" 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-04-10T00:54:22.673744" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:22.673189" elapsed="0.000615"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.673041" elapsed="0.000795"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:22.673884" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:54:22.674097" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:22.671832" elapsed="0.002293"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.671490" elapsed="0.002670"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.674340" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.674186" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.671466" elapsed="0.002953"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.675037" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.674585" elapsed="0.000484"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:22.675120" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:22.667410" elapsed="0.007838"/>
</kw>
<msg time="2026-04-10T00:54:22.675305" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:22.654109" elapsed="0.021279"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.688360" elapsed="0.000046"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.701142" elapsed="0.000045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.714400" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.715258" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.716061" elapsed="0.000038"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.716724" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.716555" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:22.716534" elapsed="0.000274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.716972" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.717164" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.717361" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:22.716482" elapsed="0.000958"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.716241" elapsed="0.001241"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.718238" elapsed="0.000038"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.718380" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:54:22.718639" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:22.646844" elapsed="0.071906"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:22.721910" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:22.721640" elapsed="0.000338">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:22.722175" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:22.721116" elapsed="0.001103"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.722779" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.722351" elapsed="0.000537"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.723526" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.723209" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.722930" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.722300" elapsed="0.001459"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.727028" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:22.724516" elapsed="0.002560"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:22.727157" elapsed="0.000063"/>
</return>
<msg time="2026-04-10T00:54:22.727476" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:22.719870" elapsed="0.007905"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:22.730602" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:22.730335" elapsed="0.000335">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:22.730928" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:22.729885" elapsed="0.001211"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:22.731526" elapsed="0.000136"/>
</return>
<status status="PASS" start="2026-04-10T00:54:22.731257" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.731197" elapsed="0.000605"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.732550" elapsed="0.000054"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.733329" elapsed="0.000039"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.733484" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:54:22.735879" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:22.728720" elapsed="0.007267"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.740043" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.739506" elapsed="0.000638"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.741309" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.740864" elapsed="0.000543"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:22.761868" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:22.762819" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:22.763276" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:22.744927" elapsed="0.018408"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.741537" elapsed="0.021930"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.764260" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.763673" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.741486" elapsed="0.023026"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.773329" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.768772" elapsed="0.004933"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.768217" elapsed="0.005528"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.768169" elapsed="0.005626"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.776539" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.774135" elapsed="0.002525"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.773900" elapsed="0.002796"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.773879" elapsed="0.002842"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.777319" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.776923" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.777697" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.777439" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.778258" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.777946" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.777781" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.777420" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.778907" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.778525" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.779262" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.779027" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.779986" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.779505" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.779344" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.779007" elapsed="0.001067"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:22.780253" elapsed="0.000377"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:22.781124" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.780822" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.781325" elapsed="0.002469"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:22.766471" elapsed="0.017488"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.784330" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:22.784099" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.784046" elapsed="0.000437"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:22.793760" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:22.785270" elapsed="0.008540"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:22.793889" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:54:22.794229" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:22.736706" elapsed="0.057631"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:22.794816" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:54:22.795000" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:22.585919" elapsed="0.209109"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.795363" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.795113" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.795096" elapsed="0.000518"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:22.795649" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:22.581446" elapsed="0.214348"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.576766" elapsed="0.219075"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.576745" elapsed="0.219121"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:54:22.796578" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:54:22.796451" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.796704" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:22.796666" elapsed="0.000077"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.796433" elapsed="0.000332"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.796920" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:54:22.797043" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:22.796172" elapsed="0.000896"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.797632" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.797238" elapsed="0.000421"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.798278" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.797816" elapsed="0.000491"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.804038" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.803589" elapsed="0.000498"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.804772" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.804293" elapsed="0.000525"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:22.823657" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:22.823851" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:22 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:22 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":117,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":117,"Leader":"member-1-shard-default-config","LastIndex":118,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":118,"LastLogIndex":118,"LastLeadershipChangeTime":"2026-04-10 00:53:13.515","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"285.0 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":118,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":12295},"timestamp":1775782462,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:22.824160" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:22.816046" elapsed="0.008270"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.804886" elapsed="0.019897"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.825054" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.824828" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.804869" elapsed="0.020676"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.832792" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":117,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":117,"Leader":"member-1-shard-default-config","LastIndex":118,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":118,"LastLogIndex":118,"LastLeadershipChangeTime":"2026-04-10 00:53:13.515","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"285.0 μs","Voting":true,"CurrentTerm":3,"LastTerm":3,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":3,"StatRetrievalError":null,"CommitIndex":118,"SnapshotTerm":3,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":12295},"timestamp":1775782462,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.828960" elapsed="0.004054"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.827636" elapsed="0.005451"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.827608" elapsed="0.005535"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.837827" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.834518" elapsed="0.003412"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.833261" elapsed="0.004719"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.833236" elapsed="0.004783"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.839458" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.838683" elapsed="0.000837"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.840202" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.839709" elapsed="0.000582"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.841236" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.840696" elapsed="0.000587"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.840329" elapsed="0.001006"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.839689" elapsed="0.001682"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.842770" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.842016" elapsed="0.000814"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.843459" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.842996" elapsed="0.000553"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.844425" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.843933" elapsed="0.000538"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.843602" elapsed="0.000918"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.842976" elapsed="0.001659"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:22.844923" elapsed="0.000659"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:22.846394" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.845895" elapsed="0.000561"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.846763" elapsed="0.002624"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:22.826328" elapsed="0.023222"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.849764" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:22.849637" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.849619" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:22.853592" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:22.849984" elapsed="0.003639"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:22.853675" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:54:22.853839" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:22.799275" elapsed="0.054590"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:22.853923" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:22.854073" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757824...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:22.798520" elapsed="0.055579"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.855205" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782462, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:22.854693" elapsed="0.000549"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:22.855352" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:54:22.855537" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782462, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:22.854328" elapsed="0.001256"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:22.856038" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 118, 'CommittedTransactionsCount': 0, 'CurrentTerm': 3, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.855773" elapsed="0.000303"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:22.856448" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.856244" elapsed="0.000230"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:22.856520" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:54:22.856926" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:22.574985" elapsed="0.281968"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:22.857051" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:22.857207" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:22.574165" elapsed="0.283067"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.857533" elapsed="0.000212"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:22.857313" elapsed="0.000470"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.857954" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.857807" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.858174" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.858031" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.857296" elapsed="0.000949"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:22.573972" elapsed="0.284297"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:21.991667" elapsed="0.866635"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:54:22.858346" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:22.858551" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:54:22.858617" level="INFO">${follower_list} = [2, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:54:21.987555" elapsed="0.871086"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.859081" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:54:22.859156" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:22.858816" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:22.859460" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:22.859247" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.859230" elapsed="0.000305"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.861763" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:54:22.859691" elapsed="0.002121"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:54:22.862164" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.861978" elapsed="0.000211"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:54:22.862235" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:54:21.984952" elapsed="0.877437"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:54:21.984726" elapsed="0.877709"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:54:20.209549" elapsed="2.652917"/>
</for>
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:54:20.209157" elapsed="2.653364"/>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:54:17.546074" elapsed="5.316573"/>
</kw>
<kw name="Set DPN And Flow Count In Json Add" owner="BulkomaticKeywords">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:22.863518" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_add_bulk_flow_config.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_add_bulk_flow_config.json&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:22.863751" level="INFO">${body} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true",...</msg>
<var>${body}</var>
<arg>/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/openflowplugin/${json_config}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:22.863370" elapsed="0.000409"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.864216" level="INFO">${get_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.863959" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.864724" level="INFO">${put_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "${dpn_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.864414" elapsed="0.000336"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:54:22.865227" level="INFO">${str} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true",...</msg>
<var>${str}</var>
<arg>${body}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.864927" elapsed="0.000327"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.865711" level="INFO">${get_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "1000"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.865434" elapsed="0.000302"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.866197" level="INFO">${put_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.865907" elapsed="0.000315"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:54:22.866673" level="INFO">${json_body_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true",...</msg>
<var>${json_body_add}</var>
<arg>${str}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.866397" elapsed="0.000302"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.867125" level="INFO">${get_string} = "sal-bulk-flow:batch-size" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:batch-size" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.866876" elapsed="0.000274"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.867622" level="INFO">${put_string} = "sal-bulk-flow:batch-size" : "1000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:batch-size" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.867319" elapsed="0.000329"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:54:22.868083" level="INFO">${json_body_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "tru...</msg>
<var>${json_body_add}</var>
<arg>${json_body_add}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.867823" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.868549" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${json_body_add}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.868301" elapsed="0.000310"/>
</kw>
<return>
<value>${json_body_add}</value>
<status status="PASS" start="2026-04-10T00:54:22.868654" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:22.868811" level="INFO">${temp_json_config_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "tru...</msg>
<var>${temp_json_config_add}</var>
<arg>${orig_json_config_add}</arg>
<arg>${switch_count}</arg>
<arg>${flow_count_per_switch}</arg>
<doc>Set new DPN count and flows count per DPN in the Bulkomatic Add json file.</doc>
<status status="PASS" start="2026-04-10T00:54:22.862952" elapsed="0.005885"/>
</kw>
<kw name="Set DPN And Flow Count In Json Get" owner="BulkomaticKeywords">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:22.869717" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_get_bulk_flow_config.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_get_bulk_flow_config.json&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:22.869842" level="INFO">${body} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-t...</msg>
<var>${body}</var>
<arg>/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/openflowplugin/${json_config}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:22.869572" elapsed="0.000296"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.870310" level="INFO">${get_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.870050" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.870857" level="INFO">${put_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "${dpn_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.870548" elapsed="0.000335"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:54:22.871316" level="INFO">${str} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-t...</msg>
<var>${str}</var>
<arg>${body}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.871060" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.871791" level="INFO">${get_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "1000"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.871519" elapsed="0.000297"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.872274" level="INFO">${put_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.871987" elapsed="0.000312"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:54:22.872752" level="INFO">${json_body_get} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-t...</msg>
<var>${json_body_get}</var>
<arg>${str}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.872474" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.873193" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${json_body_get}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.872951" elapsed="0.000318"/>
</kw>
<return>
<value>${json_body_get}</value>
<status status="PASS" start="2026-04-10T00:54:22.873318" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:22.873477" level="INFO">${temp_json_config_get} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-t...</msg>
<var>${temp_json_config_get}</var>
<arg>${orig_json_config_get}</arg>
<arg>${switch_count}</arg>
<arg>${flow_count_after_add}</arg>
<doc>Set new DPN count and flows count per DPN in the Bulkomatic Get json file.</doc>
<status status="PASS" start="2026-04-10T00:54:22.869097" elapsed="0.004406"/>
</kw>
<kw name="Set DPN And Flow Count In Json Del" owner="BulkomaticKeywords">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:22.874382" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_del_bulk_flow_config.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_del_bulk_flow_config.json&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:22.874523" level="INFO">${body} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true"...</msg>
<var>${body}</var>
<arg>/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/openflowplugin/${json_config}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:22.874209" elapsed="0.000344"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.875009" level="INFO">${get_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.874748" elapsed="0.000287"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.875495" level="INFO">${put_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "${dpn_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.875208" elapsed="0.000313"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:54:22.875980" level="INFO">${str} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true"...</msg>
<var>${str}</var>
<arg>${body}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.875716" elapsed="0.000291"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.876437" level="INFO">${get_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "1000"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.876187" elapsed="0.000276"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.877111" level="INFO">${put_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.876653" elapsed="0.000486"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:54:22.877643" level="INFO">${json_body_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true"...</msg>
<var>${json_body_del}</var>
<arg>${str}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.877357" elapsed="0.000314"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.878105" level="INFO">${get_string} = "sal-bulk-flow:batch-size" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:batch-size" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.877850" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.878708" level="INFO">${put_string} = "sal-bulk-flow:batch-size" : "1000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:batch-size" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:22.878400" elapsed="0.000334"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:54:22.879216" level="INFO">${json_body_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "tr...</msg>
<var>${json_body_del}</var>
<arg>${json_body_del}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.878951" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.879795" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${json_body_del}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:22.879414" elapsed="0.000429"/>
</kw>
<return>
<value>${json_body_del}</value>
<status status="PASS" start="2026-04-10T00:54:22.879885" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:22.880044" level="INFO">${temp_json_config_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "tr...</msg>
<var>${temp_json_config_del}</var>
<arg>${orig_json_config_del}</arg>
<arg>${switch_count}</arg>
<arg>${flow_count_per_switch}</arg>
<doc>Set new DPN count and flows count per DPN in the Bulkomatic Del json file.</doc>
<status status="PASS" start="2026-04-10T00:54:22.873798" elapsed="0.006272"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.880827" level="INFO">${temp_json_config_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "tru...</msg>
<arg>${temp_json_config_add}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:54:22.880454" elapsed="0.000417"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.881399" level="INFO">${temp_json_config_get} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-t...</msg>
<arg>${temp_json_config_get}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:54:22.881054" elapsed="0.000397"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.881958" level="INFO">${temp_json_config_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "tr...</msg>
<arg>${temp_json_config_del}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:54:22.881650" elapsed="0.000350"/>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:54:17.128490" elapsed="5.753623"/>
</test>
<test id="s1-s3-t2" name="Get Inventory Follower Before Cluster Restart" line="49">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:54:22.886294" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:54:22.886030" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.887583" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:22.887454" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.887436" elapsed="0.000218"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.892638" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:22.892514" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.892496" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.893737" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:22.893310" elapsed="0.000454"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:22.894224" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:22.893924" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:22.894294" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:22.894446" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:22.892933" elapsed="0.001538"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.900022" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:22.899913" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.899894" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:22.901251" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:22.901145" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:22.901128" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:22.901825" level="INFO">${karaf_connection_index} = 232</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:22.901464" elapsed="0.000388"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:22.902278" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:22.902051" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:22.933778" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:22.902827" elapsed="0.031059"/>
</kw>
<msg time="2026-04-10T00:54:22.934052" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:22.934099" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:22.902466" elapsed="0.031670"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:23.001624" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:22.934774" elapsed="0.067161"/>
</kw>
<msg time="2026-04-10T00:54:23.002171" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:23.002222" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:22.934387" elapsed="0.067874"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.002783" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.002392" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.002353" elapsed="0.000525"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.003466" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.003029" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.003902" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.003673" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.003653" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:23.004023" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:23.005715" elapsed="0.000788"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.006821" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:23.007676" elapsed="0.000378"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:23.005017" elapsed="0.003145"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:23.004367" elapsed="0.003863"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:22.900845" elapsed="0.107490"/>
</kw>
<msg time="2026-04-10T00:54:23.008438" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:23.008485" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:22.900245" elapsed="0.108280"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:23.008755" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:54:23.008640" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.008614" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.009284" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.009676" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.009853" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:22.899567" elapsed="0.110409"/>
</kw>
<msg time="2026-04-10T00:54:23.010079" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:23.010125" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:22.894861" elapsed="0.115304"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.010516" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.010247" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.010228" elapsed="0.000390"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:22.894718" elapsed="0.115927"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.019754" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:23.019551" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.019516" elapsed="0.000336"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.021452" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:23.021321" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.021300" elapsed="0.000235"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:23.022089" level="INFO">${karaf_connection_index} = 234</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.021743" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:23.022527" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:23.022294" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:23.058336" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:23.023158" elapsed="0.035475"/>
</kw>
<msg time="2026-04-10T00:54:23.058883" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:23.058936" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:23.022752" elapsed="0.036223"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:23.135021" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:23.059778" elapsed="0.075524"/>
</kw>
<msg time="2026-04-10T00:54:23.135535" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:23.135611" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:23.059248" elapsed="0.076402"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.136123" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.135775" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.135737" elapsed="0.000475"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.136787" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.136364" elapsed="0.000518"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.137171" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.136950" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.136932" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:23.137288" elapsed="0.000083"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:23.138928" elapsed="0.000783"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.140065" elapsed="0.000459"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:23.140811" 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-04-10T00:54:23.138258" elapsed="0.003014"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:23.137682" elapsed="0.003654"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:23.020946" elapsed="0.120509"/>
</kw>
<msg time="2026-04-10T00:54:23.141555" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:23.141626" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:23.020126" elapsed="0.121538"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:23.141853" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:54:23.141744" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.141725" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.142350" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.142716" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.142789" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:23.018730" elapsed="0.124169"/>
</kw>
<msg time="2026-04-10T00:54:23.142998" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:23.143042" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:23.010961" elapsed="0.132118"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.143411" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.143155" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.143138" elapsed="0.000349"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:23.010803" elapsed="0.132707"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.149180" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:23.149074" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.149056" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.150518" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:23.150412" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.150394" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:23.151065" level="INFO">${karaf_connection_index} = 236</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.150762" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:23.151474" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:23.151253" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:23.189025" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:23.152022" elapsed="0.037114"/>
</kw>
<msg time="2026-04-10T00:54:23.189326" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:23.189372" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:23.151682" elapsed="0.037727"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:23.268738" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:23.189982" elapsed="0.079124"/>
</kw>
<msg time="2026-04-10T00:54:23.269342" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:23.269395" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:23.189622" elapsed="0.079812"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.269932" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.269586" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.269521" elapsed="0.000501"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.270594" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.270173" elapsed="0.000524"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.270999" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.270769" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.270750" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:23.271118" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:23.272801" elapsed="0.000805"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.273905" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:23.274697" elapsed="0.000361"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:23.272122" elapsed="0.003044"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:23.271513" elapsed="0.003721"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:23.150111" elapsed="0.125262"/>
</kw>
<msg time="2026-04-10T00:54:23.275479" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:23.275525" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:23.149401" elapsed="0.126183"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:23.275810" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:54:23.275684" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.275658" 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-04-10T00:54:23.276362" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.276736" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.276811" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:23.148727" elapsed="0.128202"/>
</kw>
<msg time="2026-04-10T00:54:23.277031" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:23.277078" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:23.143809" elapsed="0.133307"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.277468" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.277196" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.277178" elapsed="0.000374"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:23.143664" elapsed="0.133928"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:22.894526" elapsed="0.383102"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:54:22.892152" elapsed="0.385534"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:54:22.887166" elapsed="0.390665"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:22.886730" elapsed="0.391148"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:54:22.883478" elapsed="0.394454"/>
</kw>
<kw name="Get InventoryConfig Shard Status" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.285977" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:23.285546" elapsed="0.000481"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.286515" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:23.286196" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:23.286739" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:54:23.286928" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:23.285166" elapsed="0.001788"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:54:23.287115" elapsed="0.000174"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.287903" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:23.287515" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.288330" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:23.288090" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.288762" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:23.288503" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.291246" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.290946" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:23.291318" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:23.291470" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:23.290595" elapsed="0.000915"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.365707" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.365294" elapsed="0.000442"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:23.366535" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:23.366244" elapsed="0.000391">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:23.366730" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:23.365904" elapsed="0.000851"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.367303" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:23.366922" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:23.367675" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:23.367837" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:23.367492" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.368275" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.368027" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.369392" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.369133" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.369897" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.369625" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.370243" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.370449" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.370647" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:23.370108" elapsed="0.000599"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.369971" elapsed="0.000768"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:23.370783" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:23.370944" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:23.368807" elapsed="0.002162"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.368444" elapsed="0.002558"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.371175" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.371027" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.368423" elapsed="0.002829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.371859" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.371398" elapsed="0.000489"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:23.371937" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:23.364619" elapsed="0.007490"/>
</kw>
<msg time="2026-04-10T00:54:23.372181" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:23.350908" elapsed="0.021415"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.386226" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.400105" elapsed="0.000071"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.414759" elapsed="0.000125"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.415314" elapsed="0.000079"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.415673" elapsed="0.000078"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.416622" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.416360" elapsed="0.000410"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:23.416327" elapsed="0.000488"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.417086" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.417474" elapsed="0.000037"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.417805" elapsed="0.000037"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:23.416248" elapsed="0.001642"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.415911" elapsed="0.002052"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.418284" elapsed="0.000077"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.418535" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:54:23.418800" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:23.340626" elapsed="0.078203"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:23.421053" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:23.420680" elapsed="0.000453">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:23.421297" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:23.419811" elapsed="0.001558"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.422886" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.421532" elapsed="0.001449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.423910" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.423351" elapsed="0.000607"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.423023" elapsed="0.000987"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.421508" elapsed="0.002539"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.427472" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:23.424258" elapsed="0.003270"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:23.427706" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:54:23.427987" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:23.419281" elapsed="0.008733"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:23.430492" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:23.430113" elapsed="0.000481">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:23.430757" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:23.429034" elapsed="0.001763"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:23.431284" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-04-10T00:54:23.430959" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.430934" elapsed="0.000541"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.431704" elapsed="0.000077"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.432032" elapsed="0.000075"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.432234" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:54:23.447217" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:23.428476" elapsed="0.018789"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.450397" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.449677" elapsed="0.000866"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.451681" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.451066" elapsed="0.000749"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:23.464989" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:23.465442" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:23.465841" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:23.455749" elapsed="0.010142"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.451956" elapsed="0.014060"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.467385" elapsed="0.000083"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.466070" elapsed="0.001561"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.451930" elapsed="0.015781"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.477033" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.473229" elapsed="0.004193"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.472532" elapsed="0.004956"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.472460" elapsed="0.005078"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.480350" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.477954" elapsed="0.002442"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.477657" elapsed="0.002800"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.477625" elapsed="0.002882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.481427" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.480885" elapsed="0.000590"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.481914" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.481604" elapsed="0.000390"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.482632" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.482292" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.482042" elapsed="0.000679"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.481570" elapsed="0.001197"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.483659" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.483108" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.484118" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.483816" elapsed="0.000383"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.484785" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.484459" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.484246" elapsed="0.000625"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.483785" elapsed="0.001132"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:23.485253" elapsed="0.000460"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:23.486522" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.486061" elapsed="0.000524"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.486925" elapsed="0.002472"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:23.469644" elapsed="0.019837"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.489879" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:23.489670" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.489649" elapsed="0.000400"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:23.500980" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:23.490250" elapsed="0.010776"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:23.501163" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:54:23.501411" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:23.447906" elapsed="0.053532"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:23.501504" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:23.501678" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:23.300002" elapsed="0.201702"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.502034" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.501789" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.501772" elapsed="0.000399"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:23.502205" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:23.295773" elapsed="0.206560"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.291602" elapsed="0.210774"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.291580" elapsed="0.210821"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:54:23.503045" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:54:23.502938" elapsed="0.000167"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.503165" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:23.503127" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.502921" elapsed="0.000304"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.503372" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:54:23.503490" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:23.502669" elapsed="0.000846"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.504279" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.503714" elapsed="0.000592"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.505012" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.504464" elapsed="0.000575"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.510752" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.510443" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.511220" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.510956" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:23.520114" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:23.520220" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:23 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:23 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":60004,"SnapshotIndex":160052,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":160052,"Leader":"member-1-shard-inventory-config","LastIndex":160053,"RaftState":"Leader","LastApplied":160053,"LastCommittedTransactionTime":"2026-04-10 00:53:51.978","LastLogIndex":160053,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.374","active":true,"matchIndex":160053,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":160054},{"timeSinceLastActivity":"00:00:00.374","active":true,"matchIndex":160053,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":160054}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"437.9 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":4,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":160053,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":4,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":2128},"timestamp":1775782463,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:23.520375" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:23.513361" elapsed="0.007041"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.511332" elapsed="0.009113"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.520694" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.520471" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.511314" elapsed="0.009500"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.525657" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":60004,"SnapshotIndex":160052,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":160052,"Leader":"member-1-shard-inventory-config","LastIndex":160053,"RaftState":"Leader","LastApplied":160053,"LastCommittedTransactionTime":"2026-04-10 00:53:51.978","LastLogIndex":160053,"LastLeadershipChangeTime":"2026-04-10 00:50:15.799","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.374","active":true,"matchIndex":160053,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":160054},{"timeSinceLastActivity":"00:00:00.374","active":true,"matchIndex":160053,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":160054}],"FailedReadTransactionsCount":0,"StatRetrievalTime":"437.9 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":4,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":160053,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":4,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":2128},"timestamp":1775782463,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.522144" elapsed="0.003734"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.521840" elapsed="0.004174"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.521822" elapsed="0.004233"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.530701" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.526614" elapsed="0.004327"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.526142" elapsed="0.004931"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.526116" elapsed="0.004997"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.532107" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.531361" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.532862" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.532238" elapsed="0.000801"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.534304" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.533547" elapsed="0.000801"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.533066" elapsed="0.001382"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.532218" elapsed="0.002255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.535272" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.534701" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.536024" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.535403" elapsed="0.000798"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.537452" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.536725" elapsed="0.000768"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.536227" elapsed="0.001395"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.535383" elapsed="0.002264"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:23.537804" elapsed="0.000710"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:23.539376" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.538829" elapsed="0.000573"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.539616" elapsed="0.002597"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:23.521367" elapsed="0.020936"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.542482" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:23.542375" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.542356" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:23.558512" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:23.542843" elapsed="0.015699"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:23.558887" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:54:23.559055" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:23.505958" elapsed="0.053125"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:23.559141" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:23.559315" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:23.505257" elapsed="0.054086"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.560411" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782463, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.559952" elapsed="0.000488"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:23.560489" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:23.560689" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782463, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:23.559602" elapsed="0.001115"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:23.561087" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 160053, 'CommittedTransactionsCount': 4, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.560877" elapsed="0.000238"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:23.561476" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.561274" elapsed="0.000228"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:23.561552" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:54:23.561735" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:23.289971" elapsed="0.271789"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:23.561819" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:23.561969" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:23.289234" elapsed="0.272760"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.562295" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.562075" elapsed="0.000278"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.562629" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.562376" elapsed="0.000484"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.563033" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.562885" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.562058" elapsed="0.001052"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:23.289061" elapsed="0.274073"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.565789" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.565450" elapsed="0.000367"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:23.565863" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:23.566012" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:23.565103" elapsed="0.000934"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.645382" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.644918" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:23.646343" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:23.646077" elapsed="0.000342">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:23.646518" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:23.645715" elapsed="0.000834"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.647132" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:23.646736" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:23.647472" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:23.647650" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:23.647326" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.648093" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.647841" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.649262" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.649006" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.649775" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.649471" 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-04-10T00:54:23.650141" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.650345" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.650525" elapsed="0.000071"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:23.650001" elapsed="0.000633"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.649856" elapsed="0.000811"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:23.650715" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:54:23.650888" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:23.648650" elapsed="0.002262"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.648222" elapsed="0.002723"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.651119" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.650969" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.648198" elapsed="0.002997"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.651806" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.651341" elapsed="0.000493"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:23.651882" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:23.643942" elapsed="0.008134"/>
</kw>
<msg time="2026-04-10T00:54:23.652152" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:23.629966" elapsed="0.022334"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.666247" elapsed="0.000053"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.680092" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.693931" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.694293" elapsed="0.000079"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.694667" elapsed="0.000077"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.695463" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.695236" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:23.695208" elapsed="0.000376"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.695848" elapsed="0.000035"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.696153" 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-04-10T00:54:23.696445" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:23.695143" elapsed="0.001384"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.694885" elapsed="0.001732"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.696929" elapsed="0.000074"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.697188" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:54:23.697371" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:23.618375" elapsed="0.079022"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:23.699391" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:23.699069" elapsed="0.000397">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:23.699632" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:23.698258" elapsed="0.001415"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.701040" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.699819" elapsed="0.001307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.702022" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.701504" elapsed="0.000565"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.701164" elapsed="0.000955"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.699800" elapsed="0.002354"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.705139" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:23.702357" elapsed="0.002824"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:23.705332" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:54:23.705575" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:23.697798" elapsed="0.007804"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:23.707780" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:23.707444" elapsed="0.000402">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:23.707996" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:23.706469" elapsed="0.001566"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:23.708473" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:54:23.708182" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.708163" elapsed="0.000524"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.708942" elapsed="0.000079"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.709271" elapsed="0.000109"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.709503" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:54:23.723724" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:23.706004" elapsed="0.017748"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.726548" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.725957" elapsed="0.000737"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.727511" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.726933" elapsed="0.000732"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:23.749971" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:23.750914" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:23.751675" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:23.731151" elapsed="0.020628"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.727838" elapsed="0.024068"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.754242" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.751993" elapsed="0.002456"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.727813" elapsed="0.026712"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.762179" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.759370" elapsed="0.003142"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.759080" elapsed="0.003509"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.759046" elapsed="0.003593"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.765454" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.763030" elapsed="0.002471"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.762737" elapsed="0.002840"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.762707" elapsed="0.002920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.766533" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.765976" elapsed="0.000622"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.767015" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.766710" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.767683" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.767356" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.767143" elapsed="0.000627"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.766679" elapsed="0.001137"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.768673" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.768152" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.769132" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.768830" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.769813" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.769471" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.769259" elapsed="0.000640"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.768799" elapsed="0.001145"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:23.770302" elapsed="0.000461"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:23.771532" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.771106" elapsed="0.000491"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.771934" elapsed="0.002840"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:23.756430" elapsed="0.018435"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.775259" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:23.775047" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.775022" elapsed="0.000406"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:23.786542" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:23.775664" elapsed="0.011036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:23.786868" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T00:54:23.787160" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:23.724113" elapsed="0.063076"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:23.787259" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:23.787416" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:23.574787" elapsed="0.212655"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.787905" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.787548" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.787523" elapsed="0.000563"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:23.788119" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:23.570432" elapsed="0.217817"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.566106" elapsed="0.222188"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.566088" elapsed="0.222231"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:54:23.788993" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:54:23.788881" elapsed="0.000174"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.789118" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:23.789080" elapsed="0.000078"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.788864" elapsed="0.000317"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.789356" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:54:23.789477" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:23.788576" elapsed="0.000927"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.790137" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.789711" elapsed="0.000453"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.790919" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.790362" elapsed="0.000590"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.796871" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.796550" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.797350" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.797085" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:23.807542" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:23.807759" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:23 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:23 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":160052,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":160052,"Leader":"member-1-shard-inventory-config","LastIndex":160053,"RaftState":"Follower","LastApplied":160053,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":160053,"LastLeadershipChangeTime":"2026-04-10 00:51:04.372","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"324.4 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":160053,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":45030},"timestamp":1775782463,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:23.808027" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:23.799598" elapsed="0.008471"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.797469" elapsed="0.010682"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.808496" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.808202" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.797448" elapsed="0.011209"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.816824" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":160052,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":160052,"Leader":"member-1-shard-inventory-config","LastIndex":160053,"RaftState":"Follower","LastApplied":160053,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":160053,"LastLeadershipChangeTime":"2026-04-10 00:51:04.372","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"324.4 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":160053,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":45030},"timestamp":1775782463,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.810841" elapsed="0.006242"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.810216" elapsed="0.006974"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.810188" elapsed="0.007035"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.820681" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.817676" elapsed="0.003145"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.817300" elapsed="0.003616"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.817278" elapsed="0.003667"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.821786" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.821161" elapsed="0.000653"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.822601" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.821926" elapsed="0.000859"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.824132" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.823354" elapsed="0.000824"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.822812" elapsed="0.001467"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.821905" elapsed="0.002399"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.825073" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.824474" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.825845" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.825207" elapsed="0.000867"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.827436" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.826678" elapsed="0.000801"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.826103" elapsed="0.001501"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.825187" elapsed="0.002442"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:23.827803" elapsed="0.000750"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:23.829334" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.828788" elapsed="0.000573"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.829577" elapsed="0.003008"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:23.809467" elapsed="0.023219"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.832877" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:23.832763" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.832743" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:23.849506" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:23.833098" elapsed="0.016438"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:23.849607" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:54:23.849778" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:23.791909" elapsed="0.057896"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:23.849925" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:23.850080" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:23.791171" elapsed="0.058936"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.851253" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782463, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.850772" elapsed="0.000510"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:23.851352" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:23.851543" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782463, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:23.850369" elapsed="0.001223"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:23.851980" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 160053, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerIni...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.851766" elapsed="0.000241"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:23.852374" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.852165" elapsed="0.000241"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:23.852462" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:23.852851" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:23.564474" elapsed="0.288409"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:23.852947" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:23.853101" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:23.563502" elapsed="0.289624"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.853429" elapsed="0.000210"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.853208" elapsed="0.000470"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.853849" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.853702" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.854071" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.853928" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.853191" elapsed="0.000955"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:23.563331" elapsed="0.290839"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.856817" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.856377" elapsed="0.000468"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:23.856890" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:23.857038" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:23.856027" elapsed="0.001036"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.932505" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.932095" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:23.933345" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:23.933069" elapsed="0.000353">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:23.933585" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:23.932724" elapsed="0.000889"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.934177" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:23.933784" elapsed="0.000420"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:54:23.934511" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:54:23.934673" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:54:23.934370" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.935111" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.934862" 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-04-10T00:54:23.936134" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:23.935875" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.936682" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:54:23.936342" elapsed="0.000367"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.937040" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.937248" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.937424" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:54:23.936901" elapsed="0.000582"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.936761" elapsed="0.000752"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:54:23.937575" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:54:23.937742" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:54:23.935530" elapsed="0.002237"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.935229" elapsed="0.002571"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.937973" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.937824" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.935209" elapsed="0.002843"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.938654" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:23.938197" elapsed="0.000485"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:54:23.938731" elapsed="0.000030"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:54:23.931400" elapsed="0.007499"/>
</kw>
<msg time="2026-04-10T00:54:23.938971" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:23.917527" elapsed="0.021586"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.952911" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.967022" elapsed="0.000088"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.981055" elapsed="0.000112"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.981586" elapsed="0.000081"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.981919" elapsed="0.000076"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.982823" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.982581" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:23.982531" elapsed="0.000403"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.983205" elapsed="0.000035"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.983515" elapsed="0.000039"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.983831" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:54:23.982455" elapsed="0.001458"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.982153" elapsed="0.001836"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.984308" elapsed="0.000075"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.984584" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:54:23.984818" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:54:23.907022" elapsed="0.077825"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:23.987148" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:23.986755" elapsed="0.000473">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:23.987385" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:23.985872" elapsed="0.001554"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.988960" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:23.987611" elapsed="0.001439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.990008" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:23.989449" elapsed="0.000605"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.989092" elapsed="0.001014"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.987586" elapsed="0.002557"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:23.993623" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:23.990359" elapsed="0.003317"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:54:23.993837" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:54:23.994113" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:23.985341" elapsed="0.008798"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:54:23.996400" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:54:23.995996" elapsed="0.000483">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:54:23.996921" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:54:23.995133" elapsed="0.001827"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:54:23.997483" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-10T00:54:23.997124" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.997099" elapsed="0.000595"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.997910" elapsed="0.000079"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:23.998242" elapsed="0.000075"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:23.998442" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:54:24.013382" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:54:23.994610" elapsed="0.018816"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.016358" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:24.015706" elapsed="0.000792"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.017353" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:24.016761" elapsed="0.000726"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:24.037523" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:24.038002" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:54:24.038336" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:24.021258" elapsed="0.017126"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:24.017641" elapsed="0.020801"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.039495" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.038485" elapsed="0.001123"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.017617" elapsed="0.022028"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.044732" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","encrypted-passwords","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-password","client-ident-publickey"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","candidate","confirmed-commit","startup","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:24.041986" elapsed="0.003109"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:24.041694" elapsed="0.003464"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.041660" elapsed="0.003548"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.048065" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:24.045620" elapsed="0.002493"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:24.045307" elapsed="0.002865"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.045276" elapsed="0.002946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.049125" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:24.048594" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.049608" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.049283" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.050309" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:24.049953" elapsed="0.000384"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:24.049737" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.049252" elapsed="0.001191"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.051301" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:24.050795" elapsed="0.000553"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.051841" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.051458" elapsed="0.000463"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.052487" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:24.052182" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:24.051969" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.051427" elapsed="0.001209"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:24.052967" elapsed="0.000441"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:24.054219" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:24.053770" elapsed="0.000496"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:24.054618" elapsed="0.002582"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:24.040464" elapsed="0.016817"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:24.057735" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:24.057447" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.057427" elapsed="0.000470"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:24.068612" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:24.058316" elapsed="0.010343"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:24.068795" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:54:24.069040" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:24.013986" elapsed="0.055082"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:24.069132" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:24.069288" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:54:23.865639" elapsed="0.203676"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.069705" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.069399" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.069382" elapsed="0.000489"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:24.069906" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:54:23.861368" elapsed="0.208667"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:23.857132" elapsed="0.212947"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:23.857114" elapsed="0.212990"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:54:24.070762" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:54:24.070654" elapsed="0.000170"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:54:24.070886" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:24.070848" elapsed="0.000078"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.070636" elapsed="0.000315"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.071103" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:54:24.071224" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:54:24.070337" elapsed="0.000913"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.071817" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:24.071421" elapsed="0.000423"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.072467" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:24.072004" elapsed="0.000491"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.078146" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:24.077874" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.078648" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:24.078349" elapsed="0.000343"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:24.087956" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:24.088063" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:24 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:24 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":160052,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":160052,"Leader":"member-1-shard-inventory-config","LastIndex":160053,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":160053,"LastLogIndex":160053,"LastLeadershipChangeTime":"2026-04-10 00:53:13.793","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"221.4 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":160053,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":19038},"timestamp":1775782464,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:24.088216" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:24.080794" elapsed="0.007448"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:24.078760" elapsed="0.009526"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.088469" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.088313" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.078742" elapsed="0.009831"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.093736" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":160052,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":160052,"Leader":"member-1-shard-inventory-config","LastIndex":160053,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":160053,"LastLogIndex":160053,"LastLeadershipChangeTime":"2026-04-10 00:53:13.793","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"221.4 μs","Voting":true,"CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":160053,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":19038},"timestamp":1775782464,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:24.089856" elapsed="0.004158"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:24.089540" elapsed="0.004611"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.089522" elapsed="0.004670"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.098993" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:24.094774" elapsed="0.004548"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:24.094278" elapsed="0.005176"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.094253" elapsed="0.005241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.100369" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:24.099769" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.101163" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.100498" elapsed="0.000839"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.102623" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:24.101868" elapsed="0.000798"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:24.101364" elapsed="0.001402"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.100479" elapsed="0.002311"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.103536" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:24.102986" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.104290" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.103684" elapsed="0.000785"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.105795" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:24.105005" elapsed="0.000832"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:24.104496" elapsed="0.001442"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.103665" elapsed="0.002298"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:24.106120" elapsed="0.000873"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:24.107766" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:24.107220" elapsed="0.000573"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:24.107990" elapsed="0.002794"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:24.089085" elapsed="0.021791"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:24.111079" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:24.110970" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.110951" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:24.127169" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:24.111291" elapsed="0.015922"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:24.127291" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:54:24.127493" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:24.073423" elapsed="0.054097"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:24.127696" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:24.127857" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:54:24.072730" elapsed="0.055155"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.129153" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782464, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:24.128628" elapsed="0.000554"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:24.129232" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:24.129612" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782464, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:24.128181" elapsed="0.001462"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:24.130018" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 160053, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerIni...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:24.129809" elapsed="0.000237"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:24.130407" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:24.130205" elapsed="0.000228"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:54:24.130480" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:24.130705" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:23.855310" elapsed="0.275421"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:54:24.130791" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:24.130943" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:54:23.854523" elapsed="0.276445"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:24.131515" elapsed="0.000467"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:24.131060" elapsed="0.000961"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.132194" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.132046" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.132419" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.132272" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.131040" elapsed="0.001452"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:23.854341" elapsed="0.278175"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:23.288845" elapsed="0.843709"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:54:24.132615" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:24.132823" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:54:24.132870" level="INFO">${follower_list} = [2, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:54:23.284426" elapsed="0.848468"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.133382" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:54:24.133460" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:24.133075" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.134415" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.133995" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.133974" elapsed="0.000520"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.137183" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:54:24.134650" elapsed="0.002593"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:54:24.137811" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:24.137526" elapsed="0.000311"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:54:24.137890" elapsed="0.000038"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:54:23.281678" elapsed="0.856397"/>
</kw>
<msg time="2026-04-10T00:54:24.138186" level="INFO">${inv_conf_leader} = 1</msg>
<msg time="2026-04-10T00:54:24.138236" level="INFO">${inv_conf_followers_list} = [2, 3]</msg>
<var>${inv_conf_leader}</var>
<var>${inv_conf_followers_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Get_Leader_And_Followers_For_Shard</arg>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:54:23.280865" elapsed="0.857394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.138832" level="INFO">config inventory Leader is 1 and followers are [2, 3]</msg>
<arg>config inventory Leader is ${inv_conf_leader} and followers are ${inv_conf_followers_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:24.138485" elapsed="0.000392"/>
</kw>
<return>
<value>${inv_conf_leader}</value>
<value>${inv_conf_followers_list}</value>
<status status="PASS" start="2026-04-10T00:54:24.138921" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:24.139128" level="INFO">${inventory_leader} = 1</msg>
<msg time="2026-04-10T00:54:24.139176" level="INFO">${inventory_followers} = [2, 3]</msg>
<var>${inventory_leader}</var>
<var>${inventory_followers}</var>
<doc>Check Status for Inventory Config shard in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:54:23.278172" elapsed="0.861028"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:54:24.139640" level="INFO">${Follower_Node_1} = 2</msg>
<var>${Follower_Node_1}</var>
<arg>${Inventory_Followers}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:24.139407" elapsed="0.000260"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.140182" level="INFO">${Follower_Node_1} = 2</msg>
<arg>${Follower_Node_1}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:54:24.139861" elapsed="0.000362"/>
</kw>
<doc>Find a follower in the inventory config shard</doc>
<status status="PASS" start="2026-04-10T00:54:22.882877" elapsed="1.257458"/>
</test>
<test id="s1-s3-t3" name="Start Mininet Connect To Follower Node1" line="55">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:54:24.144724" elapsed="0.000250"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:54:24.144418" 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-04-10T00:54:24.146132" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:24.145993" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.145969" elapsed="0.000239"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:24.151603" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:24.151388" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.151363" elapsed="0.000330"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.152863" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:24.152393" elapsed="0.000499"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.153370" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:24.153059" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:24.153442" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:54:24.153636" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:24.151990" elapsed="0.001673"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:24.159676" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:24.159475" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.159449" elapsed="0.000319"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:24.161111" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:24.161004" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.160986" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:24.161661" level="INFO">${karaf_connection_index} = 232</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:24.161326" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:24.162080" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:24.161855" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:24.195592" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:24.162621" elapsed="0.033072"/>
</kw>
<msg time="2026-04-10T00:54:24.195875" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:24.195921" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:24.162265" elapsed="0.033694"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:24.264944" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:24.196498" elapsed="0.068577"/>
</kw>
<msg time="2026-04-10T00:54:24.265236" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:24.265282" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:24.196152" elapsed="0.069194"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.265682" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.265426" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.265406" elapsed="0.000356"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.266206" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:24.265906" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.266599" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.266363" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.266345" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:24.266709" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:24.268165" elapsed="0.000801"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:24.269247" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:24.269997" elapsed="0.000386"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:24.267537" elapsed="0.002948"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:24.267003" elapsed="0.003569"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:24.160701" elapsed="0.109972"/>
</kw>
<msg time="2026-04-10T00:54:24.270765" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:24.270809" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:24.159969" elapsed="0.110877"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:24.271033" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:54:24.270922" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.270904" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.271519" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.271872" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:24.271949" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:24.159006" elapsed="0.113053"/>
</kw>
<msg time="2026-04-10T00:54:24.272154" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:24.272265" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:24.154056" elapsed="0.118250"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.272654" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.272384" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.272367" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:24.153908" elapsed="0.118848"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:24.278286" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:24.278179" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.278160" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:24.279614" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:24.279482" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.279465" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:24.280128" level="INFO">${karaf_connection_index} = 234</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:24.279829" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:24.280528" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:24.280313" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:24.313735" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:24.281115" elapsed="0.032836"/>
</kw>
<msg time="2026-04-10T00:54:24.314200" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:24.314250" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:24.280737" elapsed="0.033551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:24.408662" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:24.315026" elapsed="0.093900"/>
</kw>
<msg time="2026-04-10T00:54:24.409151" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:24.409199" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:24.314576" elapsed="0.094661"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.409749" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.409355" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.409322" elapsed="0.000512"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.410364" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:24.409982" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.410804" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.410526" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.410508" elapsed="0.000375"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:24.410920" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:24.412470" 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-04-10T00:54:24.413539" elapsed="0.000484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:24.414291" elapsed="0.000584"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:24.411826" elapsed="0.003224"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:24.411236" elapsed="0.003881"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:24.279187" elapsed="0.136031"/>
</kw>
<msg time="2026-04-10T00:54:24.415314" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:24.415360" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:24.278507" elapsed="0.136893"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:24.415623" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:54:24.415480" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.415461" elapsed="0.000249"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.416118" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.416461" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:24.416533" elapsed="0.000035"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:24.277843" elapsed="0.138824"/>
</kw>
<msg time="2026-04-10T00:54:24.416764" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:24.416810" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:24.273069" elapsed="0.143780"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.417180" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.416927" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.416910" elapsed="0.000346"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:24.272889" elapsed="0.144391"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:24.422906" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:24.422796" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.422752" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:24.424216" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:24.424110" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.424092" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:24.424746" level="INFO">${karaf_connection_index} = 236</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:24.424430" elapsed="0.000343"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:24.425150" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:24.424933" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:24.459781" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:24.425694" elapsed="0.034314"/>
</kw>
<msg time="2026-04-10T00:54:24.460234" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:24.460282" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:24.425337" elapsed="0.034982"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:24.537099" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:24.461028" elapsed="0.076321"/>
</kw>
<msg time="2026-04-10T00:54:24.537602" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:24.537653" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:24.460595" elapsed="0.077176"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.538204" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.537889" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.537858" elapsed="0.000432"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.538837" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:24.538437" elapsed="0.000493"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.539223" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.539003" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.538985" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:24.539339" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:24.540936" elapsed="0.000792"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:24.542017" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:24.542772" 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-04-10T00:54:24.540271" elapsed="0.002961"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:24.539671" elapsed="0.003625"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:24.423808" elapsed="0.119588"/>
</kw>
<msg time="2026-04-10T00:54:24.543493" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:24.543539" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:24.423132" elapsed="0.120464"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:24.543784" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:54:24.543677" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.543658" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.544287" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.544649" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:24.544722" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:24.422411" elapsed="0.122422"/>
</kw>
<msg time="2026-04-10T00:54:24.544931" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:24.544978" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:24.417571" elapsed="0.127446"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.545350" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.545098" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.545081" elapsed="0.000347"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:24.417411" elapsed="0.128041"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:24.153724" elapsed="0.391761"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:54:24.150873" elapsed="0.394674"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:54:24.145679" elapsed="0.399943"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:24.145197" elapsed="0.400472"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:54:24.141963" elapsed="0.403798"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.548946" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:24.548723" elapsed="0.000271"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:24.551533" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:24.551267" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:24.551249" elapsed="0.000383"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:24.551918" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:24.551783" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.552619" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:24.552200" elapsed="0.000467"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:24.553193" level="INFO">${conn_id} = 250</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:24.552828" elapsed="0.000393"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:24.554128" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:54:24.554205" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:24.553853" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:24.554389" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:54:24.555766" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:54:24.993256" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:53:49 UTC 2026

  System load:  0.02               Processes:             108
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:53:51 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:54:24.555435" elapsed="0.437996"/>
</kw>
<msg time="2026-04-10T00:54:24.993519" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:24.554896" elapsed="0.438732"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:54:24.553439" elapsed="0.440313"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:54:24.994548" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:54:26.181358" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:54:26.181640" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:54:26.181701" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:54:24.994041" elapsed="1.187700"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:26.182053" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:26.183109" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:26.182678" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:26.183582" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:26.183378" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:26.183345" elapsed="0.000334"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:54:26.183881" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T00:54:26.183747" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:26.183727" elapsed="0.000268"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:26.184040" elapsed="0.000019"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:26.187854" 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-04-10T00:54:26.188574" elapsed="0.000222"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:26.188997" elapsed="0.000133"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:26.184469" elapsed="0.004730"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:54:24.550738" elapsed="1.638580"/>
</kw>
<msg time="2026-04-10T00:54:26.189393" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:24.550072" elapsed="1.639398"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:54:24.549575" elapsed="1.640019"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:26.192412" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:26.192028" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:26.192001" elapsed="0.000528"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:26.192914" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:26.192735" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:26.193763" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:26.193261" elapsed="0.000562"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:26.194483" level="INFO">${conn_id} = 252</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:26.194028" elapsed="0.000487"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:26.195717" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:54:26.195813" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:26.195343" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:26.196053" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:54:26.197591" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:54:26.509378" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:53:49 UTC 2026

  System load:  0.02               Processes:             108
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:54:24 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:54:26.197172" elapsed="0.312362"/>
</kw>
<msg time="2026-04-10T00:54:26.509729" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:26.196707" elapsed="0.313104"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:54:26.194818" elapsed="0.315125"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:54:26.510421" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:54:26.532493" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:54:26.532780" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:54:26.532880" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:54:26.510184" elapsed="0.022747"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:26.533306" elapsed="0.000487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:26.535422" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:26.534509" elapsed="0.001032"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:26.536126" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:26.535807" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:26.535740" elapsed="0.000553"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:54:26.536711" elapsed="0.000074"/>
</return>
<status status="PASS" start="2026-04-10T00:54:26.536433" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:26.536379" elapsed="0.000546"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:26.537006" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:26.542173" elapsed="0.000612"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:26.543055" elapsed="0.000261"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:26.543568" elapsed="0.000158"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:26.537826" elapsed="0.005982"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:54:26.191334" elapsed="0.352619"/>
</kw>
<msg time="2026-04-10T00:54:26.544042" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:26.190504" elapsed="0.353629"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:54:26.189858" elapsed="0.354395"/>
</kw>
<arg>${mininet}</arg>
<status status="PASS" start="2026-04-10T00:54:24.549198" elapsed="1.995141"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:26.550748" level="INFO">${tools_connection} = 254</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:26.550260" elapsed="0.000521"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:26.552759" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:54:26.552852" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:26.552439" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:26.553051" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:54:26.554304" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:54:26.916777" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:53:49 UTC 2026

  System load:  0.02               Processes:             108
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:54:26 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:54:26.553963" elapsed="0.362996"/>
</kw>
<msg time="2026-04-10T00:54:26.917147" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:26.553591" elapsed="0.363644"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:54:26.551893" elapsed="0.365466"/>
</kw>
<msg time="2026-04-10T00:54:26.917414" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:26.551418" elapsed="0.366043"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:54:26.551022" elapsed="0.366526"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-10T00:54:26.917622" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:54:26.917870" level="INFO">${mininet_conn_id} = 254</msg>
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-10T00:54:26.549535" elapsed="0.368362"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:26.918832" level="INFO">${mininet_conn_id} = 254</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:54:26.918381" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:26.921222" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:26.918961" elapsed="0.002320"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:26.918939" elapsed="0.002369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:26.921814" level="INFO">Start mininet --topo tree,1 to 10.30.170.169</msg>
<arg>Start mininet ${options} to ${controller}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:26.921472" elapsed="0.000437"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:26.924910" level="INFO">sudo mn --controller 'remote,ip=10.30.170.169,port=6633' --topo tree,1 --switch ovsk,protocols=OpenFlow13</msg>
<arg>sudo mn --controller 'remote,ip=${controller},port=${ofport}' ${options} --switch ovsk,protocols=OpenFlow${ofversion}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:26.922083" elapsed="0.002890"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:54:27.075751" level="INFO">[?2004l*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2 
*** Adding switches:
s1 
*** Adding links:
(s1, h1) (s1, h2) 
*** Configuring hosts
h1 h2 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:54:26.925148" elapsed="0.150774"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.076673" level="INFO">Check OVS configuratiom</msg>
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:27.076270" elapsed="0.000452"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:27.078350" level="INFO">sh ovs-vsctl show</msg>
<arg>sh ovs-vsctl show</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:27.076902" elapsed="0.001505"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:54:27.090783" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Bridge s1
        Controller "tcp:10.30.170.169:6633"
        Controller "ptcp:6654"
        fail_mode: secure
        Port s1
            Interface s1
                type: internal
        Port s1-eth2
            Interface s1-eth2
        Port s1-eth1
            Interface s1-eth1
    ovs_version: "2.17.11"
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:54:27.078591" elapsed="0.012350"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="PASS" start="2026-04-10T00:54:27.091034" elapsed="0.000067"/>
</return>
<msg time="2026-04-10T00:54:27.091320" level="INFO">${mininet_conn_id} = 254</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${Follower_Node_1}_IP}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="PASS" start="2026-04-10T00:54:24.546072" elapsed="2.545277"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.092178" level="INFO">${mininet_conn_id} = 254</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:54:27.091707" elapsed="0.000518"/>
</kw>
<doc>Start mininet with connection to Follower Node1.</doc>
<status status="PASS" start="2026-04-10T00:54:24.140972" elapsed="2.951372"/>
</test>
<test id="s1-s3-t4" name="Add Bulk Flow From Follower" line="62">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:54:27.096598" elapsed="0.000244"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:54:27.096301" elapsed="0.000598"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:27.097994" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:27.097854" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.097829" elapsed="0.000239"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:27.103085" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:27.102977" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.102958" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.104206" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:27.103813" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.104812" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:27.104477" elapsed="0.000363"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:27.104886" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:54:27.105051" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:27.103387" elapsed="0.001689"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:27.110889" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:27.110779" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.110760" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:27.112181" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:27.112072" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.112054" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:27.112731" level="INFO">${karaf_connection_index} = 232</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:27.112399" elapsed="0.000359"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:27.113160" level="INFO">${current_connection_index} = 254</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:27.112920" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:27.146250" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:27.113707" elapsed="0.032874"/>
</kw>
<msg time="2026-04-10T00:54:27.146875" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:27.146937" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:27.113348" elapsed="0.033639"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:27.213977" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:27.147935" elapsed="0.066327"/>
</kw>
<msg time="2026-04-10T00:54:27.214503" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:27.214586" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:27.147324" elapsed="0.067303"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.215107" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:27.214756" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.214719" elapsed="0.000478"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.215753" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:27.215347" elapsed="0.000506"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.216148" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:27.215924" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.215904" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:27.216265" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:27.219155" elapsed="0.000178"/>
</kw>
<msg time="2026-04-10T00:54:27.219398" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:27.217881" elapsed="0.001655"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.219840" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.220255" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:27.217211" elapsed="0.003232"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:27.216631" elapsed="0.003877"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:27.111766" elapsed="0.109090"/>
</kw>
<msg time="2026-04-10T00:54:27.220965" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:27.221011" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:27.111118" elapsed="0.109933"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:27.221255" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:54:27.221138" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.221117" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.221789" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.222137" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:27.222210" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:27.110407" elapsed="0.111918"/>
</kw>
<msg time="2026-04-10T00:54:27.222425" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:27.222470" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:27.105462" elapsed="0.117047"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.222864" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:27.222605" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.222587" elapsed="0.000355"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:27.105315" elapsed="0.117651"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:27.229098" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:27.228981" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.228959" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:27.230377" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:27.230269" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.230251" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:27.230942" level="INFO">${karaf_connection_index} = 234</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:27.230627" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:27.231380" level="INFO">${current_connection_index} = 254</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:27.231141" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:27.271064" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:27.231932" elapsed="0.039424"/>
</kw>
<msg time="2026-04-10T00:54:27.271690" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:27.271754" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:27.231592" elapsed="0.040212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:27.344445" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:27.272742" elapsed="0.072143"/>
</kw>
<msg time="2026-04-10T00:54:27.345308" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:27.345412" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:27.272135" elapsed="0.073583"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.346540" elapsed="0.000089"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:27.345939" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.345882" elapsed="0.000881"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.347856" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:27.347087" elapsed="0.000967"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.348717" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:27.348202" elapsed="0.000637"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.348163" elapsed="0.000730"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:27.348969" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:27.354630" elapsed="0.000190"/>
</kw>
<msg time="2026-04-10T00:54:27.354893" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:27.352332" elapsed="0.002705"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.355322" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.355687" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:27.350910" elapsed="0.005169"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:27.349616" elapsed="0.006534"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:27.229964" elapsed="0.126291"/>
</kw>
<msg time="2026-04-10T00:54:27.356356" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:27.356401" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:27.229336" elapsed="0.127107"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:27.356666" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:54:27.356532" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.356510" elapsed="0.000247"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.357196" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.357548" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:27.357637" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:27.228565" elapsed="0.129225"/>
</kw>
<msg time="2026-04-10T00:54:27.357889" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:27.357935" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:27.223246" elapsed="0.134730"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.358503" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:27.358054" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.358037" elapsed="0.000562"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:27.223100" elapsed="0.135524"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:27.364600" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:27.364460" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.364440" 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-04-10T00:54:27.366066" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:27.365953" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.365935" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:27.366626" level="INFO">${karaf_connection_index} = 236</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:27.366287" elapsed="0.000369"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:27.367069" level="INFO">${current_connection_index} = 254</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:27.366823" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:27.405106" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:27.367618" elapsed="0.037744"/>
</kw>
<msg time="2026-04-10T00:54:27.405644" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:27.405695" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:27.367258" elapsed="0.038477"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:27.487703" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:27.406504" elapsed="0.081481"/>
</kw>
<msg time="2026-04-10T00:54:27.488232" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:27.488281" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:27.406005" elapsed="0.082314"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.488836" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:27.488449" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.488411" elapsed="0.000518"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.489484" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:27.489082" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.489912" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:27.489671" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.489653" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:27.490034" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:27.493019" elapsed="0.000182"/>
</kw>
<msg time="2026-04-10T00:54:27.493267" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:27.491704" elapsed="0.001704"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.493721" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.494127" elapsed="0.000080"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:27.491011" elapsed="0.003322"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:27.490358" elapsed="0.004045"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:27.365602" elapsed="0.129132"/>
</kw>
<msg time="2026-04-10T00:54:27.494839" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:27.494886" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:27.364941" elapsed="0.130035"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:27.495251" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:54:27.495067" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.495046" elapsed="0.000298"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.495801" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.496150" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:27.496223" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:27.364066" elapsed="0.132271"/>
</kw>
<msg time="2026-04-10T00:54:27.496439" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:27.496486" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:27.358905" elapsed="0.137620"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.496928" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:27.496663" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.496643" elapsed="0.000366"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:27.358757" elapsed="0.138277"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:27.105134" elapsed="0.391935"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:54:27.102616" elapsed="0.394516"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:54:27.097522" elapsed="0.399672"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:27.097058" elapsed="0.400186"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:54:27.093518" elapsed="0.403785"/>
</kw>
<kw name="Add Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Add Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.508588" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:27.508201" elapsed="0.000421"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:27.508679" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:54:27.508846" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:27.507833" elapsed="0.001038"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.522843" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:27.522522" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.523342" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:27.523071" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.523808" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:27.523545" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.524249" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:27.524006" elapsed="0.000288"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:27.525145" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:54:27.524939" elapsed="0.000232"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:54:27.525498" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:54:27.525326" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:54:27.525694" elapsed="0.000200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.526297" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:27.526052" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:54:27.526387" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:54:27.526575" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:54:27.524508" elapsed="0.002177"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:27.539643" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Content-Length': '401', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:54:27.539733" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:27.539918" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:27.529175" elapsed="0.010784"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:27.526769" elapsed="0.013271"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.540354" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:27.540091" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.526749" elapsed="0.013743"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.545887" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:27.542194" elapsed="0.003761"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:27.541842" elapsed="0.004166"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.541813" elapsed="0.004232"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.550134" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:27.546461" elapsed="0.003742"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:27.546129" elapsed="0.004125"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.546104" elapsed="0.004188"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.551159" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:27.550583" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.551749" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:27.551304" elapsed="0.000532"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.552397" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:27.552089" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:27.551873" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.551277" elapsed="0.001204"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.553047" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:27.552664" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.553457" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:27.553173" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.554063" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:27.553758" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:27.553573" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.553151" elapsed="0.000998"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:27.554306" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:27.555148" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:27.554851" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:27.555351" elapsed="0.002441"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:27.541115" elapsed="0.016752"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:27.558060" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:27.557947" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.557928" elapsed="0.000286"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:27.560836" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:27.558367" elapsed="0.002498"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:27.560915" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:54:27.561085" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:27.519816" elapsed="0.041295"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:27.561182" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:27.561337" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:54:27.516895" elapsed="0.044468"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:27.561418" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:54:27.561597" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:27.507350" elapsed="0.054275"/>
</kw>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Add Bulk Flow in member 2 according to ${json_body_add}.</doc>
<status status="PASS" start="2026-04-10T00:54:27.502840" elapsed="0.058852"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.569086" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:27.568770" elapsed="0.000344"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:27.569162" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:54:27.569316" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:27.568380" elapsed="0.000961"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.576318" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:27.576054" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.576787" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:27.576524" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:27.583566" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:27.583628" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:27 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782467,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:27.583770" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:27.578965" elapsed="0.004833"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:27.576906" elapsed="0.006936"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.584046" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:27.583873" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.576885" elapsed="0.007288"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.589370" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782467,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:27.585769" elapsed="0.003673"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:27.585408" elapsed="0.004086"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.585381" elapsed="0.004150"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.593128" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:27.589967" elapsed="0.003208"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:27.589640" elapsed="0.003570"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.589614" elapsed="0.003768"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.594003" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:27.593601" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.594345" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:27.594103" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.594924" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:27.594616" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:27.594428" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.594084" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.595535" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:27.595170" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.595919" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:27.595654" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.596460" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:27.596164" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:27.596000" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.595636" elapsed="0.000911"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:27.596718" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:27.597522" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:27.597232" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:27.597723" elapsed="0.002579"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:27.584759" elapsed="0.015612"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:27.600569" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:54:27.600444" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:27.600425" elapsed="0.000240"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:27.600817" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:27.600888" elapsed="0.000014"/>
</return>
<msg time="2026-04-10T00:54:27.603166" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782467,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:27.569712" elapsed="0.033484"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:27.603248" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:27.603400" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782467,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:27.567868" elapsed="0.035559"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.604453" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782467, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:27.604055" elapsed="0.000427"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:27.604531" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:54:27.604706" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782467, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:27.603679" elapsed="0.001054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:27.605093" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:27.604912" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.605620" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:27.605298" elapsed="0.000349"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.606153" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:27.605884" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:27.606761" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:27.606356" elapsed="0.000478">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:27.563006" elapsed="0.043948">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.613476" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:28.613091" elapsed="0.000420"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:28.613589" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:54:28.613764" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:28.612718" elapsed="0.001072"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.620694" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:28.620410" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.621150" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:28.620902" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:28.629340" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:28.629402" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:28 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782468,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:28.629498" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:28.623347" elapsed="0.006177"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:28.621271" elapsed="0.008319"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.629775" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:28.629619" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.621249" elapsed="0.008613"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.633315" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782468,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:28.630893" elapsed="0.002471"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:28.630668" elapsed="0.002731"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.630650" elapsed="0.002773"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.636121" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:28.633753" elapsed="0.002416"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:28.633488" elapsed="0.002716"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.633466" elapsed="0.002763"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.636829" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:28.636412" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.637171" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:28.636929" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.637745" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:28.637419" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:28.637254" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.636911" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.638361" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:28.637993" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.638716" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:28.638461" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.639336" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:28.639035" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:28.638866" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.638443" elapsed="0.000977"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:28.639594" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:28.640435" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:28.640142" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:28.640637" elapsed="0.002348"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:28.630226" elapsed="0.012823"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:28.643227" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:54:28.643122" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.643103" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.643464" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:28.643536" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:54:28.645868" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782468,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:28.614148" elapsed="0.031749"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:28.645949" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:28.646100" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782468,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:28.612214" elapsed="0.033912"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.647141" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782468, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:28.646709" elapsed="0.000461"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:28.647219" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:28.647372" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782468, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:28.646347" elapsed="0.001051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:28.647780" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:28.647597" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.648324" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:28.647985" elapsed="0.000365"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.648809" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:28.648525" elapsed="0.000310"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:54:28.649008" elapsed="0.000471"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:54:28.607503" elapsed="0.042039"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:54:27.562365" elapsed="1.087242"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 2.</doc>
<status status="PASS" start="2026-04-10T00:54:27.561937" elapsed="1.087731"/>
</kw>
<arg>${temp_json_config_add}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Add Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:54:27.502287" elapsed="1.147437"/>
</kw>
<doc>1000 Flows added via Follower Node1 and verify it gets applied in all instances.</doc>
<status status="PASS" start="2026-04-10T00:54:27.092898" elapsed="1.556948"/>
</test>
<test id="s1-s3-t5" name="Get Bulk Flows and Verify In Cluster" line="66">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:54:28.654295" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:54:28.653973" elapsed="0.000611"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:28.655593" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:28.655464" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.655446" elapsed="0.000217"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:28.660870" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:28.660761" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.660742" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.661954" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:28.661565" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.662457" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:28.662148" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:28.662527" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:54:28.662708" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:28.661169" elapsed="0.001564"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:28.668221" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:28.668112" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.668092" elapsed="0.000246"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:28.669550" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:28.669437" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.669419" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:28.670093" level="INFO">${karaf_connection_index} = 232</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:28.669789" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:28.670524" level="INFO">${current_connection_index} = 254</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:28.670284" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:28.700665" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:28.671089" elapsed="0.029682"/>
</kw>
<msg time="2026-04-10T00:54:28.700949" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:28.700996" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:28.670745" elapsed="0.030288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:28.770786" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:28.701591" elapsed="0.069439"/>
</kw>
<msg time="2026-04-10T00:54:28.771263" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:28.771316" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:28.701213" elapsed="0.070143"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.771822" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:28.771473" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.771440" elapsed="0.000472"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.772452" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:28.772066" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.772935" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:28.772703" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.772682" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:28.773093" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:28.775741" elapsed="0.000172"/>
</kw>
<msg time="2026-04-10T00:54:28.775975" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:28.774696" elapsed="0.001415"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.776390" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.776761" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:28.774020" elapsed="0.002931"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:28.773412" elapsed="0.003604"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:28.669129" elapsed="0.108028"/>
</kw>
<msg time="2026-04-10T00:54:28.777256" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:28.777302" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:28.668494" elapsed="0.108845"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:28.777576" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:54:28.777418" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.777399" elapsed="0.000265"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.778067" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.778406" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:28.778478" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:28.667767" elapsed="0.110850"/>
</kw>
<msg time="2026-04-10T00:54:28.778717" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:28.778763" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:28.663124" elapsed="0.115677"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.779136" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:28.778879" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.778861" elapsed="0.000354"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:28.662969" elapsed="0.116270"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:28.784841" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:28.784732" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.784713" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:28.786234" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:28.786123" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.786105" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:28.786780" level="INFO">${karaf_connection_index} = 234</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:28.786450" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:28.787198" level="INFO">${current_connection_index} = 254</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:28.786967" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:28.824614" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:28.787790" elapsed="0.036980"/>
</kw>
<msg time="2026-04-10T00:54:28.824936" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:28.824983" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:28.787384" elapsed="0.037636"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:28.918040" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:28.825612" elapsed="0.092892"/>
</kw>
<msg time="2026-04-10T00:54:28.919025" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:28.919096" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:28.825201" elapsed="0.093933"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.919595" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:28.919250" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.919218" elapsed="0.000464"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:28.920207" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:28.919832" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.920613" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:28.920373" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.920354" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:28.920731" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:28.923455" elapsed="0.000195"/>
</kw>
<msg time="2026-04-10T00:54:28.923713" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:28.922312" elapsed="0.001535"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.924127" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.924461" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:28.921650" elapsed="0.003015"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:28.921055" elapsed="0.003674"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:28.785816" elapsed="0.139012"/>
</kw>
<msg time="2026-04-10T00:54:28.924927" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:28.924972" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:28.785066" elapsed="0.139942"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:28.925196" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:54:28.925087" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.925069" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.925706" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.926048" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:28.926120" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:28.784368" elapsed="0.141902"/>
</kw>
<msg time="2026-04-10T00:54:28.926424" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:28.926469" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:28.779516" elapsed="0.146989"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:28.926854" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:28.926599" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.926581" elapsed="0.000351"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:28.779370" elapsed="0.147586"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:28.932568" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:28.932442" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.932424" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:28.933801" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:28.933693" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:28.933675" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:28.934401" level="INFO">${karaf_connection_index} = 236</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:28.934015" elapsed="0.000415"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:28.934850" level="INFO">${current_connection_index} = 254</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:28.934613" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:28.971423" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:28.935378" elapsed="0.036156"/>
</kw>
<msg time="2026-04-10T00:54:28.971716" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:28.971762" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:28.935038" elapsed="0.036759"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:29.046283" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:28.972313" elapsed="0.074193"/>
</kw>
<msg time="2026-04-10T00:54:29.046743" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:29.046792" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:28.971969" elapsed="0.074863"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.047501" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.046941" elapsed="0.000644"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.046910" elapsed="0.000702"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.048132" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.047761" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.048888" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.048657" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.048288" elapsed="0.000681"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:29.049005" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:29.052017" elapsed="0.000171"/>
</kw>
<msg time="2026-04-10T00:54:29.052253" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:29.050762" elapsed="0.001628"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.052746" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.053082" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:29.049924" elapsed="0.003343"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:29.049311" elapsed="0.004021"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:28.933371" elapsed="0.120062"/>
</kw>
<msg time="2026-04-10T00:54:29.053532" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:29.053611" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:28.932796" elapsed="0.120854"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:29.053852" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:54:29.053737" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.053716" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.054367" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.054731" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:29.054805" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:28.932091" elapsed="0.122825"/>
</kw>
<msg time="2026-04-10T00:54:29.055013" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:29.055059" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:28.927238" elapsed="0.127860"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.055459" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.055203" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.055185" elapsed="0.000351"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:28.927092" elapsed="0.128484"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:28.662789" elapsed="0.392824"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:54:28.660374" elapsed="0.395297"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:54:28.655175" elapsed="0.400555"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:28.654744" elapsed="0.401034"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:54:28.651262" elapsed="0.404572"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.067857" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:29.067354" elapsed="0.000536"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.068381" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:29.068063" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:29.068457" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:54:29.068656" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:29.066900" elapsed="0.001782"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.079807" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:29.079419" elapsed="0.000421"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:29.079897" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:54:29.080064" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:29.079000" elapsed="0.001175"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.093821" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.093533" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.094266" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.094028" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.094729" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.094466" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.095165" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.094928" elapsed="0.000280"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:29.096066" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:54:29.095863" elapsed="0.000229"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:54:29.096420" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:54:29.096247" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:54:29.096614" elapsed="0.000201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.097218" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.096972" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:54:29.097303" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:54:29.097461" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:54:29.095409" elapsed="0.002077"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:29.106871" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:54:29.106920" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:29.107024" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:29.099718" elapsed="0.007332"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.097582" elapsed="0.009518"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.107283" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.107129" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.097548" elapsed="0.009825"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.112297" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.108647" elapsed="0.003713"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.108307" elapsed="0.004103"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.108281" elapsed="0.004163"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.116188" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.112866" elapsed="0.003369"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.112524" elapsed="0.003746"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.112500" elapsed="0.003799"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.116927" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.116490" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.117267" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.117026" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.117833" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:29.117511" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.117349" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.117008" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.118524" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.118077" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.118878" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.118640" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.119416" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:29.119120" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.118959" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.118622" elapsed="0.000876"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:29.119685" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:29.120489" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.120209" elapsed="0.000306"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:29.120691" elapsed="0.002368"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:29.107792" elapsed="0.015330"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:29.123301" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:29.123195" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.123177" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:29.125947" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:29.123513" elapsed="0.002461"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:29.126023" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:29.126183" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:29.090804" elapsed="0.035404"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:29.126274" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:54:29.126424" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:54:29.088207" elapsed="0.038241"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:29.126499" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:54:29.126664" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:29.078451" elapsed="0.048238"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:54:29.073501" elapsed="0.053252"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:29.068883" elapsed="0.057905"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.137027" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:29.136723" elapsed="0.000331"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:29.137101" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:29.137251" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:29.136358" elapsed="0.000918"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.151006" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.150748" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.151643" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.151212" elapsed="0.000478"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.152128" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.151872" elapsed="0.000508"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.152803" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.152539" elapsed="0.000308"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:29.153667" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:54:29.153457" elapsed="0.000237"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:54:29.154019" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:54:29.153849" elapsed="0.000196"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:54:29.154197" elapsed="0.000186"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.154808" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.154542" elapsed="0.000311"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:54:29.154896" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:29.155052" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:54:29.153049" elapsed="0.002028"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:29.192902" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:54:29.193007" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:29.193204" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:29.157245" elapsed="0.036018"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.155150" elapsed="0.038217"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.193803" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.193427" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.155132" elapsed="0.038870"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.200023" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.196393" elapsed="0.003691"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.195844" elapsed="0.004288"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.195804" elapsed="0.004383"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.203843" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.200596" elapsed="0.003312"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.200266" elapsed="0.003690"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.200242" elapsed="0.003748"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.204810" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.204262" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.205226" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.204950" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.205795" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:29.205472" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.205308" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.204924" elapsed="0.000956"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.206403" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.206040" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.206806" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.206501" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.207351" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:29.207051" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.206890" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.206483" elapsed="0.000954"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:29.207660" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:29.208504" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.208189" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:29.208707" elapsed="0.002515"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:29.194833" elapsed="0.016456"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:29.211470" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:29.211364" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.211346" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:29.214137" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:29.211705" elapsed="0.002459"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:29.214213" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:54:29.214375" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:29.147799" elapsed="0.066601"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:29.214467" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:29.214636" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:54:29.145224" elapsed="0.069437"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:29.214714" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:54:29.214861" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:29.135906" elapsed="0.078979"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:54:29.131412" elapsed="0.083539"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:29.126882" elapsed="0.088103"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.225815" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:29.225424" elapsed="0.000423"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:29.225904" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:54:29.226071" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:29.225049" elapsed="0.001047"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.239931" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.239620" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.240404" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.240158" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.240929" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.240677" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.241366" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.241125" elapsed="0.000284"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:29.242253" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:54:29.242052" elapsed="0.000227"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:54:29.242626" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:54:29.242435" elapsed="0.000216"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:54:29.242801" elapsed="0.000197"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.243502" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.243253" elapsed="0.000310"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:54:29.243612" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:54:29.243787" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:54:29.241639" elapsed="0.002172"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:29.285033" level="INFO">POST Request : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:54:29.285171" level="INFO">POST Response : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:29.285411" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:29.246309" elapsed="0.039163"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.243895" elapsed="0.041732"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.286101" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.285699" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.243874" elapsed="0.042431"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.293722" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.288951" elapsed="0.004816"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.288374" elapsed="0.005429"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.288331" elapsed="0.005496"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.296425" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.294108" elapsed="0.002366"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.293883" elapsed="0.002626"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.293867" elapsed="0.002667"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.297150" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.296732" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.297489" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.297249" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.298062" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:29.297758" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.297592" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.297231" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.298738" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.298308" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.299071" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.298837" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.299628" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:29.299312" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.299152" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.298819" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:29.299869" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:29.300688" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.300384" elapsed="0.000331"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:29.300910" elapsed="0.002358"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:29.287186" elapsed="0.016147"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:54:29.303658" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:29.303526" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.303506" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:54:29.306306" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:54:29.303878" elapsed="0.002456"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:54:29.306383" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:54:29.306562" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:29.236907" elapsed="0.069683"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:29.306659" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:29.306814" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:54:29.234131" elapsed="0.072708"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:29.306892" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:54:29.307040" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:29.224521" elapsed="0.082544"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:54:29.219710" elapsed="0.087420"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:29.215080" elapsed="0.092085"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:29.068745" elapsed="0.238455"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.318826" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:29.318502" elapsed="0.000353"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:29.318902" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:29.319054" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:29.318151" elapsed="0.000928"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.325771" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.325505" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.326217" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.325976" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:29.332166" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:29.332221" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:29 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782469,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:29.332312" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:29.328611" elapsed="0.003727"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.326328" elapsed="0.006053"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.332583" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.332408" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.326310" elapsed="0.006361"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.336986" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782469,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.333733" elapsed="0.003358"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.333492" elapsed="0.003652"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.333474" elapsed="0.003759"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.340990" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.337664" elapsed="0.003393"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.337320" elapsed="0.003833"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.337295" elapsed="0.003894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.341976" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.341423" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.342346" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.342109" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.342914" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:29.342610" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.342429" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.342088" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.343521" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.343160" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.343871" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.343636" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.344416" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:29.344120" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.343953" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.343618" elapsed="0.000881"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:29.344666" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:29.345476" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.345205" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:29.345676" elapsed="0.002487"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:29.333026" elapsed="0.015201"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:29.348404" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:54:29.348298" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.348280" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.348658" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:29.348731" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:54:29.351048" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782469,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:29.319418" elapsed="0.031658"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:29.351129" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:29.351280" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782469,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:29.317692" elapsed="0.033615"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.352283" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782469, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.351888" elapsed="0.000424"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:29.352361" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:29.352516" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782469, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:29.351526" elapsed="0.001021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:29.352974" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:29.352742" elapsed="0.000258"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.353534" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:29.353223" elapsed="0.000355"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.354023" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:29.353756" elapsed="0.000293"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:54:29.354223" elapsed="0.000315"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:54:29.313023" elapsed="0.041595"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:54:29.312387" elapsed="0.042281"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:29.311905" elapsed="0.042826"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:29.307393" elapsed="0.047370"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.365993" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:29.365692" elapsed="0.000329"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:29.366066" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:29.366216" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:29.365327" elapsed="0.000914"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.373021" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.372762" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.373511" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.373228" elapsed="0.000343"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:29.381858" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:29.381935" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:29 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782469,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:29.382059" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:29.375718" elapsed="0.006384"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.373643" elapsed="0.008537"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.382496" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.382227" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.373624" elapsed="0.009034"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.388109" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782469,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.384295" elapsed="0.003896"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.383947" elapsed="0.004302"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.383919" elapsed="0.004368"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.391655" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:29.388751" elapsed="0.002957"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.388377" elapsed="0.003370"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.388350" elapsed="0.003423"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.392384" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.391978" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.392748" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.392484" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.393407" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:29.393079" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.392908" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.392465" elapsed="0.001048"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.394057" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.393691" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:29.394387" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:29.394155" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.394943" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:29.394648" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:29.394468" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.394137" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:29.395191" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:29.396008" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.395720" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:29.396191" elapsed="0.002524"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:29.383244" elapsed="0.015544"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:29.398983" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:54:29.398868" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:29.398847" 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-04-10T00:54:29.399254" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:29.399326" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:54:29.401696" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782469,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:29.366592" elapsed="0.035135"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:29.401782" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:29.401938" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782469,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:29.364846" elapsed="0.037118"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.403064" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782469, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:29.402625" elapsed="0.000468"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:29.403140" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:29.403295" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782469, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:29.402215" elapsed="0.001106"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:29.403703" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:29.403500" elapsed="0.000298"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.404297" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:29.403982" elapsed="0.000341"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.404778" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:29.404495" elapsed="0.000309"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:29.405329" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:29.404977" elapsed="0.000423">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:29.360382" elapsed="0.045167">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:30.419817" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:30.419257" elapsed="0.000602"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:30.419931" elapsed="0.000118"/>
</return>
<msg time="2026-04-10T00:54:30.420213" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:30.418781" elapsed="0.001464"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:30.429309" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:30.428853" elapsed="0.000534"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:30.429935" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:30.429627" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:30.439082" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:30.439202" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:30 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782470,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:30.439377" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:30.432965" elapsed="0.006449"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:30.430096" elapsed="0.009394"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:30.439848" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:30.439545" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:30.430064" elapsed="0.009899"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:30.444785" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782470,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:30.441461" elapsed="0.003390"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:30.441156" elapsed="0.003739"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:30.441130" elapsed="0.003794"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:30.447819" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:30.445238" elapsed="0.002629"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:30.444990" elapsed="0.002912"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:30.444971" elapsed="0.002956"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:30.448577" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:30.448152" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:30.448917" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:30.448677" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:30.449460" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:30.449162" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:30.448999" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:30.448659" elapsed="0.000887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:30.450087" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:30.449727" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:30.450491" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:30.450221" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:30.451050" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:30.450756" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:30.450595" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:30.450197" elapsed="0.000949"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:30.451361" elapsed="0.000503"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:30.452659" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:30.452231" elapsed="0.000465"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:30.452913" elapsed="0.002378"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:30.440541" elapsed="0.014818"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:30.455538" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:54:30.455430" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:30.455411" 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-04-10T00:54:30.455799" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:30.455869" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:54:30.458161" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782470,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:30.420722" elapsed="0.037468"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:30.458243" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:30.458395" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782470,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:30.417975" elapsed="0.040446"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:30.459417" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782470, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:30.459025" elapsed="0.000420"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:30.459492" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:30.459665" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782470, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:30.458672" elapsed="0.001019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:30.460049" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:30.459869" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:30.460598" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:30.460282" elapsed="0.000342"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:30.461056" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:30.460796" elapsed="0.000285"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:30.461616" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:30.461251" elapsed="0.000438">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:30.406650" elapsed="0.055148">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:31.472720" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:31.472196" elapsed="0.000571"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:31.472846" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:54:31.473080" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:31.471685" elapsed="0.001429"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:31.482783" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:31.482397" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:31.483271" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:31.483018" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:31.491536" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:31.491795" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:31 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:31 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782471,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:31.492008" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:31.485694" elapsed="0.006385"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:31.483404" elapsed="0.008785"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:31.492664" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:31.492250" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:31.483378" elapsed="0.009427"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:31.498842" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782471,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:31.494729" elapsed="0.004213"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:31.494331" elapsed="0.004687"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:31.494299" elapsed="0.004774"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:31.502251" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:31.499529" elapsed="0.002787"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:31.499213" elapsed="0.003150"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:31.499182" elapsed="0.003212"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:31.503165" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:31.502675" elapsed="0.000519"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:31.503534" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:31.503278" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:31.504138" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:31.503820" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:31.503649" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:31.503256" elapsed="0.000968"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:31.504817" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:31.504389" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:31.505162" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:31.504919" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:31.505775" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:31.505444" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:31.505276" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:31.504900" elapsed="0.000959"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:31.506028" elapsed="0.000429"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:31.506952" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:31.506651" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:31.507137" elapsed="0.002664"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:31.493511" elapsed="0.016366"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:31.510107" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T00:54:31.509961" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:31.509940" 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-04-10T00:54:31.510395" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:31.510468" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:54:31.512901" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782471,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:31.473818" elapsed="0.039206"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:31.513092" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:54:31.513286" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782471,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:31.470910" elapsed="0.042405"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:31.514615" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782471, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:31.514056" elapsed="0.000589"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:31.514696" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:54:31.514861" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782471, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:31.513626" elapsed="0.001263"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:31.515265" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:31.515075" elapsed="0.000217"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:31.515897" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:31.515472" elapsed="0.000453"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:31.516400" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:31.516120" elapsed="0.000306"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:31.517000" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:31.516627" elapsed="0.000448">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:31.462820" elapsed="0.054386">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:32.529315" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:32.528844" elapsed="0.000514"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:32.529430" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:54:32.529670" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:32.528323" elapsed="0.001382"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:32.539142" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:32.538694" elapsed="0.000556"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:32.539870" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:32.539528" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:32.550196" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:32.550314" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:32 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:32 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782472,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:32.550494" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:32.543100" elapsed="0.007432"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:32.540036" elapsed="0.010599"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:32.550969" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:32.550684" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:32.540005" elapsed="0.011081"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:32.555721" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782472,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:32.552736" elapsed="0.003048"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:32.552378" elapsed="0.003531"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:32.552351" elapsed="0.003586"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:32.558677" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:32.556240" elapsed="0.002487"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:32.556000" elapsed="0.002763"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:32.555981" elapsed="0.002807"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:32.559453" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:32.558988" elapsed="0.000493"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:32.559817" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:32.559570" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:32.560384" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:32.560070" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:32.559902" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:32.559535" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:32.561030" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:32.560657" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:32.561373" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:32.561131" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:32.561935" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:32.561636" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:32.561455" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:32.561112" elapsed="0.000907"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:32.562176" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:32.563012" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:32.562714" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:32.563202" elapsed="0.002683"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:32.551758" elapsed="0.014196"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:32.566144" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:54:32.566026" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:32.566007" 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-04-10T00:54:32.566402" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:32.566475" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:54:32.568828" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782472,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:32.530188" elapsed="0.038671"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:32.568912" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:32.569067" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782472,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:32.527460" elapsed="0.041634"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:32.570105" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782472, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:32.569701" elapsed="0.000434"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:32.570184" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:32.570342" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782472, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:32.569330" elapsed="0.001075"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:32.570798" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:32.570609" elapsed="0.000216"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:32.571339" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:32.571005" elapsed="0.000363"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:32.571834" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:32.571560" elapsed="0.000301"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:54:32.572392" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:54:32.572037" elapsed="0.000427">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:54:32.518142" elapsed="0.054452">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.583256" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:33.582877" elapsed="0.000414"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:33.583351" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:54:33.583522" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:33.582478" elapsed="0.001087"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.590613" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.590326" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.591079" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.590825" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:33.599167" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:33.599227" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:33 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:33 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782473,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:33.599323" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:33.593309" elapsed="0.006040"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.591200" elapsed="0.008193"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.599601" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.599421" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.591179" elapsed="0.008510"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.603239" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782473,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.600751" elapsed="0.002538"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.600507" elapsed="0.002817"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.600488" elapsed="0.002861"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.606785" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.603649" elapsed="0.003203"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.603405" elapsed="0.003496"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.603388" elapsed="0.003547"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.607748" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.607175" elapsed="0.000611"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.608247" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.607913" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.609052" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:33.608619" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.608363" elapsed="0.000853"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.607887" elapsed="0.001367"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.610042" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.609490" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.610517" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.610183" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.611312" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:33.610889" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.610660" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.610157" elapsed="0.001275"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:33.611672" elapsed="0.000535"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:33.612707" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.612391" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:33.612893" elapsed="0.002391"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:33.600080" elapsed="0.015268"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:33.615527" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T00:54:33.615419" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.615401" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.615784" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:33.615875" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:54:33.618455" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782473,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:33.583948" elapsed="0.034542"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:33.618575" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:54:33.618761" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782473,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:33.581893" elapsed="0.036899"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.620093" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782473, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.619466" elapsed="0.000662"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:33.620185" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:54:33.620361" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782473, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:33.619060" elapsed="0.001328"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:33.620770" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:33.620586" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.621273" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:33.620970" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.621756" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:33.621471" elapsed="0.000311"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:54:33.621954" elapsed="0.000311"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:54:33.573467" elapsed="0.048859"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:54:29.359821" elapsed="4.262557"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:29.359403" elapsed="4.263036"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:29.354852" elapsed="4.267707"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.634270" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:33.633966" elapsed="0.000331"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:33.634344" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:33.634493" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:33.633611" elapsed="0.000907"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.641575" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.641306" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.642028" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.641784" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:33.650248" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:33.650334" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:33 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:33 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782473,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:33.650472" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:33.644218" elapsed="0.006292"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.642139" elapsed="0.008467"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.650878" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.650648" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.642121" elapsed="0.008879"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.656256" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782473,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.652499" elapsed="0.003832"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.652181" elapsed="0.004200"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.652155" elapsed="0.004261"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.660233" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.656845" elapsed="0.003456"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.656498" elapsed="0.003852"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.656472" elapsed="0.003912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.661225" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.660670" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.661722" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.661363" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.662494" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:33.662067" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.661839" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.661337" elapsed="0.001299"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.663366" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.662860" elapsed="0.000543"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.663857" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.663501" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.664683" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:33.664238" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.663971" elapsed="0.000800"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.663476" elapsed="0.001326"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:33.665098" elapsed="0.000388"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:33.665968" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.665674" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:33.666154" elapsed="0.002375"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:33.651522" elapsed="0.017094"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:33.668801" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:54:33.668691" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.668672" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.669051" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:33.669124" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:54:33.671424" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782473,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:33.634866" elapsed="0.036587"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:33.671506" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:33.671677" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782473,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:33.632951" elapsed="0.038752"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.672750" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782473, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.672334" elapsed="0.000445"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:33.672828" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:33.672983" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782473, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:33.671937" elapsed="0.001073"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:33.673374" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:33.673190" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.673906" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:33.673598" elapsed="0.000335"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.674375" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:54:33.674109" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:54:33.674591" elapsed="0.000318"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:54:33.628483" elapsed="0.046489"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:54:33.627814" elapsed="0.047211"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:33.627393" elapsed="0.047696"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:33.622666" elapsed="0.052459"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:29.307253" elapsed="4.367908"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.686089" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:33.685785" elapsed="0.000331"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:33.686163" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:33.686316" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:33.685415" elapsed="0.000926"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.693079" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.692826" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.693610" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.693346" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:33.700704" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:33.700770" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:33 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:33 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782473,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:33.700874" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:33.695978" elapsed="0.004923"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.693726" elapsed="0.007223"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.701152" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.700980" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.693706" elapsed="0.007537"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.704998" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782473,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.702341" elapsed="0.002709"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.702111" elapsed="0.002975"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.702091" elapsed="0.003019"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.708940" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.705665" elapsed="0.003340"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.705168" elapsed="0.003886"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.705150" elapsed="0.003939"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.710061" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.709357" elapsed="0.000744"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.710585" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.710209" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.711405" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:33.710949" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.710708" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.710182" elapsed="0.001346"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.712374" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.711791" elapsed="0.000623"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.712887" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.712518" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.713538" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:33.713241" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.713008" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.712492" elapsed="0.001148"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:33.713803" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:33.714630" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.714318" elapsed="0.000338"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:33.714813" elapsed="0.002682"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:33.701657" elapsed="0.015930"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:33.717859" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:54:33.717744" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.717722" elapsed="0.000234"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.718117" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:33.718242" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:54:33.720655" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782473,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:33.686698" elapsed="0.033988"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:33.720740" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:33.720896" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782473,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:33.684958" elapsed="0.035964"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:54:33.720970" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:54:33.721114" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782473,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 1. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:54:33.680409" elapsed="0.040731"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.722267" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782473, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.721813" elapsed="0.000483"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:33.722344" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:33.722500" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782473, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:33.721394" elapsed="0.001132"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:33.722915" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:33.722729" elapsed="0.000212"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.723411" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:54:33.723122" elapsed="0.000347"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:54:33.679922" elapsed="0.043605"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:33.675359" elapsed="0.048231"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.734567" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:33.734190" elapsed="0.000411"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:33.734662" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:54:33.734830" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:33.733820" elapsed="0.001035"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.742145" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.741785" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.742642" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.742376" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:33.752213" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:33.752309" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:33 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:33 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782473,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:33.752506" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:33.744960" elapsed="0.007581"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.742773" elapsed="0.009940"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.752978" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.752753" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.742748" elapsed="0.010324"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.758384" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782473,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.754709" elapsed="0.003762"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.754335" elapsed="0.004198"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.754307" elapsed="0.004289"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.762206" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.759057" elapsed="0.003204"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.758692" elapsed="0.003609"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.758664" elapsed="0.003664"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.762988" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.762564" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.763339" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.763094" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.763921" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:33.763613" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.763422" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.763074" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.764570" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.764165" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.764905" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.764670" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.765442" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:33.765146" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.764985" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.764652" elapsed="0.000872"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:33.765708" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:33.766513" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.766223" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:33.766715" elapsed="0.002492"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:33.753650" elapsed="0.015634"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:33.769482" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:54:33.769367" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.769346" elapsed="0.000251"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.769760" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:33.769834" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:54:33.772149" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782473,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:33.735203" elapsed="0.036976"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:33.772235" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:33.772392" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782473,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:33.733323" elapsed="0.039195"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:54:33.772584" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:33.772735" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782473,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:54:33.728925" elapsed="0.043836"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.773915" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782473, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.773427" elapsed="0.000516"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:33.773992" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:33.774149" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782473, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:33.773018" elapsed="0.001158"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:33.774542" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:33.774357" elapsed="0.000230"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.775056" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:54:33.774768" elapsed="0.000346"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:54:33.728397" elapsed="0.046775"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:33.723692" elapsed="0.051516"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.786433" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:33.786073" elapsed="0.000392"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:54:33.786525" elapsed="0.000059"/>
</return>
<msg time="2026-04-10T00:54:33.786712" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:33.785696" elapsed="0.001041"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.793688" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.793300" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.794161" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.793915" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:54:33.801478" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:54:33.801624" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:54:33 GMT', 'Expires': 'Thu, 09 Apr 2026 23:54:33 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782473,"status":200} 
 </msg>
<msg time="2026-04-10T00:54:33.801793" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:54:33.796354" elapsed="0.005481"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.794286" elapsed="0.007627"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.802237" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.801961" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.794263" elapsed="0.008102"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.808107" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782473,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.804008" elapsed="0.004181"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.803658" elapsed="0.004591"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.803630" elapsed="0.004659"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.811324" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.808820" elapsed="0.002554"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.808382" elapsed="0.003108"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.808353" elapsed="0.003165"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.812162" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.811748" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.812511" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.812268" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.813102" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:33.812798" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.812612" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.812248" elapsed="0.000937"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.813726" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.813345" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.814059" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.813825" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.814618" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:33.814303" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:33.814139" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.813807" elapsed="0.000895"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:33.814867" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:54:33.815691" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.815380" elapsed="0.000337"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:33.815874" elapsed="0.002482"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:54:33.802960" elapsed="0.015469"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:54:33.818639" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:54:33.818508" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.818489" 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-04-10T00:54:33.818892" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:54:33.818963" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:54:33.821265" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782473,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:54:33.787083" elapsed="0.034212"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:54:33.821349" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:33.821506" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782473,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:54:33.785168" elapsed="0.036364"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:54:33.821598" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:33.821746" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782473,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 3. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:54:33.780757" elapsed="0.041015"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.822901" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782473, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:33.822417" elapsed="0.000512"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:54:33.822977" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:33.823130" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782473, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:54:33.822019" elapsed="0.001137"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:33.823618" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:33.823416" elapsed="0.000228"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.824112" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:54:33.823825" elapsed="0.000346"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:54:33.780181" elapsed="0.044051"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:33.775307" elapsed="0.048960"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:33.675218" elapsed="0.149085"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:54:29.064377" elapsed="4.759987"/>
</kw>
<doc>Initiate get operation and check flow count across cluster nodes</doc>
<status status="PASS" start="2026-04-10T00:54:28.650437" elapsed="5.174054"/>
</test>
<test id="s1-s3-t6" name="Verify Flows In Switch Before Cluster Restart" line="73">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:54:33.827852" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:54:33.827582" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:33.829232" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:33.829100" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.829077" elapsed="0.000230"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:33.834878" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:33.834748" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.834727" elapsed="0.000230"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.836062" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:33.835631" elapsed="0.000460"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.836586" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:33.836254" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:33.836658" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:54:33.836839" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:33.835221" elapsed="0.001643"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:33.842374" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:33.842249" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.842227" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:33.843746" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:33.843637" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.843619" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:33.844477" level="INFO">${karaf_connection_index} = 232</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:33.843961" elapsed="0.000545"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:33.844961" level="INFO">${current_connection_index} = 254</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:33.844693" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:33.877853" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:33.845669" elapsed="0.032407"/>
</kw>
<msg time="2026-04-10T00:54:33.878310" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:33.878360" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:33.845148" elapsed="0.033249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:33.956013" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:33.879126" elapsed="0.077235"/>
</kw>
<msg time="2026-04-10T00:54:33.956620" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:33.956671" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:33.878687" elapsed="0.078023"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.957156" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.956825" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.956793" elapsed="0.000504"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:33.957844" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:33.957445" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.958227" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.958008" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.957990" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:33.958341" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:33.960955" elapsed="0.001783"/>
</kw>
<msg time="2026-04-10T00:54:33.962821" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:33.959916" elapsed="0.003047"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.963247" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.963612" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:33.959245" elapsed="0.004558"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:33.958675" elapsed="0.005194"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:33.843302" elapsed="0.120667"/>
</kw>
<msg time="2026-04-10T00:54:33.964067" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:33.964112" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:33.842639" elapsed="0.121512"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:33.964362" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:54:33.964242" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.964218" elapsed="0.000232"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.964906" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.965251" elapsed="0.000068"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:33.965368" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:33.841863" elapsed="0.123615"/>
</kw>
<msg time="2026-04-10T00:54:33.965608" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:33.965654" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:33.837247" elapsed="0.128447"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:33.966028" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:33.965771" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.965753" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:33.837099" elapsed="0.129028"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:33.972020" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:33.971888" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.971864" elapsed="0.000238"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:33.973454" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:33.973344" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:33.973285" elapsed="0.000239"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:33.974025" level="INFO">${karaf_connection_index} = 234</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:33.973701" elapsed="0.000353"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:33.974459" level="INFO">${current_connection_index} = 254</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:33.974220" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.010263" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:33.975017" elapsed="0.035505"/>
</kw>
<msg time="2026-04-10T00:54:34.010793" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:34.010843" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:33.974670" elapsed="0.036212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.087387" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:34.011621" elapsed="0.076045"/>
</kw>
<msg time="2026-04-10T00:54:34.087891" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:34.087939" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.011142" elapsed="0.076835"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.088414" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.088092" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.088059" elapsed="0.000438"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.089055" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:34.088685" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.089438" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.089220" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.089202" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:34.089576" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:34.092238" elapsed="0.000185"/>
</kw>
<msg time="2026-04-10T00:54:34.092489" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:34.091196" elapsed="0.001460"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.092943" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.093278" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:34.090530" elapsed="0.002956"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:34.089917" elapsed="0.003651"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:33.972998" elapsed="0.120673"/>
</kw>
<msg time="2026-04-10T00:54:34.093773" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:34.093857" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:33.972294" elapsed="0.121670"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:34.094182" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:54:34.094062" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.094038" 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 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.095080" 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-04-10T00:54:34.095436" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:34.095511" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:33.971345" elapsed="0.124299"/>
</kw>
<msg time="2026-04-10T00:54:34.095743" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:34.095788" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:33.966401" elapsed="0.129426"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.096165" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.095905" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.095887" elapsed="0.000365"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:33.966254" elapsed="0.130022"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:34.102192" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:34.102059" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.102034" elapsed="0.000247"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:34.103760" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:34.103649" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.103630" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:34.104305" level="INFO">${karaf_connection_index} = 236</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:34.103983" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.104765" level="INFO">${current_connection_index} = 254</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:34.104503" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.135260" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:34.105306" elapsed="0.030173"/>
</kw>
<msg time="2026-04-10T00:54:34.135729" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:34.135779" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.104955" elapsed="0.030862"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.213835" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:34.136495" elapsed="0.077693"/>
</kw>
<msg time="2026-04-10T00:54:34.214694" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:34.214807" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.136062" elapsed="0.078832"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.215448" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.215100" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.215046" elapsed="0.000490"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.216063" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:34.215722" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.216535" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.216306" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.216287" elapsed="0.000350"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:34.216675" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:34.219373" elapsed="0.000200"/>
</kw>
<msg time="2026-04-10T00:54:34.219639" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:34.218259" elapsed="0.001515"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.220056" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.220413" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:34.217605" elapsed="0.003017"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:34.216991" elapsed="0.003698"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:34.103310" elapsed="0.117479"/>
</kw>
<msg time="2026-04-10T00:54:34.220885" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:34.220930" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.102474" elapsed="0.118494"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:34.221155" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:54:34.221046" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.221027" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.221666" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.222250" elapsed="0.000075"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:34.222380" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:34.101582" elapsed="0.120918"/>
</kw>
<msg time="2026-04-10T00:54:34.222618" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:34.222665" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.096571" elapsed="0.126134"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.223055" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.222786" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.222767" elapsed="0.000385"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:34.096407" elapsed="0.126771"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:33.836921" elapsed="0.386291"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:54:33.834306" elapsed="0.388968"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:54:33.828793" elapsed="0.394541"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:33.828294" elapsed="0.395089"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:54:33.825405" elapsed="0.398034"/>
</kw>
<kw name="Verify Aggregate Flow From Mininet Session" owner="MininetKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:34.225489" elapsed="0.000204"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:34.225264" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.225246" elapsed="0.000509"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.226362" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:34.225925" elapsed="0.000467"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:34.227305" elapsed="0.000187"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:34.227051" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.227033" elapsed="0.000565"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.230650" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:34.227784" elapsed="0.002925"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.260216" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<msg time="2026-04-10T00:54:34.260480" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:54:34.230873" elapsed="0.029643"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:54:34.260595" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:54:34.260764" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 254 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:54:34.226744" elapsed="0.034049"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:54:34.261213" level="INFO">${flows} = ['1000']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:54:34.260964" elapsed="0.000277"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.261807" level="INFO">${total_flows} = 1000</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:54:34.261410" elapsed="0.000425"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.262338" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-04-10T00:54:34.262025" elapsed="0.000374"/>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="PASS" start="2026-04-10T00:54:34.224943" elapsed="0.037566"/>
</kw>
<arg>${time_out}</arg>
<arg>2s</arg>
<arg>MininetKeywords.Check Flows In Mininet</arg>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:54:34.224188" elapsed="0.038392"/>
</kw>
<arg>${mininet_conn_id}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${operation_timeout}</arg>
<doc>Verify flow count per switch</doc>
<status status="PASS" start="2026-04-10T00:54:34.223693" elapsed="0.038951"/>
</kw>
<doc>Verify flows are installed in switch before cluster restart.</doc>
<status status="PASS" start="2026-04-10T00:54:33.824764" elapsed="0.437997"/>
</test>
<test id="s1-s3-t7" name="Kill All Cluster Nodes" line="80">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:54:34.265967" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:54:34.265692" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:34.267290" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:34.267179" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.267159" elapsed="0.000204"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:34.272791" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:34.272679" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.272659" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.273886" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:34.273476" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.274406" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:34.274090" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:34.274505" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:54:34.274697" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:34.273097" elapsed="0.001627"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:34.280239" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:34.280126" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.280104" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:34.281519" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:34.281372" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.281353" elapsed="0.000273"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:34.282082" level="INFO">${karaf_connection_index} = 232</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:34.281777" elapsed="0.000332"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.282535" level="INFO">${current_connection_index} = 254</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:34.282273" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.327351" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:34.283107" elapsed="0.044348"/>
</kw>
<msg time="2026-04-10T00:54:34.327679" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:34.327727" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.282748" elapsed="0.045016"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.386741" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "A "l "l "[78C[C "[A[78CC
 "l "u "s "t "e "r "[C "N "o "d "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:34.328290" elapsed="0.058791"/>
</kw>
<msg time="2026-04-10T00:54:34.387350" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:34.387400" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.327942" elapsed="0.059498"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.387985" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.387615" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.387540" elapsed="0.000540"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.388743" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "A "l "l "[78C[C "[A[78CC
 "l "u "s "t "e "r "[C "N "o "d "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:34.388249" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.389133" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.388907" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.388888" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:34.389252" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:34.392150" elapsed="0.000182"/>
</kw>
<msg time="2026-04-10T00:54:34.392396" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:34.391056" elapsed="0.001485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.393126" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.393482" elapsed="0.000246"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:34.390313" elapsed="0.003558"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:34.389631" elapsed="0.004311"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:34.281065" elapsed="0.112979"/>
</kw>
<msg time="2026-04-10T00:54:34.394143" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:34.394189" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.280465" elapsed="0.113761"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:34.394427" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:54:34.394306" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.394287" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.395111" 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-04-10T00:54:34.395667" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:34.395743" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:34.279767" elapsed="0.116090"/>
</kw>
<msg time="2026-04-10T00:54:34.395955" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:34.396000" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.275107" elapsed="0.120931"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.396371" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.396115" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.396098" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:34.274959" elapsed="0.121514"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:34.402098" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:34.401990" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.401972" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:34.403422" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:34.403272" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.403242" elapsed="0.000276"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:34.404257" level="INFO">${karaf_connection_index} = 234</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:34.403747" elapsed="0.000548"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.404894" level="INFO">${current_connection_index} = 254</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:34.404522" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.444182" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:34.405654" elapsed="0.038655"/>
</kw>
<msg time="2026-04-10T00:54:34.444516" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:34.444589" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.405154" elapsed="0.039473"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.516954" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "A "l "l "[78C[C "[A[78CC
 "l "u "s "t "e "r "[C "N "o "d "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:34.445191" elapsed="0.072033"/>
</kw>
<msg time="2026-04-10T00:54:34.517514" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:34.517610" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.444817" elapsed="0.072848"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.518250" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.517822" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.517775" elapsed="0.000599"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.519136" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "A "l "l "[78C[C "[A[78CC
 "l "u "s "t "e "r "[C "N "o "d "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:34.518609" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.519730" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.519351" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.519326" elapsed="0.000621"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:34.520002" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:34.522762" elapsed="0.000170"/>
</kw>
<msg time="2026-04-10T00:54:34.522993" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:34.521731" elapsed="0.001400"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.523430" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.523800" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:34.521048" elapsed="0.002936"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:34.520423" elapsed="0.003628"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:34.402906" elapsed="0.121246"/>
</kw>
<msg time="2026-04-10T00:54:34.524257" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:34.524301" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.402322" elapsed="0.122016"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:34.524821" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:54:34.524418" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.524399" elapsed="0.000511"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.525325" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.525700" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:34.525773" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:34.401638" elapsed="0.124244"/>
</kw>
<msg time="2026-04-10T00:54:34.525977" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:34.526021" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.396784" elapsed="0.129274"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.526400" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.526132" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.526115" elapsed="0.000364"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:34.396637" elapsed="0.129866"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:34.532156" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:34.532048" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.532030" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:34.533371" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:34.533264" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.533247" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:34.533917" level="INFO">${karaf_connection_index} = 236</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:34.533609" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.534336" level="INFO">${current_connection_index} = 254</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:34.534102" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.565870" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:54:34.534893" elapsed="0.031079"/>
</kw>
<msg time="2026-04-10T00:54:34.566143" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:54:34.566237" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.534537" elapsed="0.031741"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.637296" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "A "l "l "[78C[C "[A[78CC
 "l "u "s "t "e "r "[C "N "o "d "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:54:34.566829" elapsed="0.070671"/>
</kw>
<msg time="2026-04-10T00:54:34.637748" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:54:34.637798" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.566454" elapsed="0.071382"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.638271" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.637955" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.637922" elapsed="0.000439"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.638918" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "A "l "l "[78C[C "[A[78CC
 "l "u "s "t "e "r "[C "N "o "d "e "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:34.638509" elapsed="0.000496"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.639293" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.639073" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.639055" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:54:34.639408" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:34.642046" elapsed="0.000169"/>
</kw>
<msg time="2026-04-10T00:54:34.642276" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:34.641030" elapsed="0.001381"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.642717" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.643050" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:34.640365" elapsed="0.002866"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:34.639755" elapsed="0.003540"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:54:34.532963" elapsed="0.110428"/>
</kw>
<msg time="2026-04-10T00:54:34.643487" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:34.643531" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.532375" elapsed="0.111216"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:54:34.643778" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:54:34.643670" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.643652" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.644530" elapsed="0.000046"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.644896" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:34.644970" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:54:34.531585" elapsed="0.113494"/>
</kw>
<msg time="2026-04-10T00:54:34.645175" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:34.645220" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.526805" elapsed="0.118451"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.645674" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.645403" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.645384" elapsed="0.000384"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:34.526658" elapsed="0.119134"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:34.274781" elapsed="0.371046"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:54:34.272282" elapsed="0.373621"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:54:34.266883" elapsed="0.379081"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:34.266398" elapsed="0.379614"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:54:34.263417" elapsed="0.382651"/>
</kw>
<kw name="Kill_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.651354" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:34.650971" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.651976" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:34.651541" elapsed="0.000461"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:34.652047" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:34.652203" level="INFO">${kill_index_list} = [1, 2, 3]</msg>
<var>${kill_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:34.650581" elapsed="0.001646"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.653198" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:34.652823" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.653734" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:34.653382" elapsed="0.000379"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:34.653806" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:34.653959" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${original_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:34.652434" elapsed="0.001549"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.655625" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:34.655050" elapsed="0.000601"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.656152" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:34.655810" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:34.656221" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:54:34.656374" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:34.654685" elapsed="0.001714"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:34.657460" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:34.657186" elapsed="0.000300"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.658277" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:34.658123" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:34.661343" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:34.661060" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:34.661041" elapsed="0.000385"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.661726" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:34.661595" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.662488" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:34.662014" elapsed="0.000521"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.663149" level="INFO">${conn_id} = 255</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:34.662712" elapsed="0.000464"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:34.664410" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:54:34.664536" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:34.663848" elapsed="0.000893"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:34.664940" elapsed="0.000759"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:54:34.667778" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:54:35.302024" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:54:34 UTC 2026

  System load:  0.67               Processes:             124
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:54:15 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:54:34.667208" elapsed="0.635308"/>
</kw>
<msg time="2026-04-10T00:54:35.302859" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:34.665931" elapsed="0.637306"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:54:34.663395" elapsed="0.640063"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:54:35.303988" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh'.</msg>
<msg time="2026-04-10T00:54:35.326668" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:54:35.326931" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:54:35.327032" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:54:35.303720" elapsed="0.023364"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:35.327489" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:35.329143" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:35.328421" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:35.329765" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:35.329418" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:35.329367" elapsed="0.000562"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:54:35.330357" elapsed="0.000070"/>
</return>
<status status="PASS" start="2026-04-10T00:54:35.330047" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:35.330013" elapsed="0.000602"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:35.330702" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:35.349249" elapsed="0.000446"/>
</kw>
<msg time="2026-04-10T00:54:35.349799" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:35.348414" elapsed="0.001556"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:35.350193" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:35.350386" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:35.331370" elapsed="0.019101"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:54:34.660490" elapsed="0.690101"/>
</kw>
<msg time="2026-04-10T00:54:35.350646" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:34.659698" elapsed="0.690997"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:54:34.659138" elapsed="0.691638"/>
</kw>
<msg time="2026-04-10T00:54:35.350818" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:34.658574" elapsed="0.692290"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:35.354522" elapsed="0.000188"/>
</kw>
<msg time="2026-04-10T00:54:35.354753" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:35.354019" elapsed="0.000794"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:35.354972" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:35.355134" elapsed="0.000020"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:35.351168" elapsed="0.004046"/>
</kw>
<msg time="2026-04-10T00:54:35.355305" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:54:34.657718" elapsed="0.697612"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:35.355983" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:35.355530" elapsed="0.000496"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:54:35.356070" elapsed="0.000033"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:54:34.656787" elapsed="0.699413"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:34.656608" elapsed="0.699629"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:35.357215" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:35.356947" elapsed="0.000294"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:35.358020" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:35.357879" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:35.360830" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:35.360529" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:35.360510" elapsed="0.000400"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:35.361184" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:35.361058" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:35.361958" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:35.361461" elapsed="0.000584"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:35.362716" 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-04-10T00:54:35.362205" elapsed="0.000537"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:35.364154" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:54:35.364294" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:35.363590" elapsed="0.000729"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:35.364512" elapsed="0.000745"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:54:35.367588" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:54:36.044033" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:54:35 UTC 2026

  System load:  1.09               Processes:             125
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.169
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:54:15 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:54:35.366978" elapsed="0.677326"/>
</kw>
<msg time="2026-04-10T00:54:36.044441" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:35.365497" elapsed="0.679190"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:54:35.362961" elapsed="0.681931"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:54:36.045449" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh'.</msg>
<msg time="2026-04-10T00:54:36.068992" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:54:36.069366" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:54:36.069464" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:54:36.045158" elapsed="0.024360"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:36.070035" elapsed="0.000653"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:36.071826" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:36.071101" elapsed="0.000820"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:36.072375" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:36.072092" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:36.072044" 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-04-10T00:54:36.072980" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-04-10T00:54:36.072744" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:36.072707" elapsed="0.000464"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:36.073247" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:36.091849" elapsed="0.000399"/>
</kw>
<msg time="2026-04-10T00:54:36.092359" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:36.090948" elapsed="0.001573"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:36.093059" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:36.093225" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:36.073995" elapsed="0.019317"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:54:35.359998" elapsed="0.733411"/>
</kw>
<msg time="2026-04-10T00:54:36.093464" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:35.359388" elapsed="0.734126"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:54:35.358858" elapsed="0.734867"/>
</kw>
<msg time="2026-04-10T00:54:36.093770" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:35.358308" elapsed="0.735508"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:36.098970" elapsed="0.000188"/>
</kw>
<msg time="2026-04-10T00:54:36.099213" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:36.097941" elapsed="0.001350"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:36.099476" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:36.099662" elapsed="0.000021"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:36.094139" elapsed="0.005610"/>
</kw>
<msg time="2026-04-10T00:54:36.100009" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:54:35.357456" elapsed="0.742588"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:36.100524" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:36.100260" elapsed="0.000326"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:54:36.100634" elapsed="0.000034"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:54:35.356519" elapsed="0.744303"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:35.356333" elapsed="0.744532"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:36.101911" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:36.101638" elapsed="0.000298"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:36.102788" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:36.102632" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:36.105710" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:36.105362" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:36.105338" elapsed="0.000458"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:36.106084" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:36.105946" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:36.106877" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:36.106374" elapsed="0.000551"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:36.107524" level="INFO">${conn_id} = 257</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:36.107085" elapsed="0.000485"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:36.109045" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:54:36.109172" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:36.108247" elapsed="0.000949"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:36.109390" elapsed="0.000699"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:54:36.112211" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:54:36.739511" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:54:36 UTC 2026

  System load:  0.88               Processes:             125
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:54:15 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:54:36.111636" elapsed="0.628522"/>
</kw>
<msg time="2026-04-10T00:54:36.740440" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:36.110320" elapsed="0.630538"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:54:36.107793" elapsed="0.633440"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:54:36.742348" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh'.</msg>
<msg time="2026-04-10T00:54:36.765338" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:54:36.765779" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:54:36.765882" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:54:36.741783" elapsed="0.024153"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:36.766416" elapsed="0.000779"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:36.768768" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:36.767786" elapsed="0.001120"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:36.769593" elapsed="0.000059"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:36.769155" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:36.769082" elapsed="0.000737"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:54:36.770360" elapsed="0.000095"/>
</return>
<status status="PASS" start="2026-04-10T00:54:36.770005" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:36.769940" elapsed="0.000745"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:36.770895" elapsed="0.000049"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:36.790257" elapsed="0.000712"/>
</kw>
<msg time="2026-04-10T00:54:36.791079" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:36.789311" elapsed="0.001944"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:36.791462" elapsed="0.000031"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:36.791714" elapsed="0.000031"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:36.771652" elapsed="0.020180"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:54:36.104814" elapsed="0.687146"/>
</kw>
<msg time="2026-04-10T00:54:36.792039" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:36.104144" elapsed="0.687965"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:54:36.103612" elapsed="0.688607"/>
</kw>
<msg time="2026-04-10T00:54:36.792279" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:36.103077" elapsed="0.689268"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:36.796417" elapsed="0.000449"/>
</kw>
<msg time="2026-04-10T00:54:36.796914" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:36.795937" elapsed="0.001040"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:36.797139" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:36.797304" elapsed="0.000022"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:36.792862" elapsed="0.004524"/>
</kw>
<msg time="2026-04-10T00:54:36.797482" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:54:36.102152" elapsed="0.695356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:36.797996" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:36.797736" elapsed="0.000303"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:54:36.798087" elapsed="0.000034"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:54:36.101195" elapsed="0.697094"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:36.100992" elapsed="0.697336"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:34.656457" elapsed="2.141907"/>
</for>
<arg>command=${NODE_KILL_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:54:34.654188" elapsed="2.144237"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:36.799002" level="INFO">${updated_index_list} = [1, 2, 3]</msg>
<var>${updated_index_list}</var>
<arg>@{index_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:36.798607" elapsed="0.000423"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{kill_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:54:36.799188" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-10T00:54:36.799666" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:36.799531" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:36.799509" elapsed="0.000226"/>
</if>
<kw name="Sleep" owner="BuiltIn">
<msg time="2026-04-10T00:54:37.800442" level="INFO">Slept 1 second.</msg>
<msg time="2026-04-10T00:54:37.800696" level="INFO">Kill -9 closes open files, which may take longer than ssh overhead, but not long enough to warrant WUKS.</msg>
<arg>1s</arg>
<arg>Kill -9 closes open files, which may take longer than ssh overhead, but not long enough to warrant WUKS.</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="PASS" start="2026-04-10T00:54:36.799881" elapsed="1.001018"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Verify_Karaf_Is_Not_Running_On_Member" owner="ClusterManagement">
<kw name="Count_Running_Karafs_On_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:37.808098" level="INFO">${command} = ps axf | grep org.apache.karaf | grep -v grep | wc -l</msg>
<var>${command}</var>
<arg>${NODE_KARAF_COUNT_COMMAND}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:37.807416" elapsed="0.000743"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:37.809958" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:37.809387" elapsed="0.000623"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:37.811186" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:37.810975" elapsed="0.000368"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:37.815491" elapsed="0.000110"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:37.814618" elapsed="0.001088"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:37.814587" elapsed="0.001153"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:37.816093" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:37.815930" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:37.817774" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:37.816538" elapsed="0.001321"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:37.819022" level="INFO">${conn_id} = 258</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:37.818092" elapsed="0.000964"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:37.820971" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:54:37.821279" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:37.820283" elapsed="0.001114"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:37.821846" elapsed="0.000775"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:54:37.824185" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:54:38.174356" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:54:34 UTC 2026

  System load:  0.67               Processes:             124
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:54:35 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:54:37.823801" elapsed="0.350921"/>
</kw>
<msg time="2026-04-10T00:54:38.174874" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:37.822982" elapsed="0.351999"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:54:37.819400" elapsed="0.355741"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:54:38.175830" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-04-10T00:54:38.198712" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:54:38.199124" level="INFO">${stdout} = 0</msg>
<msg time="2026-04-10T00:54:38.199230" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:54:38.175403" elapsed="0.023881"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:38.199951" elapsed="0.000572"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:38.202322" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:38.201004" elapsed="0.001419"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:38.203162" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:38.202749" elapsed="0.000637"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:38.202697" elapsed="0.000729"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:54:38.203819" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:54:38.203508" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:38.203485" elapsed="0.000561"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:38.204100" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:38.210358" elapsed="0.000309"/>
</kw>
<msg time="2026-04-10T00:54:38.210766" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.208847" elapsed="0.002088"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:38.211371" elapsed="0.000058"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:38.211802" elapsed="0.000061"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:38.204628" elapsed="0.007394"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:54:37.813857" elapsed="0.398312"/>
</kw>
<msg time="2026-04-10T00:54:38.212241" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:37.812936" elapsed="0.399366"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:54:37.812232" elapsed="0.400156"/>
</kw>
<msg time="2026-04-10T00:54:38.212429" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:37.811569" elapsed="0.400906"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:38.216096" elapsed="0.000198"/>
</kw>
<msg time="2026-04-10T00:54:38.216339" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.215445" elapsed="0.000967"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:38.216636" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:38.216806" elapsed="0.000021"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:38.212836" elapsed="0.004053"/>
</kw>
<msg time="2026-04-10T00:54:38.216985" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:54:37.810410" elapsed="0.406600"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:38.217531" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:38.217218" elapsed="0.000378"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:54:38.217643" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:54:38.217873" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>command=${command}</arg>
<arg>member_index=${member_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:54:37.808615" elapsed="0.409285"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-04-10T00:54:38.217948" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:38.218101" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>member_index=${member_index}</arg>
<doc>Remotely execute grep for karaf process, return count as string.</doc>
<status status="PASS" start="2026-04-10T00:54:37.803227" elapsed="0.414900"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>0</arg>
<arg>${count}</arg>
<arg>Found running Karaf count: ${count}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-04-10T00:54:38.218291" elapsed="0.000485"/>
</kw>
<arg>member_index=${index}</arg>
<doc>Fail if non-zero karaf instances are counted on member of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:37.802396" elapsed="0.416451"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:37.801796" elapsed="0.417083"/>
</iter>
<iter>
<kw name="Verify_Karaf_Is_Not_Running_On_Member" owner="ClusterManagement">
<kw name="Count_Running_Karafs_On_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:38.220266" level="INFO">${command} = ps axf | grep org.apache.karaf | grep -v grep | wc -l</msg>
<var>${command}</var>
<arg>${NODE_KARAF_COUNT_COMMAND}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:38.219958" elapsed="0.000338"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:38.221274" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:38.221003" elapsed="0.000297"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:38.222463" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:38.222303" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:38.225944" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:38.225205" elapsed="0.000905"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:38.225182" elapsed="0.000959"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:38.226433" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:38.226297" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:38.227854" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:38.226825" elapsed="0.001094"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:38.228877" level="INFO">${conn_id} = 259</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:38.228098" elapsed="0.000806"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:38.230465" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:54:38.230795" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:38.229927" elapsed="0.000968"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.231199" elapsed="0.000648"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:54:38.233238" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:54:38.571878" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:54:35 UTC 2026

  System load:  1.09               Processes:             125
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.169
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:54:35 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:54:38.232879" elapsed="0.339152"/>
</kw>
<msg time="2026-04-10T00:54:38.572182" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.232153" elapsed="0.340138"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:54:38.229182" elapsed="0.343414"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:54:38.573298" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-04-10T00:54:38.596505" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:54:38.596802" level="INFO">${stdout} = 0</msg>
<msg time="2026-04-10T00:54:38.596850" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:54:38.572922" elapsed="0.023954"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:38.597201" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:38.598278" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:38.597726" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:38.598653" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:38.598430" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:38.598402" elapsed="0.000391"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:54:38.599007" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:54:38.598848" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:38.598833" elapsed="0.000330"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:38.599200" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:38.603402" elapsed="0.000233"/>
</kw>
<msg time="2026-04-10T00:54:38.603703" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.602339" elapsed="0.001481"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:38.604116" elapsed="0.000046"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:38.604467" elapsed="0.000065"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:38.599613" elapsed="0.005160"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:54:38.224592" elapsed="0.380321"/>
</kw>
<msg time="2026-04-10T00:54:38.604992" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.223887" elapsed="0.381186"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:54:38.223330" elapsed="0.381879"/>
</kw>
<msg time="2026-04-10T00:54:38.605283" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.222812" elapsed="0.382542"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:38.609915" elapsed="0.000178"/>
</kw>
<msg time="2026-04-10T00:54:38.610140" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.609315" elapsed="0.000888"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:38.610366" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:38.610531" elapsed="0.000099"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:38.605834" elapsed="0.004862"/>
</kw>
<msg time="2026-04-10T00:54:38.610802" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:54:38.221526" elapsed="0.389310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:38.611314" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:38.611053" elapsed="0.000305"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:54:38.611405" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:54:38.611611" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>command=${command}</arg>
<arg>member_index=${member_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:54:38.220499" elapsed="0.391137"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-04-10T00:54:38.611685" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:54:38.611916" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>member_index=${member_index}</arg>
<doc>Remotely execute grep for karaf process, return count as string.</doc>
<status status="PASS" start="2026-04-10T00:54:38.219598" elapsed="0.392344"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>0</arg>
<arg>${count}</arg>
<arg>Found running Karaf count: ${count}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-04-10T00:54:38.612106" elapsed="0.000360"/>
</kw>
<arg>member_index=${index}</arg>
<doc>Fail if non-zero karaf instances are counted on member of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:38.219164" elapsed="0.393368"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:38.218986" elapsed="0.393595"/>
</iter>
<iter>
<kw name="Verify_Karaf_Is_Not_Running_On_Member" owner="ClusterManagement">
<kw name="Count_Running_Karafs_On_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:54:38.613935" level="INFO">${command} = ps axf | grep org.apache.karaf | grep -v grep | wc -l</msg>
<var>${command}</var>
<arg>${NODE_KARAF_COUNT_COMMAND}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:54:38.613633" elapsed="0.000329"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:38.614916" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:38.614643" elapsed="0.000300"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:38.615778" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:38.615624" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:38.619666" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:38.618896" elapsed="0.000941"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:38.618871" elapsed="0.000997"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:38.620174" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:38.620027" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:38.621502" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:38.620540" elapsed="0.001043"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:38.622514" level="INFO">${conn_id} = 260</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:38.621764" elapsed="0.000778"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:38.624162" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:54:38.624424" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:38.623625" elapsed="0.000898"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.624840" elapsed="0.000608"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:54:38.626753" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:54:38.949401" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:54:36 UTC 2026

  System load:  0.88               Processes:             125
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:54:36 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:54:38.626410" elapsed="0.323205"/>
</kw>
<msg time="2026-04-10T00:54:38.949803" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.625771" elapsed="0.324177"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:54:38.622838" elapsed="0.327442"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:54:38.951163" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-04-10T00:54:38.974270" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:54:38.974592" level="INFO">${stdout} = 0</msg>
<msg time="2026-04-10T00:54:38.974647" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:54:38.950684" elapsed="0.023990"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:38.974997" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:38.976123" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:38.975537" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:38.976527" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:38.976276" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:38.976249" elapsed="0.000442"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:54:38.976910" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:54:38.976747" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:38.976731" elapsed="0.000371"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:38.977140" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:38.981502" elapsed="0.000180"/>
</kw>
<msg time="2026-04-10T00:54:38.981751" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.980572" elapsed="0.001296"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:38.982165" elapsed="0.000048"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:38.982492" elapsed="0.000045"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:38.977484" elapsed="0.005347"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:54:38.618242" elapsed="0.364716"/>
</kw>
<msg time="2026-04-10T00:54:38.983024" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.617528" elapsed="0.365551"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:54:38.616661" elapsed="0.366502"/>
</kw>
<msg time="2026-04-10T00:54:38.983206" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.616071" elapsed="0.367182"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:38.988729" elapsed="0.000259"/>
</kw>
<msg time="2026-04-10T00:54:38.989059" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.987795" elapsed="0.001361"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:38.989404" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:38.989607" elapsed="0.000023"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:38.983721" elapsed="0.005976"/>
</kw>
<msg time="2026-04-10T00:54:38.989792" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:54:38.615163" elapsed="0.374654"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:38.990282" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:38.990024" elapsed="0.000303"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:54:38.990377" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:54:38.990541" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>command=${command}</arg>
<arg>member_index=${member_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:54:38.614165" elapsed="0.376505"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-04-10T00:54:38.990719" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:54:38.990871" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>member_index=${member_index}</arg>
<doc>Remotely execute grep for karaf process, return count as string.</doc>
<status status="PASS" start="2026-04-10T00:54:38.613261" elapsed="0.377706"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>0</arg>
<arg>${count}</arg>
<arg>Found running Karaf count: ${count}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-04-10T00:54:38.991134" elapsed="0.000368"/>
</kw>
<arg>member_index=${index}</arg>
<doc>Fail if non-zero karaf instances are counted on member of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:38.612863" elapsed="0.378721"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:38.612686" elapsed="0.378932"/>
</iter>
<var>${index}</var>
<value>@{kill_index_list}</value>
<status status="PASS" start="2026-04-10T00:54:37.801147" elapsed="1.190507"/>
</for>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:38.994953" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:38.994534" elapsed="0.000446"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:38.995455" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:38.995146" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:38.995578" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:54:38.995777" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:38.994139" elapsed="0.001666"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:38.996926" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:38.996653" elapsed="0.000299"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:38.997747" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:38.997594" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:39.000925" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:39.000623" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:39.000600" elapsed="0.000412"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:39.001305" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:39.001163" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:39.002101" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:39.001615" elapsed="0.000534"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:39.002966" 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-04-10T00:54:39.002312" elapsed="0.000681"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:39.004223" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:54:39.004351" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:39.003685" elapsed="0.000691"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:39.004622" elapsed="0.000701"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:54:39.007732" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:54:39.320530" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:54:34 UTC 2026

  System load:  0.67               Processes:             124
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:54:38 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:54:39.007111" elapsed="0.313820"/>
</kw>
<msg time="2026-04-10T00:54:39.321061" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:39.005730" elapsed="0.315558"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:54:39.003221" elapsed="0.318242"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:54:39.321990" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:54:39.334661" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:54:39.335004" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:54:39.335103" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:54:39.321727" elapsed="0.013431"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:39.335696" elapsed="0.000548"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:39.337464" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:39.336691" elapsed="0.000929"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:39.338102" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:39.337814" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:39.337765" elapsed="0.000497"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:54:39.338540" elapsed="0.000072"/>
</return>
<status status="PASS" start="2026-04-10T00:54:39.338378" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:39.338345" elapsed="0.000388"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:39.338815" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:39.359278" elapsed="0.000557"/>
</kw>
<msg time="2026-04-10T00:54:39.359983" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:39.357834" elapsed="0.002376"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:39.360465" elapsed="0.000034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:39.361066" elapsed="0.000036"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:39.339318" elapsed="0.021928"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:54:38.999988" elapsed="0.361407"/>
</kw>
<msg time="2026-04-10T00:54:39.361482" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.999081" elapsed="0.362499"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:54:38.998529" elapsed="0.363174"/>
</kw>
<msg time="2026-04-10T00:54:39.361769" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:38.998029" elapsed="0.363813"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:39.367126" elapsed="0.000255"/>
</kw>
<msg time="2026-04-10T00:54:39.367457" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:39.366241" elapsed="0.001327"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:39.367807" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:39.368045" elapsed="0.000031"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:39.362304" elapsed="0.005865"/>
</kw>
<msg time="2026-04-10T00:54:39.368310" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:54:38.997169" elapsed="0.371181"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:39.369133" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:39.368743" elapsed="0.000452"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:54:39.369319" elapsed="0.000055"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:54:38.996182" elapsed="0.373471"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:38.996004" elapsed="0.373707"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:39.371148" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:39.370768" elapsed="0.000421"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:39.372314" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:39.372101" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:39.376426" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:39.375996" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:39.375963" elapsed="0.000614"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:39.376979" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:39.376771" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:39.378151" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:39.377435" elapsed="0.000784"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:39.379081" level="INFO">${conn_id} = 262</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:39.378441" elapsed="0.000679"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:39.380880" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:54:39.381045" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:39.380143" elapsed="0.000936"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:39.381379" elapsed="0.000906"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:54:39.385302" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:54:39.724181" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:54:35 UTC 2026

  System load:  1.09               Processes:             125
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.169
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:54:38 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:54:39.384383" elapsed="0.340032"/>
</kw>
<msg time="2026-04-10T00:54:39.724568" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:39.382629" elapsed="0.342115"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:54:39.379371" elapsed="0.345549"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:54:39.725423" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:54:39.738108" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:54:39.738348" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:54:39.738446" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:54:39.725163" elapsed="0.013335"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:39.738916" elapsed="0.000481"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:39.740534" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:39.739853" elapsed="0.000932"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:39.741272" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:39.740960" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:39.740911" elapsed="0.000528"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:54:39.741842" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-04-10T00:54:39.741594" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:39.741525" elapsed="0.000581"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:39.742191" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:39.758248" elapsed="0.000518"/>
</kw>
<msg time="2026-04-10T00:54:39.758856" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:39.757267" elapsed="0.001741"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:39.759174" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:39.759341" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:39.742776" elapsed="0.016648"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:54:39.375217" elapsed="0.384299"/>
</kw>
<msg time="2026-04-10T00:54:39.759585" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:39.374296" elapsed="0.385339"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:54:39.373518" elapsed="0.386195"/>
</kw>
<msg time="2026-04-10T00:54:39.759754" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:39.372743" elapsed="0.387056"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:39.763515" elapsed="0.000181"/>
</kw>
<msg time="2026-04-10T00:54:39.763739" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:39.763023" elapsed="0.000777"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:39.763959" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:39.764123" elapsed="0.000021"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:39.760098" elapsed="0.004107"/>
</kw>
<msg time="2026-04-10T00:54:39.764296" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:54:39.371501" elapsed="0.392820"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:39.764783" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:39.764515" elapsed="0.000310"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:54:39.764868" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:54:39.370145" elapsed="0.394850"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:39.369860" elapsed="0.395172"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:39.766214" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:39.765910" elapsed="0.000331"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:39.767017" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:39.766880" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:39.769879" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:39.769605" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:39.769585" elapsed="0.000374"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:39.770259" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:39.770132" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:39.771026" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:39.770541" elapsed="0.000533"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:39.771676" level="INFO">${conn_id} = 263</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:39.771233" elapsed="0.000471"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:54:39.772892" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:54:39.773018" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:54:39.772354" elapsed="0.000688"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:39.773230" elapsed="0.000666"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:54:39.776000" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:54:40.096571" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:54:36 UTC 2026

  System load:  0.88               Processes:             125
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:54:38 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:54:39.775428" elapsed="0.321369"/>
</kw>
<msg time="2026-04-10T00:54:40.096926" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:39.774157" elapsed="0.322939"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:54:39.771922" elapsed="0.325347"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:54:40.097788" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:54:40.110124" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:54:40.110288" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:54:40.110353" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:54:40.097509" elapsed="0.012879"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:40.110665" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:40.111938" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:40.111302" elapsed="0.000735"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:40.112475" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:40.112200" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:40.112157" elapsed="0.000708"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:54:40.113212" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-10T00:54:40.112981" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:40.112948" elapsed="0.000447"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:54:40.113470" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:40.130005" elapsed="0.000390"/>
</kw>
<msg time="2026-04-10T00:54:40.130487" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:40.129107" elapsed="0.001551"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:40.130907" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:40.131110" elapsed="0.000022"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:40.114177" elapsed="0.017023"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:54:39.769038" elapsed="0.362253"/>
</kw>
<msg time="2026-04-10T00:54:40.131345" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:39.768442" elapsed="0.362951"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:54:39.767856" elapsed="0.363617"/>
</kw>
<msg time="2026-04-10T00:54:40.131516" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:39.767328" elapsed="0.364249"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:40.135148" elapsed="0.000163"/>
</kw>
<msg time="2026-04-10T00:54:40.135354" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:40.134593" elapsed="0.000821"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:40.135589" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:40.135754" elapsed="0.000020"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:40.131879" elapsed="0.003956"/>
</kw>
<msg time="2026-04-10T00:54:40.135925" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:54:39.766457" elapsed="0.369494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:40.136401" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:40.136150" elapsed="0.000294"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:54:40.136489" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:54:39.765311" elapsed="0.371352"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:54:39.765127" elapsed="0.371574"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:38.995867" elapsed="1.140870"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:54:38.991885" elapsed="1.144912"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-10T00:54:40.136840" elapsed="0.000027"/>
</return>
<doc>If the list is empty, kill all ODL instances. Otherwise, kill members based on ${kill_index_list}
If ${confirm} is True, sleep 1 second and verify killed instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-04-10T00:54:34.646433" elapsed="5.490538"/>
</kw>
<doc>Kill All Nodes.</doc>
<status status="PASS" start="2026-04-10T00:54:34.262967" elapsed="5.874120"/>
</test>
<test id="s1-s3-t8" name="Stop Mininet Connected To Follower Node1 and Exit" line="84">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:54:40.140764" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:54:40.140428" elapsed="0.000602"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:40.142052" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:40.141941" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:40.141922" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:40.147150" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:40.147043" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:40.147025" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:54:40.148222" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:54:40.147840" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:54:40.148747" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:54:40.148413" elapsed="0.000399"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:54:40.148860" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:40.149020" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:54:40.147445" elapsed="0.001601"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:40.154437" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:40.154329" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:40.154311" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:40.155717" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:40.155610" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:40.155591" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:40.156231" level="INFO">${karaf_connection_index} = 232</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:40.155934" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:40.156932" level="INFO">${current_connection_index} = 254</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:40.156684" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:40.159341" level="FAIL">OSError: Socket is closed</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:54:40.157465" elapsed="0.002448">OSError: Socket is closed</status>
</kw>
<msg time="2026-04-10T00:54:40.160108" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:54:40.160155" level="INFO">${message_write} = OSError: Socket is closed</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:40.157121" elapsed="0.003058"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:54:50.161421" level="FAIL">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:54:40.160726" elapsed="10.001591">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</status>
</kw>
<msg time="2026-04-10T00:54:50.162636" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:54:50.162696" level="INFO">${message_wait} = No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:40.160353" elapsed="10.002368"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:54:50.163925" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and Exit"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:54:50.163188" elapsed="0.000805">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and Exit"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:54:50.162853" elapsed="0.001213">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and Exit"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:54:50.162814" elapsed="0.001287">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and Exit"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:50.164273" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:50.164527" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:50.164381" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:54:50.164363" elapsed="0.000257"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:54:50.164663" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:50.167383" elapsed="0.000201"/>
</kw>
<msg time="2026-04-10T00:54:50.167658" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:50.166263" elapsed="0.001526"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:50.168066" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:50.168441" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:50.165583" elapsed="0.003070"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:50.164985" elapsed="0.003878"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:54:40.155284" elapsed="10.013673">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and Exit"</status>
</kw>
<msg time="2026-04-10T00:54:50.169066" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:54:50.169112" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:40.154677" elapsed="10.014460"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:50.169326" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:50.169216" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:50.169197" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:50.170217" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:50.170113" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:50.170096" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:50.170656" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:50.170441" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:50.171229" level="INFO">{1: 232, 2: 234, 3: 236}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:50.170952" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:54:50.171699" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:54:50.171434" elapsed="0.000310"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:50.172270" elapsed="0.000299"/>
</kw>
<msg time="2026-04-10T00:54:50.172673" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:54:50.172720" level="INFO">${old_connection_index} = 232</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:50.171908" elapsed="0.000835"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:50.173572" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:50.174909" level="FAIL">OSError: Socket is closed</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:54:50.174436" elapsed="0.001450">OSError: Socket is closed</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:50.173964" elapsed="0.002022"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:54:50.176694" elapsed="0.000354"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:50.176163" elapsed="0.000970"/>
</kw>
<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="PASS" start="2026-04-10T00:54:50.173046" elapsed="0.004134"/>
</kw>
<status status="PASS" start="2026-04-10T00:54:50.172821" elapsed="0.004410"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:50.172802" elapsed="0.004455"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:50.178128" level="INFO">${ip_address} = 10.30.170.165</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:50.177817" elapsed="0.000339"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:54:50.178205" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:54:50.178359" level="INFO">${odl_ip} = 10.30.170.165</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:54:50.177466" elapsed="0.000919"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:54:50.178606" elapsed="0.000427"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:50.179335" level="INFO">index=264
host=10.30.170.165
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:54:50.179208" elapsed="0.000293"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:54:50.179694" elapsed="0.002391"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:54:50.182515" level="INFO">Logging into '10.30.170.165:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:54:50.184851" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.165</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="FAIL" start="2026-04-10T00:54:50.182257" elapsed="0.003120">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.165</status>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:50.202136" elapsed="0.000418"/>
</kw>
<msg time="2026-04-10T00:54:50.202648" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:54:50.200776" elapsed="0.002020"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:50.202963" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:50.203128" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:54:50.186522" elapsed="0.016691"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:54:50.185801" elapsed="0.017458"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:54:50.169818" elapsed="0.033526">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.165</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:50.203721" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:54:50.203799" 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="FAIL" start="2026-04-10T00:54:40.153990" elapsed="10.049917">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.165</status>
</kw>
<msg time="2026-04-10T00:54:50.204015" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:54:50.204059" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.165</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:40.149419" elapsed="10.054662"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:54:50.204456" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:54:50.204162" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:50.204143" elapsed="0.000391"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:54:40.149272" elapsed="10.055330"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:50.210442" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:50.210333" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:50.210299" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:54:50.211676" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:54:50.211566" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:54:50.211533" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:54:50.212195" level="INFO">${karaf_connection_index} = 234</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:54:50.211894" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:54:50.212772" level="INFO">${current_connection_index} = 254</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:54:50.212423" elapsed="0.000375"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:54:50.213580" level="FAIL">OSError: Socket is closed</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:54:50.213303" elapsed="0.000750">OSError: Socket is closed</status>
</kw>
<msg time="2026-04-10T00:54:50.214236" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:54:50.214281" level="INFO">${message_write} = OSError: Socket is closed</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:50.212962" elapsed="0.001342"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:55:00.215578" level="FAIL">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:54:50.214837" elapsed="10.001809">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</status>
</kw>
<msg time="2026-04-10T00:55:00.216917" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:55:00.216968" level="INFO">${message_wait} = No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:50.214474" elapsed="10.002521"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:55:00.218196" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and Exit"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:55:00.217475" elapsed="0.000789">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and Exit"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:55:00.217137" elapsed="0.001198">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and Exit"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:55:00.217099" elapsed="0.001274">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and Exit"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:00.218563" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:00.218821" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:00.218658" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:00.218639" elapsed="0.000261"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:55:00.218947" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:00.221620" elapsed="0.000171"/>
</kw>
<msg time="2026-04-10T00:55:00.221859" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:00.220566" elapsed="0.001425"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:00.222270" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:00.222623" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:00.219890" elapsed="0.002957"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:00.219273" elapsed="0.003645"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:54:50.211247" elapsed="10.011777">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and Exit"</status>
</kw>
<msg time="2026-04-10T00:55:00.223146" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:55:00.223192" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:50.210684" elapsed="10.012533"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:00.223408" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:00.223298" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:00.223278" elapsed="0.000197"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:00.224705" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:00.224595" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:00.224575" elapsed="0.000200"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:00.225082" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:00.224935" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:00.225692" level="INFO">{1: 264, 2: 234, 3: 236}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:00.225374" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:00.226146" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:00.225897" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:00.226836" elapsed="0.000311"/>
</kw>
<msg time="2026-04-10T00:55:00.227248" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:00.227295" level="INFO">${old_connection_index} = 234</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:00.226352" elapsed="0.000966"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:00.228151" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:00.229445" level="FAIL">OSError: Socket is closed</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:55:00.229033" elapsed="0.001259">OSError: Socket is closed</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:00.228533" elapsed="0.001858"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:00.231063" elapsed="0.000349"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:00.230581" elapsed="0.000915"/>
</kw>
<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="PASS" start="2026-04-10T00:55:00.227638" elapsed="0.003923"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:00.227396" elapsed="0.004216"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:00.227378" elapsed="0.004260"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:00.232486" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:00.232179" elapsed="0.000334"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:55:00.232588" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:55:00.232743" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:00.231848" elapsed="0.000920"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:00.232926" elapsed="0.000422"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:00.233676" level="INFO">index=265
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:00.233521" elapsed="0.000282"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:55:00.233954" elapsed="0.002447"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:55:00.236864" level="INFO">Logging into '10.30.170.169:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:55:00.238788" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</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="FAIL" start="2026-04-10T00:55:00.236602" elapsed="0.002571">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:00.253107" elapsed="0.000410"/>
</kw>
<msg time="2026-04-10T00:55:00.253626" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:00.251492" elapsed="0.002287"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:00.253944" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:00.254109" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:00.240009" elapsed="0.014183"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:00.239456" elapsed="0.014783"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:55:00.224037" elapsed="0.030286">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:00.254721" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:00.254848" 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="FAIL" start="2026-04-10T00:54:50.209974" elapsed="10.044989">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<msg time="2026-04-10T00:55:00.255076" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:55:00.255120" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:50.204882" elapsed="10.050262"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:00.255487" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:00.255227" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:00.255208" elapsed="0.000373"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:54:50.204736" elapsed="10.050871"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:00.261472" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:00.261363" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:00.261343" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:00.262754" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:00.262646" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:00.262627" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:00.263288" level="INFO">${karaf_connection_index} = 236</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:00.262976" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:00.263732" level="INFO">${current_connection_index} = 254</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:00.263480" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:00.264646" level="FAIL">OSError: Socket is closed</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:55:00.264269" elapsed="0.000886">OSError: Socket is closed</status>
</kw>
<msg time="2026-04-10T00:55:00.265338" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:55:00.265384" level="INFO">${message_write} = OSError: Socket is closed</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:00.263923" elapsed="0.001485"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:55:10.266334" level="FAIL">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:55:00.265940" elapsed="10.001169">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</status>
</kw>
<msg time="2026-04-10T00:55:10.267354" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:55:10.267404" level="INFO">${message_wait} = No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:00.265594" elapsed="10.001836"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:55:10.268639" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and Exit"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:55:10.267920" elapsed="0.000787">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and Exit"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:55:10.267540" elapsed="0.001241">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and Exit"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:55:10.267510" elapsed="0.001632">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and Exit"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:10.269319" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:10.269575" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:10.269412" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:10.269395" elapsed="0.000259"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:55:10.269691" elapsed="0.000017"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:10.272390" elapsed="0.000189"/>
</kw>
<msg time="2026-04-10T00:55:10.272648" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:10.271247" elapsed="0.001602"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:10.273166" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:10.273531" 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-04-10T00:55:10.270601" elapsed="0.003139"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:10.269999" elapsed="0.003808"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:55:00.262315" elapsed="10.011580">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and Exit"</status>
</kw>
<msg time="2026-04-10T00:55:10.274003" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:55:10.274049" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node1 and ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:00.261715" elapsed="10.012358"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:10.274275" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:10.274153" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:10.274134" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:10.275182" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:10.275076" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:10.275059" elapsed="0.000190"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:10.275614" level="INFO">index=254
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:10.275403" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:10.276211" level="INFO">{1: 264, 2: 265, 3: 236}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:10.275936" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:10.276680" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:10.276414" elapsed="0.000312"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:10.277296" elapsed="0.000286"/>
</kw>
<msg time="2026-04-10T00:55:10.277685" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:10.277731" level="INFO">${old_connection_index} = 236</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:10.276890" elapsed="0.000864"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:10.278654" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:10.280028" level="FAIL">OSError: Socket is closed</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:55:10.279521" elapsed="0.001280">OSError: Socket is closed</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:10.279043" elapsed="0.001855"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:10.281583" elapsed="0.000335"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:10.281091" elapsed="0.000911"/>
</kw>
<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="PASS" start="2026-04-10T00:55:10.278126" elapsed="0.003922"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:10.277867" elapsed="0.004232"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:10.277837" elapsed="0.004287"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:10.283001" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:10.282688" elapsed="0.000339"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:55:10.283075" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:55:10.283231" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:10.282336" elapsed="0.000920"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:10.283455" elapsed="0.000490"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:10.284249" level="INFO">index=266
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:10.284121" elapsed="0.000259"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:55:10.284534" elapsed="0.002643"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:55:10.287636" level="INFO">Logging into '10.30.171.151:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:55:10.289826" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</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="FAIL" start="2026-04-10T00:55:10.287355" elapsed="0.002858">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:10.304029" elapsed="0.000455"/>
</kw>
<msg time="2026-04-10T00:55:10.304593" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:10.302427" elapsed="0.002319"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:10.304959" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:10.305133" elapsed="0.000020"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:10.291052" elapsed="0.014166"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:10.290501" elapsed="0.014764"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:55:10.274777" elapsed="0.030573">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:10.305767" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:10.305846" 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="FAIL" start="2026-04-10T00:55:00.261003" elapsed="10.044954">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<msg time="2026-04-10T00:55:10.306067" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:55:10.306112" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:00.255889" elapsed="10.050246"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:10.306478" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:10.306216" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:10.306198" elapsed="0.000404"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:55:00.255743" elapsed="10.050885"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:54:40.149100" elapsed="30.157562"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:54:40.146668" elapsed="30.160056"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:54:40.141648" elapsed="30.165137"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:54:40.141186" elapsed="30.165645"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:54:40.138040" elapsed="30.168845"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:10.312226" elapsed="0.000159"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:10.311999" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:10.311981" elapsed="0.000468"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:10.315564" level="INFO">exit</msg>
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:55:10.312657" elapsed="0.002965"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:55:10.423683" level="INFO">*** Stopping 1 controllers
c0 
*** Stopping 2 links
..
*** Stopping 1 switches
s1 
*** Stopping 2 hosts
h1 h2 
*** Done
completed in 43.443 seconds
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:55:10.315784" elapsed="0.108033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:10.424067" elapsed="0.000191"/>
</kw>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="PASS" start="2026-04-10T00:55:10.311718" elapsed="0.112608"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:10.427153" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:10.426836" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:10.426811" elapsed="0.000427"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:10.427560" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:10.427393" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:10.428245" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:10.427857" elapsed="0.000435"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:10.428891" level="INFO">${conn_id} = 267</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:10.428495" elapsed="0.000423"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:55:10.430102" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:55:10.430183" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:55:10.429818" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:10.430372" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:55:10.431584" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:55:11.023391" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:55:10 UTC 2026

  System load:  0.0                Processes:             109
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:54:26 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:55:10.431251" elapsed="0.592406"/>
</kw>
<msg time="2026-04-10T00:55:11.023811" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:10.430892" elapsed="0.593060"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:55:10.429141" elapsed="0.595025"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:55:11.025095" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:55:12.211632" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:55:12.212078" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:55:12.212208" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:55:11.024647" elapsed="1.187622"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.212838" elapsed="0.000653"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.214753" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:12.214015" elapsed="0.001084"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.215693" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.215340" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.215280" elapsed="0.000633"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:55:12.216363" elapsed="0.000073"/>
</return>
<status status="PASS" start="2026-04-10T00:55:12.216060" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.216022" elapsed="0.000589"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.216696" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:12.221828" elapsed="0.000519"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.222631" elapsed="0.000257"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.223135" elapsed="0.000152"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:12.217512" elapsed="0.005877"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:55:10.426262" elapsed="1.797302"/>
</kw>
<msg time="2026-04-10T00:55:12.223648" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:10.425630" elapsed="1.798093"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:55:10.425096" elapsed="1.798744"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:12.227002" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:12.226592" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.226563" elapsed="0.000569"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.227614" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.227372" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.228653" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:12.228018" elapsed="0.000704"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.229853" level="INFO">${conn_id} = 269</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.228948" elapsed="0.000943"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.231325" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:55:12.231410" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:55:12.230914" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:12.231635" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.232889" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:55:12.555800" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:55:10 UTC 2026

  System load:  0.0                Processes:             109
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:55:10 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:55:12.232540" elapsed="0.323494"/>
</kw>
<msg time="2026-04-10T00:55:12.556308" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:12.232141" elapsed="0.324307"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:55:12.230226" elapsed="0.326467"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.557587" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:55:12.590659" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:55:12.590905" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:55:12.591000" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:55:12.557129" elapsed="0.033920"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.591426" elapsed="0.000486"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.592966" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:12.592331" elapsed="0.000727"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.593510" elapsed="0.000069"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.593228" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.593183" elapsed="0.000518"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:55:12.594118" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-10T00:55:12.593882" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.593844" elapsed="0.000443"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.594339" elapsed="0.000021"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:12.598773" 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-04-10T00:55:12.599486" elapsed="0.000252"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.599959" elapsed="0.000140"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:12.594836" elapsed="0.005338"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:55:12.225759" elapsed="0.374549"/>
</kw>
<msg time="2026-04-10T00:55:12.600388" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:12.224887" elapsed="0.375571"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:55:12.224115" elapsed="0.376478"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:10.424674" elapsed="2.176007"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="PASS" start="2026-04-10T00:54:40.137471" elapsed="32.463361"/>
</test>
<test id="s1-s3-t9" name="Restart All Cluster Nodes" line="89">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:55:12.605610" elapsed="0.000360"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:55:12.605196" elapsed="0.000856"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.607133" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.607023" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.607005" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.612154" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.612049" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.612031" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.613224" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:12.612842" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.613752" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:55:12.613417" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:55:12.613823" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:12.613978" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:55:12.612450" elapsed="0.001553"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.619923" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.619811" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.619791" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.621191" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.621086" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.621069" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:12.621766" level="INFO">${karaf_connection_index} = 264</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.621406" elapsed="0.000388"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.622178" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:12.621957" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.622987" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.622721" elapsed="0.000942">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:55:12.623854" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:55:12.623900" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.622365" elapsed="0.001559"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.624697" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.624437" elapsed="0.000896">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:55:12.625517" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:55:12.625579" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.624096" elapsed="0.001508"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.626532" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.625925" elapsed="0.000696">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:55:12.625703" elapsed="0.000989">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:55:12.625684" elapsed="0.001040">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:12.626888" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:12.627118" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:12.626976" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:12.626958" elapsed="0.000236"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.627226" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:12.628682" elapsed="0.000768"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.629784" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.630516" elapsed="0.000464"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:12.628051" elapsed="0.003030"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:12.627500" elapsed="0.003644"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.620787" elapsed="0.010443">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</status>
</kw>
<msg time="2026-04-10T00:55:12.631334" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:55:12.631378" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.620152" elapsed="0.011251"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.631664" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.631536" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.631517" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.632528" elapsed="0.000243"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.632424" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.632407" elapsed="0.000420"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.633122" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.632983" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.633811" level="INFO">{1: 264, 2: 265, 3: 266}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:12.633406" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.634259" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:12.634013" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.634911" elapsed="0.000264"/>
</kw>
<msg time="2026-04-10T00:55:12.635274" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:12.635321" level="INFO">${old_connection_index} = 264</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.634477" elapsed="0.000867"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:12.636164" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.637798" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.637354" elapsed="0.001303">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.636527" elapsed="0.002228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.639388" elapsed="0.000297"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.638930" elapsed="0.000838"/>
</kw>
<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="PASS" start="2026-04-10T00:55:12.635664" elapsed="0.004149"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:12.635420" elapsed="0.004442"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.635402" elapsed="0.004485"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:12.640762" level="INFO">${ip_address} = 10.30.170.165</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.640420" elapsed="0.000368"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:55:12.640835" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:12.640987" level="INFO">${odl_ip} = 10.30.170.165</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:12.640092" elapsed="0.000919"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.641165" elapsed="0.000453"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.641919" level="INFO">index=272
host=10.30.170.165
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.641792" elapsed="0.000252"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.642193" elapsed="0.002270"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.644906" level="INFO">Logging into '10.30.170.165:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:55:12.647413" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.165</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="FAIL" start="2026-04-10T00:55:12.644647" elapsed="0.003163">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.165</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:12.664673" elapsed="0.000686"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.665659" elapsed="0.000212"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.666081" elapsed="0.000135"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:12.648655" elapsed="0.017634"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:12.648122" elapsed="0.018212"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.632129" elapsed="0.034289">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.165</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:12.666771" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.666846" 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="FAIL" start="2026-04-10T00:55:12.619432" elapsed="0.047519">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.165</status>
</kw>
<msg time="2026-04-10T00:55:12.667056" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:55:12.667100" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.165</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.614435" elapsed="0.052687"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:12.667450" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:12.667198" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.667181" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:55:12.614289" elapsed="0.053281"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.673336" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.673227" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.673208" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.674576" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.674454" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.674436" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:12.675086" level="INFO">${karaf_connection_index} = 265</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.674792" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.675483" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:12.675269" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.676256" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.676018" elapsed="0.000854">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:55:12.677053" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:55:12.677098" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.675685" elapsed="0.001437"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.677912" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.677675" elapsed="0.000852">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:55:12.678724" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:55:12.678770" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.677290" elapsed="0.001504"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.679704" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.679090" elapsed="0.000677">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:55:12.678868" elapsed="0.001004">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:55:12.678848" elapsed="0.001057">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:12.680067" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:12.680292" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:12.680153" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:12.680136" elapsed="0.000230"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.680398" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:12.730938" elapsed="0.000895"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.732135" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.732900" elapsed="0.000357"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:12.681205" elapsed="0.052169"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:12.680675" elapsed="0.052765"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.674155" elapsed="0.059404">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</status>
</kw>
<msg time="2026-04-10T00:55:12.733673" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:55:12.733720" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.673594" elapsed="0.060150"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.733950" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.733834" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.733811" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.734862" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.734756" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.734738" elapsed="0.000192"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.735225" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.735082" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.735809" level="INFO">{1: 272, 2: 265, 3: 266}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:12.735510" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.736252" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:12.736008" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.736845" elapsed="0.000262"/>
</kw>
<msg time="2026-04-10T00:55:12.737206" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:12.737253" level="INFO">${old_connection_index} = 265</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.736457" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:12.738139" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.739405" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.738997" elapsed="0.001385">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.738503" elapsed="0.001978"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.741136" elapsed="0.000296"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.740669" elapsed="0.000920"/>
</kw>
<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="PASS" start="2026-04-10T00:55:12.737625" elapsed="0.004012"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:12.737385" elapsed="0.004302"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.737366" elapsed="0.004347"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:12.742568" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.742247" elapsed="0.000349"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:55:12.742644" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:55:12.742800" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:12.741921" elapsed="0.000904"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.742980" elapsed="0.000400"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.743738" level="INFO">index=275
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.743608" elapsed="0.000259"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.744018" elapsed="0.002457"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.746919" level="INFO">Logging into '10.30.170.169:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:55:12.749225" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</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="FAIL" start="2026-04-10T00:55:12.746658" elapsed="0.002985">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:12.762801" 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-04-10T00:55:12.764155" elapsed="0.000217"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.764604" elapsed="0.000141"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:12.750436" elapsed="0.014383"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:12.749923" elapsed="0.014960"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.734441" elapsed="0.030565">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:12.765523" elapsed="0.000059"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.765652" elapsed="0.000028"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.672887" elapsed="0.092922">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</status>
</kw>
<msg time="2026-04-10T00:55:12.765963" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:55:12.766025" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.170.169</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.667842" elapsed="0.098216"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:12.766527" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:12.766170" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.766145" elapsed="0.000516"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:55:12.667699" elapsed="0.098996"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.773558" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.773435" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.773416" 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-04-10T00:55:12.774870" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.774763" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.774745" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:12.775383" level="INFO">${karaf_connection_index} = 266</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.775083" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.775874" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:12.775593" elapsed="0.000309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.776677" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.776411" elapsed="0.000903">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:55:12.777495" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:55:12.777556" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.776067" elapsed="0.001515"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.778491" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.778089" elapsed="0.001053">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:55:12.779329" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:55:12.779374" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.777750" elapsed="0.001648"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.780319" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.779719" elapsed="0.000663">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:55:12.779476" elapsed="0.000973">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:55:12.779456" elapsed="0.001026">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:12.780662" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:12.780891" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:12.780750" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:12.780733" elapsed="0.000233"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.780999" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:12.782460" elapsed="0.000761"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.783498" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.784223" elapsed="0.000359"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:12.781856" elapsed="0.002824"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:12.781300" elapsed="0.003440"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.774433" elapsed="0.010391">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</status>
</kw>
<msg time="2026-04-10T00:55:12.784925" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:55:12.784969" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart All Cluster Nodes"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.773860" elapsed="0.011133"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.785174" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.785069" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.785051" elapsed="0.000238"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.786107" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:12.786003" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.785986" elapsed="0.000187"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.786458" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.786321" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.787012" level="INFO">{1: 272, 2: 275, 3: 266}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:12.786753" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.787447" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:12.787207" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.788050" elapsed="0.000256"/>
</kw>
<msg time="2026-04-10T00:55:12.788404" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:12.788449" level="INFO">${old_connection_index} = 266</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.787691" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:12.789340" elapsed="0.000193"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.790607" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.790201" elapsed="0.001219">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.789730" elapsed="0.001786"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.792258" elapsed="0.000264"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.791805" elapsed="0.000813"/>
</kw>
<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="PASS" start="2026-04-10T00:55:12.788812" elapsed="0.003851"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:12.788590" elapsed="0.004122"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.788528" elapsed="0.004209"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:12.793668" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.793341" elapsed="0.000354"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:55:12.793741" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:55:12.793894" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:12.792941" elapsed="0.000978"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.794070" elapsed="0.000576"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.794940" level="INFO">index=278
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.794815" elapsed="0.000250"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.795212" elapsed="0.002231"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.797885" level="INFO">Logging into '10.30.171.151:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:55:12.798974" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</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="FAIL" start="2026-04-10T00:55:12.797625" elapsed="0.001720">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:12.811245" elapsed="0.000733"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.812142" elapsed="0.000182"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.812474" elapsed="0.000113"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:12.800199" elapsed="0.012441"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:12.799693" elapsed="0.012991"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:55:12.785711" elapsed="0.027053">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:12.813095" elapsed="0.000041"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:12.813184" 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="FAIL" start="2026-04-10T00:55:12.773061" elapsed="0.040229">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<msg time="2026-04-10T00:55:12.813395" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:55:12.813438" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.767079" elapsed="0.046382"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:12.813806" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:12.813554" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.813521" elapsed="0.000364"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:55:12.766876" elapsed="0.047032"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:55:12.614108" elapsed="0.199832"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:55:12.611690" elapsed="0.202308"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:55:12.606731" elapsed="0.207324"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:12.606278" elapsed="0.207822"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:55:12.602038" elapsed="0.212116"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.827063" level="INFO">${base_command} = /tmp/karaf-0.23.1/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:12.826644" elapsed="0.000448"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.827640" level="INFO">${command} = /tmp/karaf-0.23.1/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:12.827265" elapsed="0.000402"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-10T00:55:12.828102" level="INFO">${epoch} = 1775782512.828027</msg>
<var>${epoch}</var>
<arg>time_zone=UTC</arg>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-10T00:55:12.827832" elapsed="0.000296"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.828706" level="INFO">${gc_filepath} = /tmp/karaf-0.23.1/data/log/gc_1775782512.828027.log</msg>
<var>${gc_filepath}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/data/log/gc_${epoch}.log</arg>
<arg>${GC_LOG_PATH}/gc_${epoch}.log</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:12.828296" elapsed="0.000437"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.829310" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782512.828027.log</msg>
<var>${gc_options}</var>
<arg>"docker" not in """${node_start_command}"""</arg>
<arg>-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${gc_filepath}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:12.828902" elapsed="0.000435"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.830863" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:12.830473" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.831349" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:55:12.831049" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:55:12.831419" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:55:12.831596" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:55:12.830105" elapsed="0.001516"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:12.832732" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.832451" elapsed="0.000307"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.833750" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.833404" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:12.836538" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:12.836256" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:12.836236" elapsed="0.000400"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.836910" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:12.836783" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.837692" level="INFO">Attempting to execute command "/tmp/karaf-0.23.1/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782512.828027.log" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:12.837210" elapsed="0.000530"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.838307" level="INFO">${conn_id} = 280</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:12.837898" elapsed="0.000434"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:55:12.839610" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:55:12.839738" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:55:12.839059" elapsed="0.000704"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:12.839951" elapsed="0.000671"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:55:12.842733" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:55:13.281957" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:54:34 UTC 2026

  System load:  0.67               Processes:             124
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:54:39 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:55:12.842159" elapsed="0.440030"/>
</kw>
<msg time="2026-04-10T00:55:13.282318" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:12.840854" elapsed="0.441637"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:55:12.838564" elapsed="0.444124"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:55:13.283196" level="INFO">Executing command '/tmp/karaf-0.23.1/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782512.828027.log'.</msg>
<msg time="2026-04-10T00:55:13.306578" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:55:13.306828" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:55:13.306927" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:55:13.282929" elapsed="0.024048"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:13.307351" elapsed="0.000529"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:13.309131" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:13.308406" elapsed="0.000822"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:13.309804" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:13.309409" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:13.309360" elapsed="0.000613"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:55:13.310333" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-10T00:55:13.310092" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:13.310058" elapsed="0.000460"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:13.310633" elapsed="0.000034"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:13.327146" elapsed="0.000522"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:13.327858" elapsed="0.000163"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:13.328171" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:13.311333" elapsed="0.016990"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:55:12.835722" elapsed="0.492694"/>
</kw>
<msg time="2026-04-10T00:55:13.328468" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:12.835107" elapsed="0.493412"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:55:12.834571" elapsed="0.494052"/>
</kw>
<msg time="2026-04-10T00:55:13.328664" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:12.834042" elapsed="0.494667"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:13.331582" elapsed="0.000323"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:13.332068" elapsed="0.000145"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:13.332362" elapsed="0.000095"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:13.328998" elapsed="0.003511"/>
</kw>
<msg time="2026-04-10T00:55:13.332617" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:55:12.832975" elapsed="0.499668"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:13.333073" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:13.332827" elapsed="0.000287"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:55:13.333156" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:55:12.832050" elapsed="0.501234"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:55:12.831870" elapsed="0.501451"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:13.334286" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:13.334019" elapsed="0.000292"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:13.335286" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:13.335150" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:13.338055" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:13.337785" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:13.337767" elapsed="0.000408"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:13.338456" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:13.338329" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:13.339247" level="INFO">Attempting to execute command "/tmp/karaf-0.23.1/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782512.828027.log" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:13.338778" elapsed="0.000519"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:13.340081" level="INFO">${conn_id} = 283</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:13.339457" elapsed="0.000652"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:55:13.341301" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:55:13.341428" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:55:13.340781" elapsed="0.000672"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:13.341800" elapsed="0.000655"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:55:13.344607" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:55:13.787174" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:54:35 UTC 2026

  System load:  1.09               Processes:             125
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.170.169
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:54:39 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:55:13.344000" elapsed="0.443527"/>
</kw>
<msg time="2026-04-10T00:55:13.787777" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:13.342697" elapsed="0.445336"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:55:13.340330" elapsed="0.447956"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:55:13.789078" level="INFO">Executing command '/tmp/karaf-0.23.1/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782512.828027.log'.</msg>
<msg time="2026-04-10T00:55:13.812738" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:55:13.813194" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:55:13.813297" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:55:13.788691" elapsed="0.024661"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:13.813924" elapsed="0.000783"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:13.815995" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:13.815159" elapsed="0.000928"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:13.816676" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:13.816295" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:13.816230" elapsed="0.000627"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:55:13.817197" elapsed="0.000079"/>
</return>
<status status="PASS" start="2026-04-10T00:55:13.816978" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:13.816945" elapsed="0.000457"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:13.817478" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:13.836818" elapsed="0.000983"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:13.838078" elapsed="0.000295"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:13.838651" elapsed="0.000164"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:13.818230" elapsed="0.020677"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:55:13.337239" elapsed="0.501825"/>
</kw>
<msg time="2026-04-10T00:55:13.839288" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:13.336663" elapsed="0.502735"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:55:13.336118" elapsed="0.503409"/>
</kw>
<msg time="2026-04-10T00:55:13.839614" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:13.335581" elapsed="0.504104"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:13.843938" 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-04-10T00:55:13.844610" elapsed="0.000193"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:13.844997" 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-04-10T00:55:13.840162" elapsed="0.005022"/>
</kw>
<msg time="2026-04-10T00:55:13.845317" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:55:13.334527" elapsed="0.510823"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:13.846145" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:13.845799" elapsed="0.000403"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:55:13.846268" elapsed="0.000056"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:55:13.333617" elapsed="0.512856"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:55:13.333417" elapsed="0.513172"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:13.847808" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:13.847415" elapsed="0.000431"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:13.848709" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:13.848516" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:13.852069" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:13.851690" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:13.851658" elapsed="0.000916"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:13.852961" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:13.852814" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:13.853882" level="INFO">Attempting to execute command "/tmp/karaf-0.23.1/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782512.828027.log" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:13.853260" elapsed="0.000683"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:13.854752" level="INFO">${conn_id} = 286</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:13.854148" elapsed="0.000634"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:55:13.856162" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:55:13.856298" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:55:13.855461" elapsed="0.000867"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:13.856575" elapsed="0.001173"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:55:13.860514" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:55:14.291519" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:54:36 UTC 2026

  System load:  0.88               Processes:             125
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:54:40 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:55:13.859765" elapsed="0.432141"/>
</kw>
<msg time="2026-04-10T00:55:14.292074" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:13.857987" elapsed="0.434308"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:55:13.855015" elapsed="0.437511"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:55:14.293340" level="INFO">Executing command '/tmp/karaf-0.23.1/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782512.828027.log'.</msg>
<msg time="2026-04-10T00:55:14.317015" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:55:14.317333" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:55:14.317432" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:55:14.292934" elapsed="0.024587"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:14.318032" elapsed="0.000644"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:14.319982" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:14.319164" elapsed="0.000915"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:14.320704" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:14.320289" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:14.320226" elapsed="0.000659"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:55:14.321248" elapsed="0.000072"/>
</return>
<status status="PASS" start="2026-04-10T00:55:14.321004" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:14.320970" elapsed="0.000508"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:14.321605" elapsed="0.000037"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:14.343699" elapsed="0.000833"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:14.344775" elapsed="0.000257"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:14.345207" elapsed="0.000119"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:14.322385" elapsed="0.023024"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:55:13.850997" elapsed="0.494525"/>
</kw>
<msg time="2026-04-10T00:55:14.345618" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:13.850196" elapsed="0.495525"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:55:13.849640" elapsed="0.496173"/>
</kw>
<msg time="2026-04-10T00:55:14.345858" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:13.849001" elapsed="0.496907"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:14.349002" elapsed="0.000315"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:14.349511" elapsed="0.000167"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:14.349829" elapsed="0.000096"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:14.346307" elapsed="0.003668"/>
</kw>
<msg time="2026-04-10T00:55:14.350085" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:55:13.848085" elapsed="0.502026"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:14.350781" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:14.350484" elapsed="0.000339"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:55:14.350881" elapsed="0.000052"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:55:13.846961" elapsed="0.504092"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:55:13.846743" elapsed="0.504350"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:55:12.831732" elapsed="1.519409"/>
</for>
<arg>command=${command} ${gc_options}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:55:12.829579" elapsed="1.521641"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:14.363438" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:14.363050" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:55:14.364213" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:55:14.363664" elapsed="0.000583"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:55:14.364295" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:55:14.364457" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:55:14.362662" elapsed="0.001820"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:14.366104" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:14.365800" elapsed="0.000332"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:14.366177" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:14.366324" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:14.365419" elapsed="0.000930"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:14.373809" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:14.373534" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:14.374263" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:14.374015" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:14.379914" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.170.165', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.165', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-10T00:55:14.376436" elapsed="0.005286">ConnectionError: HTTPConnectionPool(host='10.30.170.165', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.165', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-10T00:55:14.374393" elapsed="0.007427">ConnectionError: HTTPConnectionPool(host='10.30.170.165', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.165', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:14.382014" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:14.381859" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-10T00:55:14.374374" elapsed="0.007728">ConnectionError: HTTPConnectionPool(host='10.30.170.165', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.165', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:14.382659" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:14.382793" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:14.382757" elapsed="0.000116"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:14.382740" 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-04-10T00:55:14.383050" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:55:14.383121" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-10T00:55:14.369027" elapsed="0.014210">ConnectionError: HTTPConnectionPool(host='10.30.170.165', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.165', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:14.383308" elapsed="0.000016"/>
</return>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-04-10T00:55:14.366584" elapsed="0.016828">ConnectionError: HTTPConnectionPool(host='10.30.170.165', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.165', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:14.383654" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:55:14.383783" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:14.383748" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:14.383731" elapsed="0.000115"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:14.384042" elapsed="0.000024"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:14.384264" elapsed="0.000023"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-04-10T00:55:14.384331" elapsed="0.000018"/>
</return>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="FAIL" start="2026-04-10T00:55:14.365013" elapsed="0.019424">ConnectionError: HTTPConnectionPool(host='10.30.170.165', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.165', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-10T00:55:14.384579" elapsed="0.000030"/>
</continue>
<status status="NOT RUN" start="2026-04-10T00:55:14.384515" elapsed="0.000127"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:14.384499" elapsed="0.000164"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:14.384807" elapsed="0.000021"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-10T00:55:14.364772" elapsed="0.020105">ConnectionError: HTTPConnectionPool(host='10.30.170.165', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.165', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:55:14.364569" elapsed="0.020367">ConnectionError: HTTPConnectionPool(host='10.30.170.165', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.165', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="FAIL" start="2026-04-10T00:55:14.362232" elapsed="0.022799">ConnectionError: HTTPConnectionPool(host='10.30.170.165', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.165', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-10T00:55:14.361882" elapsed="0.023207">ConnectionError: HTTPConnectionPool(host='10.30.170.165', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.165', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-04-10T00:55:14.361855" elapsed="0.023265">ConnectionError: HTTPConnectionPool(host='10.30.170.165', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.165', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<arg>${member_index_list}</arg>
<status status="NOT RUN" start="2026-04-10T00:55:14.385442" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:14.385187" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:14.385170" elapsed="0.000350"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:55:14.385822" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:14.385610" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:14.385594" elapsed="0.000340"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="FAIL" start="2026-04-10T00:55:14.361412" elapsed="0.024601">ConnectionError: HTTPConnectionPool(host='10.30.170.165', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.170.165', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:24.404414" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:24.403952" elapsed="0.000495"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:55:24.404959" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:55:24.404638" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:55:24.405035" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:55:24.405208" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:55:24.403441" elapsed="0.001792"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:24.406802" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:24.406464" elapsed="0.000366"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:24.406875" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:24.407024" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:24.406113" elapsed="0.000935"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:24.416018" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:24.415748" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:24.416475" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:24.416227" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:24.479301" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:24.479498" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 status=401, reason=Unauthorized 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '524'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 401 Unauthorized&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 401 Unauthorized&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;401&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Unauthorized&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;org.jolokia.osgi.servlet.JolokiaServlet&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-04-10T00:55:24.479928" level="FAIL">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-10T00:55:24.419120" elapsed="0.061740">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-04-10T00:55:24.416608" elapsed="0.064459">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:24.481605" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:24.481153" elapsed="0.000611"/>
</branch>
<status status="FAIL" start="2026-04-10T00:55:24.416587" elapsed="0.065231">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:24.483494" elapsed="0.000103"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:24.483773" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:24.483717" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:24.483691" elapsed="0.000174"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:24.484076" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:55:24.484174" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-10T00:55:24.409684" elapsed="0.074647">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:24.484433" elapsed="0.000022"/>
</return>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-04-10T00:55:24.407261" elapsed="0.077333">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:24.484918" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:55:24.485116" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:24.485067" elapsed="0.000107"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:24.485044" elapsed="0.000160"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:24.485481" elapsed="0.000034"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:24.485854" elapsed="0.000036"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-04-10T00:55:24.485951" elapsed="0.000022"/>
</return>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="FAIL" start="2026-04-10T00:55:24.405729" elapsed="0.080366">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-10T00:55:24.486264" elapsed="0.000040"/>
</continue>
<status status="NOT RUN" start="2026-04-10T00:55:24.486207" elapsed="0.000137"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:24.486184" elapsed="0.000191"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:24.486646" elapsed="0.000160"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-10T00:55:24.405476" elapsed="0.081411">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:55:24.405292" elapsed="0.081680">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="FAIL" start="2026-04-10T00:55:24.402865" elapsed="0.084304">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-04-10T00:55:24.402336" elapsed="0.084928">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</branch>
<status status="FAIL" start="2026-04-10T00:55:24.402302" elapsed="0.085007">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<arg>${member_index_list}</arg>
<status status="NOT RUN" start="2026-04-10T00:55:24.487818" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:24.487465" elapsed="0.000433"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:24.487433" elapsed="0.000498"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:55:24.488302" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:24.488005" elapsed="0.000376"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:24.487985" elapsed="0.000428"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="FAIL" start="2026-04-10T00:55:24.401623" elapsed="0.086901">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:34.507100" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:34.506637" elapsed="0.000495"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:55:34.507678" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:55:34.507333" elapsed="0.000372"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:55:34.507754" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:55:34.507927" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:55:34.506209" elapsed="0.001744"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:34.509765" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:34.509429" elapsed="0.000373"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:34.509850" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:34.510004" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:34.509071" elapsed="0.000959"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:34.519566" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:34.519180" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:34.520208" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:34.519859" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:34.529440" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:34.529517" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 status=401, reason=Unauthorized 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '524'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 401 Unauthorized&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 401 Unauthorized&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;401&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Unauthorized&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;org.jolokia.osgi.servlet.JolokiaServlet&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-04-10T00:55:34.529676" level="FAIL">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-10T00:55:34.523280" elapsed="0.006798">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-04-10T00:55:34.520365" elapsed="0.009799">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:34.530356" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:34.530198" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-04-10T00:55:34.520338" elapsed="0.010108">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:34.530996" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:34.531150" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:34.531113" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:34.531096" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:34.531388" elapsed="0.000099"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:55:34.531568" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-10T00:55:34.513125" elapsed="0.018575">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:34.531775" elapsed="0.000016"/>
</return>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-04-10T00:55:34.510246" elapsed="0.021629">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:34.532106" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:55:34.532238" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:34.532202" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:34.532186" elapsed="0.000116"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:34.532500" elapsed="0.000024"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:34.532742" elapsed="0.000024"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-04-10T00:55:34.532810" elapsed="0.000015"/>
</return>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="FAIL" start="2026-04-10T00:55:34.508428" elapsed="0.024484">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-10T00:55:34.533043" elapsed="0.000017"/>
</continue>
<status status="NOT RUN" start="2026-04-10T00:55:34.532998" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:34.532982" elapsed="0.000124"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:34.533249" elapsed="0.000021"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-10T00:55:34.508197" elapsed="0.025122">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:55:34.508012" elapsed="0.025366">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="FAIL" start="2026-04-10T00:55:34.505788" elapsed="0.027685">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-04-10T00:55:34.505407" elapsed="0.028123">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</branch>
<status status="FAIL" start="2026-04-10T00:55:34.505381" elapsed="0.028202">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<arg>${member_index_list}</arg>
<status status="NOT RUN" start="2026-04-10T00:55:34.533868" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:34.533653" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:34.533636" elapsed="0.000313"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:55:34.534216" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:34.534004" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:34.533989" elapsed="0.000307"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="FAIL" start="2026-04-10T00:55:34.504854" elapsed="0.029522">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:44.553681" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:44.553144" elapsed="0.000572"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:55:44.554317" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:55:44.553987" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:55:44.554394" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:55:44.554587" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:55:44.552517" elapsed="0.002097"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:44.556183" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:44.555861" elapsed="0.000358"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:44.556276" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:55:44.556434" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:44.555484" elapsed="0.000976"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:44.564258" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:44.563941" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:44.564755" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:44.564481" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:45.002670" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:45.002881" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:55:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:55:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore","type":"read"},"value":{"LocalShards":["member-1-shard-default-config","member-1-shard-topology-config","member-1-shard-inventory-config","member-1-shard-toaster-config"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1775782545,"status":200} 
 </msg>
<msg time="2026-04-10T00:55:45.003183" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:44.566981" elapsed="0.436267"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:44.564878" elapsed="0.438486"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.003922" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.003436" elapsed="0.000641"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:44.564857" elapsed="0.439268"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.010199" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore","type":"read"},"value":{"LocalShards":["member-1-shard-default-config","member-1-shard-topology-config","member-1-shard-inventory-config","member-1-shard-toaster-config"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1775782545,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.006381" elapsed="0.003958"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.006010" elapsed="0.004480"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.005982" elapsed="0.004547"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.014737" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.011003" elapsed="0.003863"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.010634" elapsed="0.004381"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.010609" elapsed="0.004443"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.016134" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.015325" elapsed="0.000849"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.016730" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.016275" elapsed="0.000701"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.017818" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:45.017230" elapsed="0.000667"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.017015" elapsed="0.001031"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.016249" elapsed="0.001821"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.018848" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.018297" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.019206" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.018947" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.020170" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:45.019601" elapsed="0.000655"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.019408" elapsed="0.000997"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.018929" elapsed="0.001501"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:45.020638" elapsed="0.000657"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:45.022294" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.021466" elapsed="0.000855"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.022480" elapsed="0.002965"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:45.005331" elapsed="0.020181"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:45.025714" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:45.025601" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.025581" elapsed="0.000203"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:55:45.028814" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782545,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:55:45.025933" elapsed="0.002911"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:55:45.028896" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:55:45.029064" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782545,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:44.559349" elapsed="0.469742"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:45.029148" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:45.029303" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782545,...</msg>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:55:44.556699" elapsed="0.472630"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.030231" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782545,
 "value": {
  "LocalShards": [
   "member-1-shard-default-config",
   "member-1-shard-inventory-config",
   "member-1-shard-toaster-config",
   "member-1-shard-topology-config"
  ],
  "MemberName": "member-1",
  "SyncStatus": true
 }
}
</msg>
<arg>${shard_manager_text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.029976" elapsed="0.000304"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.031247" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782545, 'value': {...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.030850" elapsed="0.000426"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:55:45.031325" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:45.031484" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782545, 'value': {...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:55:45.030489" elapsed="0.001021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:45.032093" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-config', 'member-1-shard-inventory-config', 'member-1-shard-toaster-config', 'member-1-shard-topology-config'], 'MemberName': 'member-1', 'SyncStatus': True}</msg>
<var>${value_object}</var>
<arg>dictionary=${manager_object}</arg>
<arg>key=value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.031696" elapsed="0.000425"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:45.032497" level="INFO">${sync_status} = True</msg>
<var>${sync_status}</var>
<arg>dictionary=${value_object}</arg>
<arg>key=SyncStatus</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.032282" elapsed="0.000309"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-04-10T00:55:45.032675" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:45.032833" level="INFO">${conf_status} = True</msg>
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="PASS" start="2026-04-10T00:55:45.029606" elapsed="0.003252"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:55:45.033035" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:45.032927" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.032909" elapsed="0.000192"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.040611" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.040270" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.041083" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.040830" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:45.050100" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:45.050178" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:55:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:55:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"LocalShards":["member-1-shard-default-operational","member-1-shard-topology-operational","member-1-shard-inventory-operational","member-1-shard-toaster-operational"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1775782545,"status":200} 
 </msg>
<msg time="2026-04-10T00:55:45.050292" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:45.043223" elapsed="0.007095"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.041195" elapsed="0.009166"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.050562" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.050388" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.041176" elapsed="0.009474"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.054653" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"LocalShards":["member-1-shard-default-operational","member-1-shard-topology-operational","member-1-shard-inventory-operational","member-1-shard-toaster-operational"],"SyncStatus":true,"MemberName":"member-1"},"timestamp":1775782545,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.051837" elapsed="0.002911"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.051589" elapsed="0.003267"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.051569" elapsed="0.003314"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.057815" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.055186" elapsed="0.002721"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.054941" elapsed="0.003071"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.054924" elapsed="0.003114"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.058758" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.058214" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.059116" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.058856" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.060061" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:45.059479" elapsed="0.000661"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.059315" elapsed="0.000970"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.058839" elapsed="0.001470"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.061021" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.060491" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.061372" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.061118" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.062307" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:45.061753" elapsed="0.000668"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.061588" elapsed="0.001058"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.061100" elapsed="0.001572"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:45.062828" elapsed="0.000655"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:45.064449" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.063666" elapsed="0.000830"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.064668" elapsed="0.003110"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:45.051146" elapsed="0.016699"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:45.068024" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:45.067916" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.067897" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:55:45.070916" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:55:45.068238" elapsed="0.002707"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:55:45.070996" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:45.071153" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:45.035743" elapsed="0.035436"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:45.071235" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:55:45.071383" level="INFO">${oper_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:55:45.033304" elapsed="0.038104"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.072240" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782545,
 "value": {
  "LocalShards": [
   "member-1-shard-default-operational",
   "member-1-shard-inventory-operational",
   "member-1-shard-toaster-operational",
   "member-1-shard-topology-operational"
  ],
  "MemberName": "member-1",
  "SyncStatus": true
 }
}
</msg>
<arg>${shard_manager_text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.071991" elapsed="0.000297"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.073362" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782545, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.072971" elapsed="0.000419"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:55:45.073437" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:45.073613" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782545, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:55:45.072514" elapsed="0.001127"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:45.074016" level="INFO">${value_object} = {'LocalShards': ['member-1-shard-default-operational', 'member-1-shard-inventory-operational', 'member-1-shard-toaster-operational', 'member-1-shard-topology-operational'], 'MemberName': 'member-1', '...</msg>
<var>${value_object}</var>
<arg>dictionary=${manager_object}</arg>
<arg>key=value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.073796" elapsed="0.000247"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:45.074406" level="INFO">${sync_status} = True</msg>
<var>${sync_status}</var>
<arg>dictionary=${value_object}</arg>
<arg>key=SyncStatus</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.074198" elapsed="0.000233"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-04-10T00:55:45.074477" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:55:45.074642" level="INFO">${oper_status} = True</msg>
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="PASS" start="2026-04-10T00:55:45.071637" elapsed="0.003030"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-04-10T00:55:45.074710" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:55:45.074857" level="INFO">${status} = True</msg>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="PASS" start="2026-04-10T00:55:44.555098" elapsed="0.519815"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-04-10T00:55:45.075098" elapsed="0.000033"/>
</continue>
<status status="PASS" start="2026-04-10T00:55:45.074987" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.074969" elapsed="0.000215"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.075333" elapsed="0.000022"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:55:44.554863" elapsed="0.520525"/>
</iter>
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.076832" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:45.076517" elapsed="0.000342"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:45.076903" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:45.077049" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:45.076158" elapsed="0.000916"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.084428" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.084179" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.084912" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.084666" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:45.434417" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:45.434608" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:55:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:55:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore","type":"read"},"value":{"LocalShards":["member-2-shard-default-config","member-2-shard-topology-config","member-2-shard-inventory-config","member-2-shard-toaster-config"],"SyncStatus":true,"MemberName":"member-2"},"timestamp":1775782545,"status":200} 
 </msg>
<msg time="2026-04-10T00:55:45.434830" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:45.087053" elapsed="0.347827"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.085024" elapsed="0.349934"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.435301" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.435009" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.085005" elapsed="0.350424"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.441358" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore","type":"read"},"value":{"LocalShards":["member-2-shard-default-config","member-2-shard-topology-config","member-2-shard-inventory-config","member-2-shard-toaster-config"],"SyncStatus":true,"MemberName":"member-2"},"timestamp":1775782545,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.437313" elapsed="0.004181"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.436943" elapsed="0.004722"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.436913" elapsed="0.004792"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.445757" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.442134" elapsed="0.003752"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.441788" elapsed="0.004245"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.441763" elapsed="0.004307"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.447108" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.446323" elapsed="0.000825"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.447659" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.447248" elapsed="0.000652"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.449023" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:45.448201" elapsed="0.000935"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.447962" elapsed="0.001380"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.447223" elapsed="0.002153"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.450346" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.449625" elapsed="0.000830"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.450952" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.450580" elapsed="0.000614"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.452308" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:45.451466" elapsed="0.000922"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.451232" elapsed="0.001302"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.450533" elapsed="0.002041"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:45.452734" elapsed="0.000669"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:45.454394" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.453587" elapsed="0.000835"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.454595" elapsed="0.003066"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:45.436258" elapsed="0.021469"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:45.457911" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:45.457798" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.457780" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:55:45.460898" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782545,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:55:45.458128" elapsed="0.002800"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:55:45.460980" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:55:45.461147" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782545,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:45.079885" elapsed="0.381288"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:45.461231" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:55:45.461380" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782545,...</msg>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:55:45.077281" elapsed="0.384125"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.462260" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782545,
 "value": {
  "LocalShards": [
   "member-2-shard-default-config",
   "member-2-shard-inventory-config",
   "member-2-shard-toaster-config",
   "member-2-shard-topology-config"
  ],
  "MemberName": "member-2",
  "SyncStatus": true
 }
}
</msg>
<arg>${shard_manager_text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.462000" elapsed="0.000308"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.463286" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782545, 'value': {...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.462884" elapsed="0.000430"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:55:45.463363" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:45.463522" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782545, 'value': {...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:55:45.462520" elapsed="0.001116"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:45.464057" level="INFO">${value_object} = {'LocalShards': ['member-2-shard-default-config', 'member-2-shard-inventory-config', 'member-2-shard-toaster-config', 'member-2-shard-topology-config'], 'MemberName': 'member-2', 'SyncStatus': True}</msg>
<var>${value_object}</var>
<arg>dictionary=${manager_object}</arg>
<arg>key=value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.463796" elapsed="0.000288"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:45.464470" level="INFO">${sync_status} = True</msg>
<var>${sync_status}</var>
<arg>dictionary=${value_object}</arg>
<arg>key=SyncStatus</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.464259" elapsed="0.000236"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-04-10T00:55:45.464596" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:45.464753" level="INFO">${conf_status} = True</msg>
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="PASS" start="2026-04-10T00:55:45.461642" elapsed="0.003135"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:55:45.464954" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:45.464846" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.464829" elapsed="0.000189"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.472262" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.472009" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.472725" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.472463" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:45.482318" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:45.482394" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:55:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:55:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"LocalShards":["member-2-shard-default-operational","member-2-shard-topology-operational","member-2-shard-inventory-operational","member-2-shard-toaster-operational"],"SyncStatus":true,"MemberName":"member-2"},"timestamp":1775782545,"status":200} 
 </msg>
<msg time="2026-04-10T00:55:45.482505" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:45.475191" elapsed="0.007341"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.472834" elapsed="0.009758"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.482772" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.482618" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.472816" elapsed="0.010042"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.486677" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"LocalShards":["member-2-shard-default-operational","member-2-shard-topology-operational","member-2-shard-inventory-operational","member-2-shard-toaster-operational"],"SyncStatus":true,"MemberName":"member-2"},"timestamp":1775782545,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.484050" elapsed="0.002722"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.483787" elapsed="0.003092"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.483769" elapsed="0.003136"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.490457" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.487203" elapsed="0.003402"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.486962" elapsed="0.003794"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.486945" elapsed="0.003848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.491774" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.491025" elapsed="0.000788"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.492293" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.491930" elapsed="0.000606"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.493672" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:45.492857" elapsed="0.000927"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.492625" elapsed="0.001363"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.491903" elapsed="0.002119"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.494984" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.494251" elapsed="0.000771"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.495475" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.495119" elapsed="0.000636"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.496911" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:45.496039" elapsed="0.000983"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.495793" elapsed="0.001506"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.495094" elapsed="0.002240"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:45.497594" elapsed="0.000919"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:45.499913" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.498778" elapsed="0.001173"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.500179" elapsed="0.002955"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:45.483350" elapsed="0.019848"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:45.503374" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:45.503269" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.503250" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:55:45.506382" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:55:45.503601" elapsed="0.002810"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:55:45.506464" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:55:45.506644" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:45.467721" elapsed="0.038949"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:45.506728" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:55:45.506881" level="INFO">${oper_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:55:45.465223" elapsed="0.041683"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.507772" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782545,
 "value": {
  "LocalShards": [
   "member-2-shard-default-operational",
   "member-2-shard-inventory-operational",
   "member-2-shard-toaster-operational",
   "member-2-shard-topology-operational"
  ],
  "MemberName": "member-2",
  "SyncStatus": true
 }
}
</msg>
<arg>${shard_manager_text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.507494" elapsed="0.000326"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.508929" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782545, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.508396" elapsed="0.000561"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:55:45.509006" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:45.509167" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782545, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:55:45.508051" elapsed="0.001142"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:45.509590" level="INFO">${value_object} = {'LocalShards': ['member-2-shard-default-operational', 'member-2-shard-inventory-operational', 'member-2-shard-toaster-operational', 'member-2-shard-topology-operational'], 'MemberName': 'member-2', '...</msg>
<var>${value_object}</var>
<arg>dictionary=${manager_object}</arg>
<arg>key=value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.509349" elapsed="0.000271"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:45.509989" level="INFO">${sync_status} = True</msg>
<var>${sync_status}</var>
<arg>dictionary=${value_object}</arg>
<arg>key=SyncStatus</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.509777" elapsed="0.000238"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-04-10T00:55:45.510063" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:45.510213" level="INFO">${oper_status} = True</msg>
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="PASS" start="2026-04-10T00:55:45.507134" elapsed="0.003103"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-04-10T00:55:45.510279" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:55:45.510428" level="INFO">${status} = True</msg>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="PASS" start="2026-04-10T00:55:45.075781" elapsed="0.434671"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-04-10T00:55:45.510696" elapsed="0.000029"/>
</continue>
<status status="PASS" start="2026-04-10T00:55:45.510580" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.510560" elapsed="0.000218"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.510930" elapsed="0.000021"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:55:45.075535" elapsed="0.435450"/>
</iter>
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.512683" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:45.512363" elapsed="0.000347"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:45.512756" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:45.512905" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:45.512015" elapsed="0.000916"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.520133" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.519876" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.520591" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.520334" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:45.847304" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:45.847612" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:55:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:55:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-config","member-3-shard-topology-config","member-3-shard-inventory-config","member-3-shard-toaster-config"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782545,"status":200} 
 </msg>
<msg time="2026-04-10T00:55:45.847943" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:45.522739" elapsed="0.325291"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.520703" elapsed="0.327457"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.848715" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.848236" elapsed="0.000646"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.520685" elapsed="0.328252"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.857511" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-config","member-3-shard-topology-config","member-3-shard-inventory-config","member-3-shard-toaster-config"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782545,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.852182" elapsed="0.005446"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.851511" elapsed="0.006231"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.851462" elapsed="0.006309"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.860743" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.858079" elapsed="0.002760"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.857830" elapsed="0.003120"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.857812" elapsed="0.003165"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.861759" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.861166" elapsed="0.000622"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.862129" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.861862" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.863123" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:45.862519" elapsed="0.000688"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.862349" elapsed="0.001042"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.861843" elapsed="0.001576"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.864144" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.863614" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.864602" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.864304" elapsed="0.000481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.865588" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:45.864981" elapsed="0.000691"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.864813" elapsed="0.001009"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.864285" elapsed="0.001562"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:45.866008" elapsed="0.000703"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:45.867797" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.866883" elapsed="0.000943"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.867987" elapsed="0.002930"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:45.850331" elapsed="0.020657"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:45.871171" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:45.871061" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.871042" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:55:45.874212" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782545,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:55:45.871418" elapsed="0.002825"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:55:45.874297" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:55:45.874463" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782545,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:45.515585" elapsed="0.358906"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:45.874574" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:45.874732" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782545,...</msg>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:55:45.513149" elapsed="0.361610"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.875766" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782545,
 "value": {
  "LocalShards": [
   "member-3-shard-default-config",
   "member-3-shard-inventory-config",
   "member-3-shard-toaster-config",
   "member-3-shard-topology-config"
  ],
  "MemberName": "member-3",
  "SyncStatus": true
 }
}
</msg>
<arg>${shard_manager_text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.875374" elapsed="0.000441"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.876799" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782545, 'value': {...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.876372" elapsed="0.000456"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:55:45.876876" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:45.877037" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782545, 'value': {...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:55:45.876028" elapsed="0.001036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:45.877446" level="INFO">${value_object} = {'LocalShards': ['member-3-shard-default-config', 'member-3-shard-inventory-config', 'member-3-shard-toaster-config', 'member-3-shard-topology-config'], 'MemberName': 'member-3', 'SyncStatus': True}</msg>
<var>${value_object}</var>
<arg>dictionary=${manager_object}</arg>
<arg>key=value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.877220" elapsed="0.000255"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:45.877883" level="INFO">${sync_status} = True</msg>
<var>${sync_status}</var>
<arg>dictionary=${value_object}</arg>
<arg>key=SyncStatus</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.877665" elapsed="0.000244"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-04-10T00:55:45.877959" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:45.878154" level="INFO">${conf_status} = True</msg>
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="PASS" start="2026-04-10T00:55:45.874984" elapsed="0.003195"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:55:45.878357" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:45.878248" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.878230" elapsed="0.000193"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.886006" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.885737" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.886460" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.886214" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:45.896447" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:45.896529" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:55:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:55:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-operational","member-3-shard-topology-operational","member-3-shard-inventory-operational","member-3-shard-toaster-operational"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782545,"status":200} 
 </msg>
<msg time="2026-04-10T00:55:45.896669" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:45.888659" elapsed="0.008037"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.886592" elapsed="0.010150"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.896938" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.896771" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.886571" elapsed="0.010459"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.901444" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-operational","member-3-shard-topology-operational","member-3-shard-inventory-operational","member-3-shard-toaster-operational"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782545,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.898280" elapsed="0.003386"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.898031" elapsed="0.003801"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.898013" elapsed="0.003860"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.906288" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.902352" elapsed="0.004074"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.901979" elapsed="0.004668"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.901946" elapsed="0.004742"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.907805" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.906949" elapsed="0.000897"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.908353" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.907953" elapsed="0.000688"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.909863" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:45.908928" elapsed="0.001053"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.908681" elapsed="0.001552"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.907926" elapsed="0.002355"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.911361" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.910539" elapsed="0.000863"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.911893" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:45.911505" elapsed="0.000647"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.913039" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:45.912440" elapsed="0.000680"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.912210" elapsed="0.001118"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.911479" elapsed="0.001876"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:45.913516" elapsed="0.000730"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:45.915390" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.914449" elapsed="0.000968"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.915592" elapsed="0.004366"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:45.897577" elapsed="0.022449"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:45.920207" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:45.920097" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.920078" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:55:45.923166" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:55:45.920422" elapsed="0.002773"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:55:45.923248" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:55:45.923452" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:45.881342" elapsed="0.042136"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:45.923536" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:55:45.923703" level="INFO">${oper_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:55:45.878652" elapsed="0.045077"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.924586" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782545,
 "value": {
  "LocalShards": [
   "member-3-shard-default-operational",
   "member-3-shard-inventory-operational",
   "member-3-shard-toaster-operational",
   "member-3-shard-topology-operational"
  ],
  "MemberName": "member-3",
  "SyncStatus": true
 }
}
</msg>
<arg>${shard_manager_text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:45.924313" elapsed="0.000322"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.925670" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782545, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:45.925192" elapsed="0.000508"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:55:45.925750" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:45.925911" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782545, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:55:45.924846" elapsed="0.001091"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:45.926314" level="INFO">${value_object} = {'LocalShards': ['member-3-shard-default-operational', 'member-3-shard-inventory-operational', 'member-3-shard-toaster-operational', 'member-3-shard-topology-operational'], 'MemberName': 'member-3', '...</msg>
<var>${value_object}</var>
<arg>dictionary=${manager_object}</arg>
<arg>key=value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.926094" elapsed="0.000247"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:45.926724" level="INFO">${sync_status} = True</msg>
<var>${sync_status}</var>
<arg>dictionary=${value_object}</arg>
<arg>key=SyncStatus</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:45.926497" elapsed="0.000253"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-04-10T00:55:45.926798" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:45.926949" level="INFO">${oper_status} = True</msg>
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="PASS" start="2026-04-10T00:55:45.923953" elapsed="0.003021"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-04-10T00:55:45.927017" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:55:45.927164" level="INFO">${status} = True</msg>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="PASS" start="2026-04-10T00:55:45.511579" elapsed="0.415610"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-04-10T00:55:45.927427" elapsed="0.000030"/>
</continue>
<status status="PASS" start="2026-04-10T00:55:45.927256" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.927240" elapsed="0.000271"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:45.927678" elapsed="0.000022"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:55:45.511327" elapsed="0.416407"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:55:44.554673" elapsed="1.373096"/>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="PASS" start="2026-04-10T00:55:44.552081" elapsed="1.375744"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:44.551652" elapsed="1.376204"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:44.551620" elapsed="1.376259"/>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.929350" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:45.928971" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.929905" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:55:45.929538" elapsed="0.000393"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:55:45.929976" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:45.930130" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:55:45.928594" elapsed="0.001561"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:45.931170" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:45.930875" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:45.931241" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:55:45.931428" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:45.930514" elapsed="0.000940"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.025293" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:46.024425" elapsed="0.000976"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:55:46.026767" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:55:46.026443" elapsed="0.000405">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:55:46.027056" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:55:46.025696" elapsed="0.001501"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.028399" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:46.027472" elapsed="0.001031"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:55:46.029460" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:55:46.029770" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:55:46.029115" elapsed="0.000753"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.030689" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:46.030122" elapsed="0.000714"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.032708" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:46.032419" elapsed="0.000335"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.033210" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:55:46.032921" 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-04-10T00:55:46.033596" elapsed="0.000025"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.033811" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.034054" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:55:46.033440" elapsed="0.000684"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:55:46.033294" elapsed="0.000866"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:55:46.034212" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:55:46.034539" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:55:46.031899" elapsed="0.002691"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:46.030961" elapsed="0.003679"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.035024" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:46.034730" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:46.030924" elapsed="0.004310"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.036490" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:46.035460" elapsed="0.001148"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:55:46.036687" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:55:46.022780" elapsed="0.014172"/>
</kw>
<msg time="2026-04-10T00:55:46.037012" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:45.968941" elapsed="0.068125"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.049935" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.062200" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.074350" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.074562" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.074741" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.075164" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:46.074998" elapsed="0.000355"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:46.074982" elapsed="0.000399"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.075524" elapsed="0.000040"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.075716" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.075883" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:55:46.074951" elapsed="0.000985"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:55:46.074818" elapsed="0.001144"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.076145" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:46.076221" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:55:46.076343" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:55:45.964576" elapsed="0.111793"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:55:46.077747" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:55:46.077383" elapsed="0.000431">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:55:46.077906" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:55:46.077041" elapsed="0.000890"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.078249" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:46.078003" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.078927" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:46.078507" elapsed="0.000447"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:46.078329" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:46.077984" elapsed="0.001026"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.081395" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:46.079181" elapsed="0.002241"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:55:46.081472" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:46.081641" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:55:46.076712" elapsed="0.004954"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:55:46.082987" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:55:46.082645" elapsed="0.000405">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:55:46.083172" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:55:46.082294" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:55:46.083407" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:55:46.083273" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:46.083254" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.083653" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.083825" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:55:46.083889" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:55:46.085960" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:55:46.081969" elapsed="0.004018"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.087398" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:46.087147" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.087900" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:46.087616" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:46.611245" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:46.612410" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:55:46 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:55:46.612963" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:46.090069" elapsed="0.522961"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:46.088013" elapsed="0.525129"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.613661" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:46.613216" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:46.087996" elapsed="0.525867"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.621230" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:46.616761" elapsed="0.004887"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:46.616151" elapsed="0.005618"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:46.616108" elapsed="0.005690"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.624748" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:46.622115" elapsed="0.002727"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:46.621859" elapsed="0.003092"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:46.621841" elapsed="0.003136"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.625737" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:46.625165" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.626101" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:46.625838" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.627132" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:46.626520" elapsed="0.000692"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:46.626305" elapsed="0.001056"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:46.625819" elapsed="0.001566"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.628091" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:46.627566" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.628577" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:46.628215" elapsed="0.000592"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.629755" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:46.629055" elapsed="0.000781"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:46.628842" elapsed="0.001140"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:46.628188" elapsed="0.001818"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:46.630166" elapsed="0.000754"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:46.631971" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:46.631093" elapsed="0.000905"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:46.632158" elapsed="0.003290"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:46.615109" elapsed="0.020410"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:46.635722" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:46.635610" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:46.635590" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:55:46.653613" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:55:46.635942" elapsed="0.017709"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:55:46.653715" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:55:46.653901" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:46.086298" elapsed="0.567630"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:46.653993" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:55:46.654147" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:55:45.941826" elapsed="0.712349"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.654630" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:46.654269" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:46.654248" elapsed="0.000551"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:46.654833" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:55:45.935596" elapsed="0.719365"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:55:45.930347" elapsed="0.724656"/>
</iter>
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.656040" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:46.655700" elapsed="0.000368"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:46.656113" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:46.656259" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:46.655280" elapsed="0.001004"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.747425" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:46.746436" elapsed="0.001091"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:55:46.748725" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:55:46.748449" elapsed="0.000352">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:55:46.748993" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:55:46.747810" elapsed="0.001282"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.750524" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:46.749372" elapsed="0.001268"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:55:46.751222" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:55:46.751506" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:55:46.750882" elapsed="0.000762"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.752493" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:46.751932" elapsed="0.000746"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.754637" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:46.754337" elapsed="0.000346"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.755123" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:55:46.754849" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.755501" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.755732" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.755910" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:55:46.755355" elapsed="0.000613"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:55:46.755204" elapsed="0.000795"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:55:46.756047" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:55:46.756365" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:55:46.753789" elapsed="0.002611"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:46.752808" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.756852" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:46.756559" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:46.752770" elapsed="0.004252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.758293" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:46.757285" elapsed="0.001111"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:55:46.758487" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:55:46.745283" elapsed="0.013487"/>
</kw>
<msg time="2026-04-10T00:55:46.758828" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:46.693623" elapsed="0.065258"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.771431" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.783875" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.796338" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.796555" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.796735" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.797154" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:46.797006" elapsed="0.000335"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:46.796991" elapsed="0.000378"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.797512" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.797705" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.797873" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:55:46.796958" elapsed="0.000969"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:55:46.796818" elapsed="0.001136"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.798105" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:46.798238" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:55:46.798376" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:55:46.689439" elapsed="0.108964"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:55:46.799998" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:55:46.799619" elapsed="0.000454">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:55:46.800168" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:55:46.799205" elapsed="0.000987"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.800667" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:46.800296" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.801617" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:46.801029" elapsed="0.000626"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:46.800783" elapsed="0.000923"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:46.800271" elapsed="0.001464"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.805058" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:46.801947" elapsed="0.003148"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:55:46.805168" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:55:46.805385" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:55:46.798804" elapsed="0.006615"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:55:46.807400" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:55:46.806965" elapsed="0.000500">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:55:46.807592" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:55:46.806450" elapsed="0.001168"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:55:46.807826" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:55:46.807690" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:46.807673" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.808056" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:46.808232" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:55:46.808298" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:55:46.810215" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:55:46.805863" elapsed="0.004380"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.811642" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:46.811377" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:46.812079" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:46.811841" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:47.306789" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:47.307829" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:55:47 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:55:47.308436" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:46.814440" elapsed="0.494062"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:46.812187" elapsed="0.496459"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.309128" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:47.308720" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:46.812169" elapsed="0.497157"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.315859" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:47.311616" elapsed="0.004764"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:47.311231" elapsed="0.005299"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:47.311203" elapsed="0.005386"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.320657" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:47.317019" elapsed="0.003769"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:47.316672" elapsed="0.004265"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:47.316648" elapsed="0.004326"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.322070" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:47.321221" elapsed="0.000888"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.322524" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:47.322212" elapsed="0.000503"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.323478" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:47.322909" elapsed="0.000681"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:47.322741" elapsed="0.001037"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:47.322184" elapsed="0.001620"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.324499" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:47.323970" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.324898" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:47.324621" elapsed="0.000459"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.325923" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:47.325276" elapsed="0.000725"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:47.325107" elapsed="0.001041"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:47.324603" elapsed="0.001568"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:47.326332" elapsed="0.000676"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:47.327993" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:47.327177" elapsed="0.000842"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:47.328176" elapsed="0.002972"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:47.310502" elapsed="0.020713"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:47.331397" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:47.331286" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:47.331267" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:55:47.349351" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:55:47.331634" elapsed="0.017748"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:55:47.349436" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:55:47.349868" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:46.810568" elapsed="0.539327"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:47.349961" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:47.350116" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:55:46.666977" elapsed="0.683165"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.350471" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:47.350227" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:47.350210" elapsed="0.000414"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:47.350658" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:55:46.660494" elapsed="0.690290"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:55:46.655106" elapsed="0.695720"/>
</iter>
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.351784" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:47.351462" elapsed="0.000349"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:47.351856" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:47.352003" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:47.351100" elapsed="0.000928"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.441689" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:47.440898" elapsed="0.000890"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:55:47.443214" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:55:47.442958" elapsed="0.000338">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:55:47.443488" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:55:47.442051" elapsed="0.001551"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.444719" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:47.443864" elapsed="0.000953"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:55:47.445387" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:55:47.445713" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:55:47.445052" elapsed="0.000760"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.446788" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:47.446042" elapsed="0.000887"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.448577" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:47.448294" elapsed="0.000330"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.449252" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:55:47.448787" 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-04-10T00:55:47.449658" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.449867" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.450044" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:55:47.449501" elapsed="0.000602"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:55:47.449337" elapsed="0.000796"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:55:47.450179" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:55:47.450493" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:55:47.447801" elapsed="0.002725"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:47.447043" elapsed="0.003636"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.451057" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:47.450769" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:47.447009" elapsed="0.004218"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.452359" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:47.451482" elapsed="0.000976"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:55:47.452533" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:55:47.439809" elapsed="0.013002"/>
</kw>
<msg time="2026-04-10T00:55:47.452868" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:47.388613" elapsed="0.064305"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.465619" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.478004" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.490176" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.490387" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.490580" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.491009" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:47.490859" elapsed="0.000338"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:47.490842" elapsed="0.000384"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.491370" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.491540" elapsed="0.000040"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.491728" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:55:47.490806" elapsed="0.000976"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:55:47.490665" elapsed="0.001144"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.491955" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:47.492032" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:55:47.492166" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:55:47.384455" elapsed="0.107737"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:55:47.493723" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:55:47.493305" elapsed="0.000493">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:55:47.493891" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:55:47.492934" elapsed="0.000982"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.494239" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:47.493987" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.494915" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:47.494495" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:47.494318" elapsed="0.000661"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:47.493969" elapsed="0.001031"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.497529" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:47.495153" elapsed="0.002419"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:55:47.497624" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:47.497781" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:55:47.492588" elapsed="0.005218"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:55:47.499130" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:55:47.498790" elapsed="0.000404">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:55:47.499286" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:55:47.498437" elapsed="0.000874"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:55:47.499516" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:55:47.499381" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:47.499364" elapsed="0.000252"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.499764" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.499936" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:55:47.500002" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:55:47.501958" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:55:47.498109" elapsed="0.003876"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.503382" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:47.503123" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.503843" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:47.503599" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:47.985212" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:47.986271" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:55:47 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:55:47.986892" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:47.506016" elapsed="0.480942"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:47.503952" elapsed="0.483120"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:47.987674" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:47.987144" elapsed="0.000692"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:47.503934" elapsed="0.483950"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.995739" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:47.990932" elapsed="0.005213"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:47.990286" elapsed="0.005975"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:47.990240" elapsed="0.006051"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:47.999748" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:47.996663" elapsed="0.003179"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:47.996360" elapsed="0.003590"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:47.996339" elapsed="0.003638"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:48.000804" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:48.000182" elapsed="0.000651"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:48.001180" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:48.000912" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:48.002158" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:48.001576" elapsed="0.000663"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:48.001385" elapsed="0.001002"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:48.000893" elapsed="0.001518"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:48.003148" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:48.002623" elapsed="0.000553"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:48.003505" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:48.003248" elapsed="0.000451"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:48.004455" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:48.003891" elapsed="0.000645"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:48.003726" elapsed="0.001006"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:48.003230" elapsed="0.001526"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:48.004956" elapsed="0.000680"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:48.006692" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:48.005805" elapsed="0.000915"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:48.006877" elapsed="0.003240"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:47.989174" elapsed="0.021019"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:48.010398" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:48.010279" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:48.010257" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:55:48.028872" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:55:48.010649" elapsed="0.018272"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:55:48.029002" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:55:48.029217" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:47.502292" elapsed="0.526952"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:48.029312" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:55:48.029465" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:55:47.362165" elapsed="0.667327"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:48.030088" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:48.029754" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:48.029732" elapsed="0.000530"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:48.030297" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:55:47.356037" elapsed="0.674388"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:55:47.350928" elapsed="0.679539"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:55:45.930210" elapsed="2.100293"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-10T00:55:45.928198" elapsed="2.102382"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:45.927933" elapsed="2.102678"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:45.927917" elapsed="2.102719"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:55:48.031057" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:48.030695" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:48.030679" elapsed="0.000462"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="PASS" start="2026-04-10T00:55:44.550914" elapsed="3.480276"/>
</kw>
<arg>${timeout}</arg>
<arg>10s</arg>
<arg>Verify_Members_Are_Ready</arg>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:55:14.351396" elapsed="33.679859"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement" type="TEARDOWN">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:48.034891" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:48.034445" elapsed="0.000474"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:55:48.035419" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:55:48.035101" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:55:48.035492" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:48.035666" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:55:48.034016" elapsed="0.001676"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:48.036824" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:48.036505" elapsed="0.000347"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:48.037775" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:48.037515" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:48.042047" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:48.041766" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:48.041747" elapsed="0.000384"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:48.042409" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:48.042279" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:48.043190" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:48.042717" elapsed="0.000520"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:48.043876" level="INFO">${conn_id} = 289</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:48.043398" elapsed="0.000505"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:55:48.045010" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:55:48.045105" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:55:48.044600" elapsed="0.000529"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:48.045292" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:55:48.047183" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:55:48.648421" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:55:48 UTC 2026

  System load:  1.01               Processes:             122
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:55:13 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:55:48.046575" elapsed="0.602079"/>
</kw>
<msg time="2026-04-10T00:55:48.648774" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:48.046006" elapsed="0.602902"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:55:48.044122" elapsed="0.604899"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:55:48.649538" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:55:48.662000" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:55:48.662244" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:55:48.662341" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:55:48.649275" elapsed="0.013117"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:48.662804" elapsed="0.000470"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:48.664429" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:48.663723" elapsed="0.000809"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:48.665067" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:48.664754" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:48.664705" elapsed="0.000526"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:55:48.665621" elapsed="0.000064"/>
</return>
<status status="PASS" start="2026-04-10T00:55:48.665349" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:48.665315" elapsed="0.000502"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:48.665943" elapsed="0.000038"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:48.670508" 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-04-10T00:55:48.671581" elapsed="0.000221"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:48.672016" elapsed="0.000158"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:48.666531" elapsed="0.005718"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:55:48.041182" elapsed="0.631197"/>
</kw>
<msg time="2026-04-10T00:55:48.672454" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:48.040530" elapsed="0.632038"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:55:48.038655" elapsed="0.634028"/>
</kw>
<msg time="2026-04-10T00:55:48.672741" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:48.038066" elapsed="0.634754"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:48.676887" 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-04-10T00:55:48.677483" elapsed="0.000161"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:48.677795" elapsed="0.000097"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:48.673228" elapsed="0.004716"/>
</kw>
<msg time="2026-04-10T00:55:48.678035" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:55:48.037072" elapsed="0.640989"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:48.678491" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:48.678245" elapsed="0.000287"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:55:48.678591" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:55:48.036070" elapsed="0.642649"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:55:48.035880" elapsed="0.642876"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:48.679756" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:48.679472" elapsed="0.000310"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:48.680617" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:48.680465" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:48.683377" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:48.683107" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:48.683087" elapsed="0.000369"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:48.683749" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:48.683622" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:48.684530" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:48.684029" elapsed="0.000572"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:48.685174" level="INFO">${conn_id} = 292</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:48.684759" elapsed="0.000442"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:55:48.686305" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:55:48.686402" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:55:48.685904" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:48.686606" elapsed="0.000719"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:55:48.689644" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:55:49.267930" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:55:48 UTC 2026

  System load:  1.04               Processes:             122
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.169
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:55:13 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:55:48.688996" elapsed="0.579168"/>
</kw>
<msg time="2026-04-10T00:55:49.268371" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:48.687501" elapsed="0.581005"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:55:48.685420" elapsed="0.583222"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:55:49.269163" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:55:49.281047" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:55:49.281296" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:55:49.281394" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:55:49.268895" elapsed="0.012550"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:49.281859" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:49.283518" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:49.282768" elapsed="0.000907"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:49.284154" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:49.283857" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:49.283805" elapsed="0.000510"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:55:49.284706" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-10T00:55:49.284431" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:49.284398" elapsed="0.000493"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:49.284966" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:49.290347" elapsed="0.000786"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:49.291370" elapsed="0.000259"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:49.291842" elapsed="0.000138"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:49.285713" elapsed="0.006342"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:55:48.682532" elapsed="0.609655"/>
</kw>
<msg time="2026-04-10T00:55:49.292264" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:48.681980" elapsed="0.610375"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:55:48.681405" elapsed="0.611060"/>
</kw>
<msg time="2026-04-10T00:55:49.292524" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:48.680901" elapsed="0.611727"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:49.296486" elapsed="0.000326"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:49.296979" elapsed="0.000143"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:49.297269" 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-04-10T00:55:49.293035" elapsed="0.004378"/>
</kw>
<msg time="2026-04-10T00:55:49.297505" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:55:48.680000" elapsed="0.617530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:49.297975" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:49.297728" elapsed="0.000288"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:55:49.298057" elapsed="0.000028"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:55:48.679036" elapsed="0.619147"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:55:48.678852" elapsed="0.619367"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:49.299244" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:49.298973" elapsed="0.000300"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:49.300160" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:49.300025" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:49.303191" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:49.302919" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:49.302901" elapsed="0.000371"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:49.303654" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:49.303474" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:49.304401" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:49.303935" elapsed="0.000513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:49.305041" level="INFO">${conn_id} = 295</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:49.304628" elapsed="0.000440"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:55:49.306154" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:55:49.306249" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:55:49.305767" elapsed="0.000506"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:49.306432" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:55:49.308375" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:55:49.885449" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:55:49 UTC 2026

  System load:  0.93               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:55:14 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:55:49.307759" elapsed="0.577912"/>
</kw>
<msg time="2026-04-10T00:55:49.885786" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:49.307149" elapsed="0.578769"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:55:49.305289" elapsed="0.580738"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:55:49.886511" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:55:49.899239" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:55:49.899598" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:55:49.899717" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:55:49.886259" elapsed="0.013514"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:49.900250" elapsed="0.000555"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:49.902052" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:49.901276" elapsed="0.000897"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:49.902743" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:49.902376" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:49.902324" elapsed="0.000645"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:55:49.903489" elapsed="0.000101"/>
</return>
<status status="PASS" start="2026-04-10T00:55:49.903098" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:49.903060" elapsed="0.000668"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:49.903805" elapsed="0.000034"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:49.908833" elapsed="0.000559"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:49.909580" elapsed="0.000162"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:49.909893" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:49.904574" elapsed="0.005470"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:55:49.302346" elapsed="0.607790"/>
</kw>
<msg time="2026-04-10T00:55:49.910191" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:49.301784" elapsed="0.608472"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:55:49.301197" elapsed="0.609139"/>
</kw>
<msg time="2026-04-10T00:55:49.910377" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:49.300443" elapsed="0.609992"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:49.913262" elapsed="0.000332"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:49.913759" elapsed="0.000142"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:49.914050" elapsed="0.000093"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:49.910747" elapsed="0.003447"/>
</kw>
<msg time="2026-04-10T00:55:49.914285" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:55:49.299580" elapsed="0.614729"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:49.914761" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:49.914500" elapsed="0.000319"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:55:49.914862" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:55:49.298500" elapsed="0.616487"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:55:49.298316" elapsed="0.616708"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:55:48.035749" elapsed="1.879310"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:55:48.031535" elapsed="1.883581"/>
</kw>
<doc>If the list is empty, start all cluster members. Otherwise, start members based on present indices.
If ${wait_for_sync}, wait for cluster sync on listed members.
Optionally karaf_home can be overriden. Optionally specific JAVA_HOME is used for starting.
Garbage collection is unconditionally logged to files. TODO: Make that reasonable conditional?</doc>
<status status="PASS" start="2026-04-10T00:55:12.818604" elapsed="37.096563"/>
</kw>
<doc>Restart all cluster nodes.</doc>
<status status="PASS" start="2026-04-10T00:55:12.601287" elapsed="37.313994"/>
</test>
<test id="s1-s3-t10" name="Verify Data Recovery After Cluster Restart" line="93">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:55:49.919266" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:55:49.918995" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:49.920607" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:49.920466" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:49.920447" 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-04-10T00:55:49.925770" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:49.925655" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:49.925631" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:49.926952" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:49.926481" elapsed="0.000503"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:55:49.927563" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:55:49.927211" elapsed="0.000380"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:55:49.927637" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:55:49.927826" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:55:49.926068" elapsed="0.001784"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:49.933736" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:49.933623" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:49.933604" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:49.935096" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:49.934987" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:49.934967" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:49.935641" level="INFO">${karaf_connection_index} = 272</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:49.935313" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:49.936112" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:49.935839" elapsed="0.000304"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:49.936967" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:55:49.936687" elapsed="0.001000">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:55:49.937970" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:55:49.938018" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:49.936311" elapsed="0.001732"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:55:49.938838" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:55:49.938575" elapsed="0.001000">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:55:49.939761" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:55:49.939808" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:49.938214" elapsed="0.001618"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:55:49.940808" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:55:49.940162" elapsed="0.000712">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:55:49.939929" elapsed="0.001023">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:55:49.939904" elapsed="0.001083">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:49.941153" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:49.941386" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:49.941242" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:49.941225" elapsed="0.000239"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:55:49.941497" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:49.943054" elapsed="0.000854"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:49.944203" elapsed="0.000689"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:49.945175" elapsed="0.000365"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:49.942351" elapsed="0.003328"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:49.941795" elapsed="0.003949"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:55:49.934630" elapsed="0.011272">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</status>
</kw>
<msg time="2026-04-10T00:55:49.946023" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:55:49.946074" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:49.933975" elapsed="0.012126"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:49.946298" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:49.946185" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:49.946164" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:49.947275" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:49.947169" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:49.947151" elapsed="0.000191"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:49.948103" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:49.947755" elapsed="0.000487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:49.948825" level="INFO">{1: 272, 2: 275, 3: 278}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:49.948423" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:49.949354" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:49.949072" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:49.949954" elapsed="0.000261"/>
</kw>
<msg time="2026-04-10T00:55:49.950314" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:49.950360" level="INFO">${old_connection_index} = 272</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:49.949585" elapsed="0.000798"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:49.951234" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:49.952660" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:55:49.952137" elapsed="0.001511">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:49.951636" elapsed="0.002113"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:49.954406" elapsed="0.000291"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:49.953924" elapsed="0.000872"/>
</kw>
<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="PASS" start="2026-04-10T00:55:49.950702" elapsed="0.004142"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:49.950459" elapsed="0.004434"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:49.950440" elapsed="0.004478"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:49.955831" level="INFO">${ip_address} = 10.30.170.165</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:49.955482" elapsed="0.000376"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:55:49.955906" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:55:49.956062" level="INFO">${odl_ip} = 10.30.170.165</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:49.955126" elapsed="0.000961"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:49.956243" elapsed="0.000557"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:49.957100" level="INFO">index=299
host=10.30.170.165
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:55:49.960396" elapsed="0.644461"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:50.618177" elapsed="0.000530"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:50.618877" elapsed="0.000164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:50.619194" elapsed="0.000100"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:50.606040" elapsed="0.013309"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:50.605312" elapsed="0.014089"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:55:49.946858" elapsed="0.672596"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:50.620251" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:50.620136" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:50.620114" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:50.620751" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:50.620472" elapsed="0.000307"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:50.621115" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:50.620938" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:50.718320" 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 "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:55:50.621820" elapsed="0.096695"/>
</kw>
<msg time="2026-04-10T00:55:50.718726" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:55:50.718776" 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 "t "e "s "t "[C "o "p "e "n "f "l "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:50.621300" elapsed="0.097514"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:55:50.883993" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:55:50.719726" elapsed="0.164464"/>
</kw>
<msg time="2026-04-10T00:55:50.884354" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:55:50.884403" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:50.719182" elapsed="0.165260"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:50.884898" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:50.884573" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:50.884525" elapsed="0.000460"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:50.885559" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:50.885135" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:50.886016" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:50.885725" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:50.885707" elapsed="0.000400"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:55:50.886147" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:50.887493" elapsed="0.000529"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:50.888192" elapsed="0.000166"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:50.888510" elapsed="0.000122"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:50.887049" elapsed="0.001637"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:50.886479" elapsed="0.002254"/>
</kw>
<msg time="2026-04-10T00:55:50.888862" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:55:50.619816" elapsed="0.269087"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:55:50.888952" elapsed="0.000030"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:55:49.933253" elapsed="0.955829"/>
</kw>
<msg time="2026-04-10T00:55:50.889182" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:50.889228" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:49.928232" elapsed="0.961034"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:50.889624" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:50.889351" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:50.889331" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:55:49.928085" elapsed="0.961643"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:50.895126" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:50.895018" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:50.894999" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:50.896350" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:50.896243" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:50.896226" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:50.896904" level="INFO">${karaf_connection_index} = 275</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:50.896601" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:50.897311" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:50.897091" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:50.898129" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:55:50.897859" elapsed="0.001131">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:55:50.899182" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:55:50.899230" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:50.897500" elapsed="0.001754"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:55:50.900043" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:55:50.899801" elapsed="0.000913">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:55:50.900903" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:55:50.900988" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:50.899429" elapsed="0.001586"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:55:50.901977" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:55:50.901317" elapsed="0.000725">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:55:50.901093" elapsed="0.001020">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:55:50.901074" elapsed="0.001072">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:50.902310" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:50.902561" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:50.902399" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:50.902382" elapsed="0.000258"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:55:50.902674" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:50.904109" 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-04-10T00:55:50.905178" elapsed="0.000476"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:50.905948" elapsed="0.000356"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:50.903472" elapsed="0.002938"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:50.902937" elapsed="0.003536"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:55:50.895940" elapsed="0.010635">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</status>
</kw>
<msg time="2026-04-10T00:55:50.906680" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:55:50.906725" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:50.895348" elapsed="0.011400"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:50.906933" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:50.906825" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:50.906807" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:50.907795" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:50.907691" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:50.907674" elapsed="0.000187"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:50.908145" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:50.908011" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:50.908709" level="INFO">{1: 299, 2: 275, 3: 278}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:50.908428" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:50.909147" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:50.908905" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:50.909785" elapsed="0.000275"/>
</kw>
<msg time="2026-04-10T00:55:50.910159" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:50.910205" level="INFO">${old_connection_index} = 275</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:50.909347" elapsed="0.000881"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:50.911044" elapsed="0.000234"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:50.912350" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:55:50.911951" elapsed="0.001246">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:50.911452" elapsed="0.001844"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:50.914262" elapsed="0.000296"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:50.913471" elapsed="0.001176"/>
</kw>
<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="PASS" start="2026-04-10T00:55:50.910523" elapsed="0.004172"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:50.910302" elapsed="0.004446"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:50.910285" elapsed="0.004489"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:50.915629" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:50.915308" elapsed="0.000348"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:55:50.915705" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:50.915858" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:50.914983" elapsed="0.000900"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:50.916042" elapsed="0.000399"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:50.916757" level="INFO">index=303
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:55:50.919522" elapsed="0.533519"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:51.467359" elapsed="0.000609"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:51.468159" elapsed="0.000210"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:51.468526" elapsed="0.000351"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:51.454723" elapsed="0.014216"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:51.453731" elapsed="0.015260"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:55:50.907388" elapsed="0.561659"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:51.470006" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:51.469878" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:51.469848" elapsed="0.000244"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:51.470527" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:51.470252" elapsed="0.000429"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:51.471053" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:51.470848" elapsed="0.000231"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:51.561597" 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 "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:55:51.471686" elapsed="0.090195"/>
</kw>
<msg time="2026-04-10T00:55:51.562136" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:55:51.562186" 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 "t "e "s "t "[C "o "p "e "n "f "l "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:51.471246" elapsed="0.090988"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:55:51.722140" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:55:51.563202" elapsed="0.159392"/>
</kw>
<msg time="2026-04-10T00:55:51.722925" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:55:51.722982" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:51.562637" elapsed="0.160385"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:51.723827" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:51.723245" elapsed="0.000659"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:51.723167" elapsed="0.000775"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:51.724668" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:51.724117" elapsed="0.000652"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:51.725071" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:51.724840" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:51.724821" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:55:51.725216" elapsed="0.000068"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:51.727010" elapsed="0.000520"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:51.727729" elapsed="0.000216"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:51.728102" elapsed="0.000116"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:51.726394" elapsed="0.001880"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:51.725704" elapsed="0.002618"/>
</kw>
<msg time="2026-04-10T00:55:51.728460" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:55:51.469512" elapsed="0.258989"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:55:51.728570" elapsed="0.000032"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:55:50.894672" elapsed="0.834038"/>
</kw>
<msg time="2026-04-10T00:55:51.728823" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:51.728869" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:50.890037" elapsed="0.838869"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:51.729290" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:51.728991" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:51.728973" elapsed="0.000552"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:55:50.889867" elapsed="0.839700"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:51.735454" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:51.735341" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:51.735321" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:51.736763" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:51.736651" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:51.736633" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:51.737325" level="INFO">${karaf_connection_index} = 278</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:51.736983" elapsed="0.000370"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:51.737907" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:51.737674" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:51.738767" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:55:51.738438" elapsed="0.001461">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:55:51.740104" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:55:51.740151" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:51.738094" elapsed="0.002081"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:55:51.740973" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:55:51.740721" elapsed="0.000985">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:55:51.741896" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:55:51.741942" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:51.740353" elapsed="0.001613"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:55:51.742929" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:55:51.742265" elapsed="0.000734">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:55:51.742042" elapsed="0.001035">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:55:51.742023" elapsed="0.001088">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:51.743275" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:51.743503" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:51.743362" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:55:51.743346" elapsed="0.000249"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:55:51.743628" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:51.745085" elapsed="0.000864"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:51.746235" elapsed="0.000512"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:51.747025" elapsed="0.000373"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:51.744426" elapsed="0.003076"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:51.743889" elapsed="0.003692"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:55:51.736317" elapsed="0.011357">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</status>
</kw>
<msg time="2026-04-10T00:55:51.747823" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:55:51.747868" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Cluster Restart"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:51.735711" elapsed="0.012181"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:51.748080" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:51.747969" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:51.747951" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:51.748977" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:51.748873" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:51.748855" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:51.749379" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:51.749221" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:51.749985" level="INFO">{1: 299, 2: 303, 3: 278}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:51.749720" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:51.750434" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:51.750184" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:51.751072" elapsed="0.000261"/>
</kw>
<msg time="2026-04-10T00:55:51.751432" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:51.751478" level="INFO">${old_connection_index} = 278</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:51.750702" elapsed="0.000797"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:51.752335" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:51.753733" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:55:51.753222" elapsed="0.001368">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:51.752717" elapsed="0.001975"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:51.758044" elapsed="0.000292"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:51.754867" elapsed="0.003555"/>
</kw>
<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="PASS" start="2026-04-10T00:55:51.751823" elapsed="0.006646"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:51.751598" elapsed="0.006921"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:51.751579" elapsed="0.006979"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:51.759414" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:51.759105" elapsed="0.000336"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:55:51.759489" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:51.759659" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:51.758779" elapsed="0.000905"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:51.759841" elapsed="0.000418"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:51.760575" level="INFO">index=307
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:55:51.763865" elapsed="0.595391"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:52.372826" elapsed="0.000512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:52.373513" elapsed="0.000196"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:52.373866" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:52.360469" elapsed="0.013558"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:52.359712" elapsed="0.014365"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:55:51.748580" elapsed="0.625552"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:52.375135" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:52.375014" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.374988" elapsed="0.000229"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:52.375625" level="INFO">${karaf_connection_index} = 307</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:52.375368" elapsed="0.000285"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:52.376039" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:52.375847" elapsed="0.000218"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:52.469894" 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 "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:55:52.376614" elapsed="0.093538"/>
</kw>
<msg time="2026-04-10T00:55:52.470397" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:55:52.470469" 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 "t "e "s "t "[C "o "p "e "n "f "l "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:52.376233" elapsed="0.094290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:55:52.623988" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:55:52.471606" elapsed="0.152620"/>
</kw>
<msg time="2026-04-10T00:55:52.624437" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:55:52.624487" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:52.470929" elapsed="0.153595"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.625052" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:52.624686" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.624641" elapsed="0.000507"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.625711" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.625303" elapsed="0.000506"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.626119" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:52.625880" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.625861" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:55:52.626241" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:52.627690" elapsed="0.000619"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:52.628618" elapsed="0.000189"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:52.628962" elapsed="0.000122"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:52.627195" elapsed="0.001955"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:52.626604" elapsed="0.002608"/>
</kw>
<msg time="2026-04-10T00:55:52.629357" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:55:52.374496" elapsed="0.254915"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:55:52.629474" elapsed="0.000032"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:55:51.734966" elapsed="0.894664"/>
</kw>
<msg time="2026-04-10T00:55:52.629734" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:52.629779" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:51.729936" elapsed="0.899880"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.630198" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:52.629898" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.629880" elapsed="0.000418"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:55:51.729775" elapsed="0.900548"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:55:49.927908" elapsed="2.702457"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:55:49.925260" elapsed="2.705187"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:55:49.920169" elapsed="2.710355"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:49.919722" elapsed="2.710877"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:55:49.916480" elapsed="2.714199"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.653091" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:52.652015" elapsed="0.001146"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.653832" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:55:52.653491" elapsed="0.000367"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:55:52.653910" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:55:52.654105" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:55:52.651089" elapsed="0.003041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.664968" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:52.664660" elapsed="0.000335"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:52.665044" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:52.665196" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:52.664236" elapsed="0.000985"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.678674" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.678397" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.679116" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.678878" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.679569" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.679313" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.680091" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.679764" elapsed="0.000371"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:52.680984" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:55:52.680778" elapsed="0.000232"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:55:52.681336" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:55:52.681164" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:55:52.681511" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.682145" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.681898" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:55:52.682230" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:52.682385" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:55:52.680336" elapsed="0.002074"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:52.717787" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:55:52.717836" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:52.717948" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:52.684731" elapsed="0.033244"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.682493" elapsed="0.035529"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.718205" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:52.718050" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.682471" elapsed="0.035823"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.721837" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.719340" elapsed="0.002542"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.719116" elapsed="0.002801"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.719098" elapsed="0.002843"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.724648" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.722218" elapsed="0.002477"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.721997" elapsed="0.002733"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.721980" elapsed="0.002774"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.725337" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:52.724940" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.725807" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:52.725450" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.726588" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:52.726145" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.725919" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.725424" elapsed="0.001282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.727461" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:52.726931" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.727965" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:52.727636" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.728905" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:52.728457" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.728178" elapsed="0.000813"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.727610" elapsed="0.001411"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:52.729231" elapsed="0.000507"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:52.730416" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:52.730023" elapsed="0.000430"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:52.730695" elapsed="0.003386"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:52.718677" elapsed="0.015492"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:52.734418" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:52.734271" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.734245" elapsed="0.000270"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:55:52.737966" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:55:52.734749" elapsed="0.003244"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:55:52.738041" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:52.738193" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:52.675701" elapsed="0.062517"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:52.738283" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:55:52.738433" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:55:52.673126" elapsed="0.065333"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:52.738508" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:55:52.738668" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:55:52.663788" elapsed="0.074905"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:55:52.659339" elapsed="0.079414"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:55:52.654355" elapsed="0.084431"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.748958" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:52.748657" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:52.749030" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:52.749177" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:52.748244" elapsed="0.000957"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.762864" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.762612" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.763303" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.763067" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.763761" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.763502" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.764192" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.763956" elapsed="0.000278"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:52.765054" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:55:52.764869" elapsed="0.000210"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:55:52.765396" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:55:52.765230" elapsed="0.000192"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:55:52.765586" elapsed="0.000188"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.766175" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.765932" elapsed="0.000326"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:55:52.766301" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:52.766457" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:55:52.764449" elapsed="0.002033"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:52.805027" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:55:52.805131" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:52.805324" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:52.768648" elapsed="0.036735"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.766568" elapsed="0.038916"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.805922" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:52.805573" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.766534" elapsed="0.039582"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.814274" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.808445" elapsed="0.005936"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.807924" elapsed="0.006547"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.807883" elapsed="0.006652"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.818945" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.815194" elapsed="0.003797"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.814704" elapsed="0.004321"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.814666" elapsed="0.004383"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.819597" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:52.819213" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.819930" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:52.819696" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.820492" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:52.820171" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.820011" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.819677" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.821109" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:52.820751" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.821437" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:52.821205" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.821987" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:52.821695" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.821515" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.821187" elapsed="0.000882"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:52.822217" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:52.823006" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:52.822737" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:52.823185" elapsed="0.002407"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:52.806926" elapsed="0.018744"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:52.825954" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:52.825831" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.825787" elapsed="0.000234"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:55:52.828634" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:55:52.826191" elapsed="0.002470"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:55:52.828708" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:52.828861" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:52.759907" elapsed="0.068978"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:52.828951" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:55:52.829096" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:55:52.757328" elapsed="0.071793"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:52.829170" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:55:52.829313" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:55:52.747805" elapsed="0.081532"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:55:52.743370" elapsed="0.086026"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:55:52.738875" elapsed="0.090553"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.839702" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:52.839375" elapsed="0.000354"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:52.839774" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:52.839920" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:52.839033" elapsed="0.000911"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.853373" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.853125" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.853828" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.853587" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.854276" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.854034" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.854725" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.854469" elapsed="0.000297"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:52.855563" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:55:52.855360" elapsed="0.000230"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:55:52.855909" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:55:52.855742" elapsed="0.000192"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:55:52.856082" elapsed="0.000206"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.856712" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.856449" elapsed="0.000307"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:55:52.856797" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:52.856951" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:55:52.854962" elapsed="0.002013"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:52.924190" level="INFO">POST Request : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:55:52.924347" level="INFO">POST Response : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:52.924590" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:52.859111" elapsed="0.065543"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.857046" elapsed="0.067709"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.925152" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:52.924813" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.857029" elapsed="0.068319"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.932829" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.927739" elapsed="0.005134"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.927176" elapsed="0.005731"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.927136" elapsed="0.005795"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.935584" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.933206" elapsed="0.002426"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.932987" elapsed="0.002679"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.932970" elapsed="0.002720"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.936237" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:52.935855" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.936587" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:52.936333" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.937131" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:52.936832" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.936670" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.936315" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.937753" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:52.937373" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.938080" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:52.937849" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.938631" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:52.938319" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.938160" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.937831" elapsed="0.000882"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:52.938946" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:52.939748" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:52.939457" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:52.939930" elapsed="0.002517"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:52.926174" elapsed="0.016336"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:55:52.942704" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:52.942598" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.942579" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:55:52.945334" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:55:52.942918" elapsed="0.002443"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:55:52.945409" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:52.945581" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:52.850307" elapsed="0.095300"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:52.945711" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:52.945864" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:55:52.847777" elapsed="0.098111"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:52.945938" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:55:52.946083" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:55:52.838493" elapsed="0.107614"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:55:52.834111" elapsed="0.112057"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:55:52.829510" elapsed="0.116691"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:55:52.654203" elapsed="0.292028"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.957487" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:52.957189" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:52.957576" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:52.957726" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:52.956842" elapsed="0.000908"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.964244" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.963978" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.964704" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.964444" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:52.971151" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:52.971207" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:55:52 GMT', 'Expires': 'Thu, 09 Apr 2026 23:55:52 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782552,"status":200} 
 </msg>
<msg time="2026-04-10T00:55:52.971298" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:52.966963" elapsed="0.004361"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.964814" elapsed="0.006553"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.971559" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:52.971393" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.964796" elapsed="0.006849"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.975327" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782552,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.972823" elapsed="0.002552"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.972598" elapsed="0.002811"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.972580" elapsed="0.002853"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.978215" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:52.975726" elapsed="0.002535"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.975488" elapsed="0.002808"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.975471" elapsed="0.002848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.978870" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:52.978486" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.979198" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:52.978966" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.979861" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:52.979437" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.979279" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.978948" elapsed="0.001032"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.980716" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:52.980176" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.981175" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:52.980852" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.982092" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:52.981513" elapsed="0.000617"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:52.981286" elapsed="0.000894"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.980828" elapsed="0.001381"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:52.982419" elapsed="0.000697"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:52.983941" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:52.983350" elapsed="0.000627"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:52.984212" elapsed="0.011113"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:52.972157" elapsed="0.023232"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:55:52.995580" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:55:52.995459" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:52.995441" elapsed="0.000355"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:52.995946" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:55:52.996017" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:55:52.998290" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782552,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:52.958084" elapsed="0.040234"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:52.998369" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:55:52.998516" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782552,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:55:52.956376" elapsed="0.042236"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:52.999596" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782552, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:52.999174" elapsed="0.000451"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:55:52.999673" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:52.999826" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782552, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:55:52.998835" elapsed="0.001017"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:53.000231" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:53.000032" elapsed="0.000224"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:55:53.000765" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:55:53.000441" elapsed="0.000350"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:55:53.001229" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:55:53.000967" elapsed="0.000287"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:55:53.001806" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:55:53.001427" elapsed="0.000453">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:55:52.951945" elapsed="0.050049">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:54.016487" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:54.015811" elapsed="0.000705"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:54.016586" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:55:54.016747" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:54.014894" elapsed="0.001877"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:54.023484" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:54.023171" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:54.023952" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:54.023708" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:54.031232" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:54.031329" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:55:54 GMT', 'Expires': 'Thu, 09 Apr 2026 23:55:54 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782554,"status":200} 
 </msg>
<msg time="2026-04-10T00:55:54.031424" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:54.026125" elapsed="0.005326"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:54.024066" elapsed="0.007428"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:54.031697" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:54.031522" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:54.024046" elapsed="0.007738"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:54.035503" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782554,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:54.032955" elapsed="0.002619"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:54.032730" elapsed="0.002886"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:54.032713" elapsed="0.002929"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:54.039028" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:54.035938" elapsed="0.003139"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:54.035702" elapsed="0.003411"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:54.035682" elapsed="0.003455"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:54.039816" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:54.039368" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:54.040153" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:54.039915" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:54.041021" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:54.040396" elapsed="0.000663"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:54.040234" elapsed="0.000874"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:54.039897" elapsed="0.001241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:54.041886" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:54.041360" elapsed="0.000563"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:54.042340" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:54.042019" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:54.043288" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:54.042696" elapsed="0.000631"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:54.042453" elapsed="0.000924"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:54.041994" elapsed="0.001412"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:54.043668" elapsed="0.000681"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:54.045261" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:54.044672" elapsed="0.000626"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:54.045513" elapsed="0.010602"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:54.032283" elapsed="0.023896"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:55:54.056356" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:55:54.056249" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:54.056231" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:54.056605" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:55:54.056678" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:55:54.058926" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782554,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:54.017119" elapsed="0.041835"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:54.059005" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:54.059154" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782554,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:55:54.013653" elapsed="0.045527"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:54.060197" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782554, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:54.059801" elapsed="0.000424"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:55:54.060273" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:54.060425" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782554, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:55:54.059416" elapsed="0.001035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:54.060945" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:54.060764" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:55:54.061447" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:55:54.061145" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:55:54.061918" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:55:54.061659" elapsed="0.000284"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:55:54.062454" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:55:54.062111" elapsed="0.000416">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:55:54.002807" elapsed="0.059847">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:55.076511" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:55.075745" elapsed="0.000862"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:55.076728" elapsed="0.000083"/>
</return>
<msg time="2026-04-10T00:55:55.077088" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:55.074894" elapsed="0.002248"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:55.085251" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:55.084988" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:55.085716" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:55.085455" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:55.093285" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:55.093409" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:55:55 GMT', 'Expires': 'Thu, 09 Apr 2026 23:55:55 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782555,"status":200} 
 </msg>
<msg time="2026-04-10T00:55:55.093508" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:55.087890" elapsed="0.005645"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:55.085836" elapsed="0.007764"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:55.093783" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:55.093628" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:55.085814" elapsed="0.008055"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:55.097794" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782555,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:55.095270" elapsed="0.002573"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:55.095046" elapsed="0.002833"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:55.095028" elapsed="0.002875"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:55.101218" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:55.098183" elapsed="0.003101"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:55.097960" elapsed="0.003374"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:55.097944" elapsed="0.003423"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:55.102200" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:55.101661" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:55.102721" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:55.102338" elapsed="0.000467"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:55.103788" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:55.103153" elapsed="0.000674"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:55.102838" elapsed="0.001041"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:55.102313" elapsed="0.001596"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:55.104670" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:55.104134" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:55.105136" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:55.104807" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:55.106067" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:55.105474" elapsed="0.000631"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:55.105249" elapsed="0.000905"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:55.104782" elapsed="0.001402"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:55.106398" elapsed="0.000717"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:55.107965" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:55.107349" elapsed="0.000653"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:55.108222" elapsed="0.008997"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:55.094386" elapsed="0.022897"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:55:55.117461" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:55:55.117355" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:55.117336" elapsed="0.000322"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:55.117812" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:55:55.117883" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:55:55.120164" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782555,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:55.077933" elapsed="0.042293"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:55.120281" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:55.120434" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782555,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:55:55.073819" elapsed="0.046641"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:55.121434" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782555, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:55.121039" elapsed="0.000426"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:55:55.121513" elapsed="0.000222"/>
</return>
<msg time="2026-04-10T00:55:55.121869" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782555, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:55:55.120697" elapsed="0.001199"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:55.122254" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:55.122073" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:55:55.122803" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:55:55.122454" elapsed="0.000375"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:55:55.123264" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:55:55.123002" elapsed="0.000288"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:55:55.123828" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:55:55.123462" elapsed="0.000434">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:55:55.063627" elapsed="0.060377">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.138516" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.138008" elapsed="0.000575"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:56.138668" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T00:55:56.138903" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:56.137395" elapsed="0.001544"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.148153" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.147781" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.148848" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.148460" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:56.158588" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:56.158658" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:55:56 GMT', 'Expires': 'Thu, 09 Apr 2026 23:55:56 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782556,"status":200} 
 </msg>
<msg time="2026-04-10T00:55:56.158799" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:56.151924" elapsed="0.006905"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.149009" elapsed="0.009866"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.159065" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.158903" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.148983" elapsed="0.010174"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.163382" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782556,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.160396" elapsed="0.003066"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.160167" elapsed="0.003465"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.160148" elapsed="0.003521"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.168887" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.164111" elapsed="0.004855"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.163781" elapsed="0.005235"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.163749" elapsed="0.005302"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.170007" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.169304" elapsed="0.000742"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.170483" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.170149" elapsed="0.000444"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.171565" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.170938" elapsed="0.000669"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.170630" elapsed="0.001029"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.170123" elapsed="0.001566"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.172514" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.171987" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.173119" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.172688" elapsed="0.000515"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.174222" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.173463" elapsed="0.000798"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.173237" elapsed="0.001074"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.172663" elapsed="0.001679"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:56.174583" elapsed="0.000690"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:56.176130" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.175509" elapsed="0.000658"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.176383" elapsed="0.009394"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:56.159718" elapsed="0.026131"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:55:56.186035" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:55:56.185922" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.185902" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.186280" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.186352" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:55:56.188678" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782556,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:56.139416" elapsed="0.049292"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:56.188770" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:56.188925" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782556,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:55:56.136722" elapsed="0.052230"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.190272" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782556, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.189856" elapsed="0.000445"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:55:56.190349" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:56.190502" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782556, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:55:56.189180" elapsed="0.001404"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:56.190981" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.190783" elapsed="0.000224"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.191495" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:55:56.191183" elapsed="0.000339"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.192104" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:55:56.191835" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.192302" elapsed="0.000329"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:55:56.125016" elapsed="0.067677"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:55:52.951339" elapsed="3.241414"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:55:52.950939" elapsed="3.241877"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:55:52.946419" elapsed="3.246430"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.205133" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.204822" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:56.205207" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:56.205360" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:56.204445" elapsed="0.000940"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.212313" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.212050" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.212783" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.212519" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:56.221221" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:56.221301" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:55:56 GMT', 'Expires': 'Thu, 09 Apr 2026 23:55:56 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782556,"status":200} 
 </msg>
<msg time="2026-04-10T00:55:56.221431" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:56.214973" elapsed="0.006497"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.212897" elapsed="0.008635"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.221854" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.221595" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.212878" elapsed="0.009098"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.227247" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782556,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.223635" elapsed="0.003687"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.223297" elapsed="0.004074"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.223272" elapsed="0.004134"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.231375" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.227831" elapsed="0.003610"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.227493" elapsed="0.003996"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.227469" elapsed="0.004053"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.232311" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.231774" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.232827" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.232448" elapsed="0.000551"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.234258" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.233269" elapsed="0.001036"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.233035" elapsed="0.001322"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.232423" elapsed="0.001965"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.235192" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.234654" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.235677" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.235329" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.236651" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.236038" elapsed="0.000651"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.235803" elapsed="0.000936"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.235304" elapsed="0.001465"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:56.236984" elapsed="0.000731"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:56.238540" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.237953" elapsed="0.000645"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.238818" elapsed="0.009128"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:56.222709" elapsed="0.025305"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:55:56.248197" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:55:56.248088" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.248069" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.248440" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.248515" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:55:56.250961" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782556,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:56.205753" elapsed="0.045237"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:56.251042" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:56.251192" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782556,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:55:56.203910" elapsed="0.047309"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.252223" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782556, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.251819" elapsed="0.000432"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:55:56.252306" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:56.252459" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782556, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:55:56.251445" elapsed="0.001040"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:56.253108" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.252928" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.253631" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:55:56.253310" elapsed="0.000347"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.254117" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:55:56.253854" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.254315" elapsed="0.000332"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:55:56.198589" elapsed="0.056120"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:55:56.197983" elapsed="0.056912"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:55:56.197568" elapsed="0.057391"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:55:56.192946" elapsed="0.062047"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.266517" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.266219" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:56.266607" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:56.266757" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:56.265870" elapsed="0.000912"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.273304" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.273053" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.273780" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.273509" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:56.281695" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:56.281768" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:55:56 GMT', 'Expires': 'Thu, 09 Apr 2026 23:55:56 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782556,"status":200} 
 </msg>
<msg time="2026-04-10T00:55:56.281880" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:56.275930" elapsed="0.005977"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.273892" elapsed="0.008066"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.282173" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.281990" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.273874" elapsed="0.008388"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.286358" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782556,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.283528" elapsed="0.002881"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.283295" elapsed="0.003151"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.283275" elapsed="0.003198"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.289245" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.286779" elapsed="0.002513"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.286533" elapsed="0.002794"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.286516" elapsed="0.002836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.290012" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.289579" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.290348" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.290110" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.291250" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.290676" elapsed="0.000611"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.290430" elapsed="0.000906"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.290093" elapsed="0.001273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.292113" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.291609" elapsed="0.000541"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.292605" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.292249" elapsed="0.000516"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.293679" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.293035" elapsed="0.000683"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.292802" elapsed="0.000966"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.292224" elapsed="0.001575"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:56.294016" elapsed="0.000700"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:56.295539" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.294952" elapsed="0.000687"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.295861" elapsed="0.010065"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:56.282834" elapsed="0.023164"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:55:56.306183" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:55:56.306071" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.306052" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.306429" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.306500" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:55:56.308776" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782556,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:56.267115" elapsed="0.041690"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:56.308858" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:56.309009" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782556,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:55:56.265370" elapsed="0.043665"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.310246" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782556, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.309848" elapsed="0.000426"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:55:56.310322" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:55:56.310476" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782556, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:55:56.309270" elapsed="0.001232"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:56.310879" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.310698" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.311383" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:55:56.311082" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.311874" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:55:56.311608" elapsed="0.000291"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.312073" elapsed="0.000311"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:55:56.260950" elapsed="0.051496"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:55:56.260352" elapsed="0.052148"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:55:56.259945" elapsed="0.052635"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:55:56.255095" elapsed="0.057521"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:55:52.946286" elapsed="3.366367"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.323828" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.323508" elapsed="0.000347"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:56.323955" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:55:56.324110" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:56.323153" elapsed="0.000981"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.330745" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.330479" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.331191" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.330948" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:56.338170" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:56.338228" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:55:56 GMT', 'Expires': 'Thu, 09 Apr 2026 23:55:56 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782556,"status":200} 
 </msg>
<msg time="2026-04-10T00:55:56.338322" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:56.333345" elapsed="0.005003"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.331302" elapsed="0.007090"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.338598" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.338419" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.331284" elapsed="0.007402"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.342174" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782556,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.339726" elapsed="0.002497"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.339484" elapsed="0.002773"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.339463" elapsed="0.002818"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.344936" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.342575" elapsed="0.002407"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.342337" elapsed="0.002680"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.342321" elapsed="0.002720"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.345778" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.345218" elapsed="0.000622"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.346215" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.345942" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.346926" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.346471" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.346302" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.345915" elapsed="0.001125"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.347798" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.347263" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.348259" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.347932" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.349023" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.348615" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.348371" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.347908" elapsed="0.001229"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:56.349350" elapsed="0.000553"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:56.350596" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.350150" elapsed="0.000486"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.350953" elapsed="0.003789"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:56.339050" elapsed="0.015787"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:55:56.355101" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T00:55:56.354941" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.354913" elapsed="0.000321"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.355457" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.355586" elapsed="0.000024"/>
</return>
<msg time="2026-04-10T00:55:56.358863" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782556,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:56.324478" elapsed="0.034414"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:56.358945" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:56.359098" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782556,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:55:56.322684" elapsed="0.036441"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:55:56.359172" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:55:56.359318" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782556,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 1. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:55:56.318119" elapsed="0.041226"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.360457" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782556, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.359939" elapsed="0.000547"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:55:56.360533" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:55:56.360713" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782556, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:55:56.359591" elapsed="0.001149"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:56.361096" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.360918" elapsed="0.000203"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.361595" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:55:56.361298" elapsed="0.000396"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:55:56.317678" elapsed="0.044074"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:55:56.312853" elapsed="0.048935"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.372322" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.372025" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:56.372394" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:56.372554" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:56.371676" elapsed="0.000906"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.379368" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.379078" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.379873" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.379625" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:56.387320" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:56.387421" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:55:56 GMT', 'Expires': 'Thu, 09 Apr 2026 23:55:56 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782556,"status":200} 
 </msg>
<msg time="2026-04-10T00:55:56.387522" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:56.382194" elapsed="0.005375"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.379985" elapsed="0.007629"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.387795" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.387640" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.379967" elapsed="0.007914"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.391315" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782556,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.388903" elapsed="0.002461"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.388679" elapsed="0.002720"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.388661" elapsed="0.002763"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.394114" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.391724" elapsed="0.002436"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.391482" elapsed="0.002713"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.391465" elapsed="0.002754"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.394904" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.394386" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.395372" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.395041" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.396157" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.395737" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.395485" elapsed="0.000759"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.395016" elapsed="0.001258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.397018" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.396497" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.397479" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.397152" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.398269" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.397861" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.397631" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.397127" elapsed="0.001255"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:56.398614" elapsed="0.000481"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:56.399731" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.399326" elapsed="0.000442"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.399983" elapsed="0.003265"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:56.388238" elapsed="0.015096"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:55:56.403603" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:55:56.403431" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.403406" elapsed="0.000316"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.403929" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.404026" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:55:56.407179" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782556,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:56.372909" elapsed="0.034334"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:56.407299" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:56.407482" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782556,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:55:56.371213" elapsed="0.036310"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:55:56.407604" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:55:56.407841" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782556,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:55:56.366885" elapsed="0.041149"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.409095" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782556, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.408682" elapsed="0.000442"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:55:56.409174" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:56.409330" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782556, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:55:56.408315" elapsed="0.001041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:56.409780" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.409557" elapsed="0.000250"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.410272" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:55:56.409988" elapsed="0.000339"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:55:56.366438" elapsed="0.043947"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:55:56.361885" elapsed="0.048534"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.424517" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.423782" elapsed="0.000837"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:55:56.424733" elapsed="0.000070"/>
</return>
<msg time="2026-04-10T00:55:56.425088" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:55:56.422932" elapsed="0.002215"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.436747" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.436373" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.437368" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.437031" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:55:56.445260" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:55:56.445316" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:55:56 GMT', 'Expires': 'Thu, 09 Apr 2026 23:55:56 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782556,"status":200} 
 </msg>
<msg time="2026-04-10T00:55:56.445407" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:55:56.440393" elapsed="0.005040"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.437523" elapsed="0.007954"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.445697" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.445504" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.437498" elapsed="0.008287"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.449327" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782556,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.446802" elapsed="0.002613"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.446577" elapsed="0.002874"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.446558" elapsed="0.002918"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.452154" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.449794" elapsed="0.002407"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.449535" elapsed="0.002701"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.449517" elapsed="0.002743"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.452822" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.452428" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.453157" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.452921" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.453754" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.453400" elapsed="0.000382"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.453239" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.452903" elapsed="0.000937"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.454366" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.454003" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.454826" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.454468" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.455606" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:55:56.455165" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-04-10T00:55:56.454940" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.454445" elapsed="0.001279"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:56.455938" elapsed="0.000484"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:55:56.457058" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.456677" elapsed="0.000417"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.457314" elapsed="0.003270"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:55:56.446140" elapsed="0.014534"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:55:56.460920" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:55:56.460772" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.460747" elapsed="0.000293"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.461247" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.461346" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:55:56.464890" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782556,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:55:56.425980" elapsed="0.038956"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:55:56.465015" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:55:56.465250" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782556,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:55:56.421790" elapsed="0.043496"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:55:56.465351" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:55:56.465799" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782556,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 3. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:55:56.415888" elapsed="0.049950"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.467056" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782556, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:55:56.466631" elapsed="0.000511"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:55:56.467201" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:55:56.467357" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782556, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:55:56.466170" elapsed="0.001213"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:56.467758" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.467575" elapsed="0.000209"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.468239" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:55:56.467961" elapsed="0.000331"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:55:56.415403" elapsed="0.052945"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:55:56.410509" elapsed="0.057873"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:55:56.312710" elapsed="0.155702"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:55:52.645388" elapsed="3.823082"/>
</kw>
<arg>${restart_timeout}</arg>
<arg>2s</arg>
<arg>BulkomaticKeywords.Get Bulk Flow And Verify Count In Cluster</arg>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:55:52.630929" elapsed="3.837595"/>
</kw>
<doc>1000 Flows preserved in all controller instances.</doc>
<status status="PASS" start="2026-04-10T00:55:49.915851" elapsed="6.552833"/>
</test>
<test id="s1-s3-t11" name="Start Mininet Again Connect To Follower Node1" line="103">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:55:56.472529" elapsed="0.000231"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:55:56.472255" elapsed="0.000560"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.473836" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:56.473727" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.473709" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.479093" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:56.478986" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.478967" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.480170" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:56.479787" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.480680" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:55:56.480359" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:55:56.480751" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:55:56.480907" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:55:56.479390" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.486332" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:56.486227" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.486209" elapsed="0.000190"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.487559" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:56.487438" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.487421" elapsed="0.000209"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:56.488067" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.487773" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:56.488473" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:56.488254" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:56.549110" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:55:56.489021" elapsed="0.060307"/>
</kw>
<msg time="2026-04-10T00:55:56.549753" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:55:56.549947" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:56.488681" elapsed="0.061353"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:55:56.670111" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:55:56.551230" elapsed="0.119089"/>
</kw>
<msg time="2026-04-10T00:55:56.670492" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:55:56.670539" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:56.550422" elapsed="0.120176"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.670926" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.670687" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.670659" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.671459" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.671152" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.671861" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.671642" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.671623" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:55:56.671971" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:56.673417" elapsed="0.000805"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.674505" elapsed="0.000626"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:56.675406" elapsed="0.000390"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:56.672803" elapsed="0.003094"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:56.672244" elapsed="0.003719"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:55:56.487139" elapsed="0.188923"/>
</kw>
<msg time="2026-04-10T00:55:56.676154" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:56.676198" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:56.486572" elapsed="0.189663"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:55:56.676418" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:55:56.676312" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.676294" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.676919" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.677254" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.677326" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:55:56.485889" elapsed="0.191545"/>
</kw>
<msg time="2026-04-10T00:55:56.677600" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:56.677645" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:56.481300" elapsed="0.196381"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.678061" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.677805" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.677786" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:55:56.481157" elapsed="0.197003"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.683452" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:56.683346" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.683328" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.684777" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:56.684671" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.684654" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:56.685281" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.684989" elapsed="0.000318"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:56.685715" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:56.685479" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:56.744710" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:55:56.686238" elapsed="0.058569"/>
</kw>
<msg time="2026-04-10T00:55:56.744965" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:55:56.745012" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:56.685901" elapsed="0.059147"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:55:56.869010" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:55:56.745635" elapsed="0.123514"/>
</kw>
<msg time="2026-04-10T00:55:56.869316" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:55:56.869379" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:56.745239" elapsed="0.124177"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.869760" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.869497" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.869476" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:56.870289" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:56.869984" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.870680" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.870445" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.870427" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:55:56.870790" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:56.872220" elapsed="0.000786"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.873286" elapsed="0.000507"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:56.874060" elapsed="0.000352"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:56.871604" elapsed="0.002970"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:56.871046" elapsed="0.003596"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:55:56.684349" elapsed="0.190432"/>
</kw>
<msg time="2026-04-10T00:55:56.874874" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:56.874918" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:56.683796" elapsed="0.191159"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:55:56.875137" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:55:56.875031" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.875013" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.875634" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.877611" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.877691" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:55:56.683011" elapsed="0.194793"/>
</kw>
<msg time="2026-04-10T00:55:56.877899" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:56.877944" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:56.678424" elapsed="0.199558"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:56.878312" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:56.878058" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.878041" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:55:56.678281" elapsed="0.200131"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.883861" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:56.883755" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.883736" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:56.885084" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:56.884978" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:56.884960" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:56.885647" level="INFO">${karaf_connection_index} = 307</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:56.885297" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:56.886053" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:56.885836" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:56.956650" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:55:56.886602" elapsed="0.070166"/>
</kw>
<msg time="2026-04-10T00:55:56.956932" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:55:56.956979" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:56.886241" elapsed="0.070774"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:55:57.092396" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:55:56.957590" elapsed="0.134939"/>
</kw>
<msg time="2026-04-10T00:55:57.092712" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:55:57.092757" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:56.957190" elapsed="0.135605"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:57.093102" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:57.092875" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:57.092856" elapsed="0.000376"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:57.093731" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:57.093412" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:57.094109" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:57.093890" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:57.093872" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:55:57.094217" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:57.095886" elapsed="0.000773"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:57.096939" elapsed="0.000463"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:57.097689" elapsed="0.000348"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:57.095032" elapsed="0.003104"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:57.094479" elapsed="0.003722"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:55:56.884674" elapsed="0.213625"/>
</kw>
<msg time="2026-04-10T00:55:57.098391" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:57.098435" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:56.884083" elapsed="0.214389"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:55:57.098673" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:55:57.098565" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:57.098531" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:57.099150" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:57.099485" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:57.099572" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:55:56.883396" elapsed="0.216287"/>
</kw>
<msg time="2026-04-10T00:55:57.099775" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:57.099818" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:56.878697" elapsed="0.221157"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:57.100177" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:57.099929" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:57.099912" elapsed="0.000340"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:55:56.878531" elapsed="0.221745"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:55:56.480987" elapsed="0.619319"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:55:56.478620" elapsed="0.621740"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:55:56.473398" elapsed="0.627017"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:56.472970" elapsed="0.627492"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:55:56.470045" elapsed="0.630470"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:57.103766" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:57.103513" elapsed="0.000299"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:57.106342" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:57.106076" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:57.106059" elapsed="0.000362"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:57.106719" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:57.106583" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:57.107376" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:57.106999" elapsed="0.000423"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:57.107960" level="INFO">${conn_id} = 313</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:57.107597" elapsed="0.000389"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:55:57.108884" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:55:57.108960" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:55:57.108611" elapsed="0.000373"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:57.109143" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:55:57.110338" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:55:57.529695" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:55:10 UTC 2026

  System load:  0.0                Processes:             109
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:55:12 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:55:57.110022" elapsed="0.419789"/>
</kw>
<msg time="2026-04-10T00:55:57.529883" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:57.109665" elapsed="0.420288"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:55:57.108203" elapsed="0.421852"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:55:57.530500" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:55:58.666301" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:55:58.666719" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:55:58.666843" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:55:57.530276" elapsed="1.136629"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:58.667377" elapsed="0.000622"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:58.669122" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:58.668423" elapsed="0.000821"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:58.669795" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:58.669450" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:58.669377" 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-04-10T00:55:58.670485" elapsed="0.000100"/>
</return>
<status status="PASS" start="2026-04-10T00:55:58.670198" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:58.670163" elapsed="0.000569"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:58.670824" elapsed="0.000039"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:58.676883" elapsed="0.000772"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:58.678164" elapsed="0.000303"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:58.678767" elapsed="0.000170"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:58.671624" elapsed="0.007396"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:55:57.105431" elapsed="1.573732"/>
</kw>
<msg time="2026-04-10T00:55:58.679247" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:57.104870" elapsed="1.574459"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:55:57.104371" elapsed="1.575080"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:58.682498" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:58.682203" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:58.682183" elapsed="0.000422"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:58.682926" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:55:58.682779" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:58.683629" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:58.683221" elapsed="0.000458"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:58.684232" level="INFO">${conn_id} = 315</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:58.683854" elapsed="0.000405"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:55:58.685233" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:55:58.685312" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:55:58.684947" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:58.685499" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:55:58.686742" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:55:59.032019" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:55:10 UTC 2026

  System load:  0.0                Processes:             109
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:55:57 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:55:58.686390" elapsed="0.345777"/>
</kw>
<msg time="2026-04-10T00:55:59.032250" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:58.686028" elapsed="0.346333"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:55:58.684504" elapsed="0.348092"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:55:59.033084" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:55:59.065277" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:55:59.065581" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:55:59.065695" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:55:59.032840" elapsed="0.032910"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:59.066155" elapsed="0.000514"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:59.067799" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:59.067114" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:59.068422" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:59.068086" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:59.068035" elapsed="0.000597"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:55:59.069020" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-04-10T00:55:59.068764" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:59.068726" elapsed="0.000492"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:55:59.069298" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:59.076108" elapsed="0.000619"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:59.076897" elapsed="0.000161"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:55:59.077208" elapsed="0.000099"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:59.070076" elapsed="0.007284"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:55:58.681649" elapsed="0.395804"/>
</kw>
<msg time="2026-04-10T00:55:59.077507" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:58.680793" elapsed="0.396780"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:55:58.679777" elapsed="0.397883"/>
</kw>
<arg>${mininet}</arg>
<status status="PASS" start="2026-04-10T00:55:57.104018" elapsed="1.973701"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:59.082859" level="INFO">${tools_connection} = 317</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:55:59.082471" elapsed="0.000415"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:55:59.084692" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:55:59.084769" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:55:59.084394" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:59.084953" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:55:59.086122" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:55:59.408605" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:55:10 UTC 2026

  System load:  0.0                Processes:             109
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:55:58 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:55:59.085812" elapsed="0.322941"/>
</kw>
<msg time="2026-04-10T00:55:59.408835" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:59.085440" elapsed="0.323470"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:55:59.083863" elapsed="0.325261"/>
</kw>
<msg time="2026-04-10T00:55:59.409177" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:59.083450" elapsed="0.325774"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:55:59.083070" elapsed="0.326233"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-10T00:55:59.409353" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:55:59.409582" level="INFO">${mininet_conn_id} = 317</msg>
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-10T00:55:59.081964" elapsed="0.327646"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:59.410648" level="INFO">${mininet_conn_id} = 317</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:55:59.409882" elapsed="0.000812"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:59.412928" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:59.410777" elapsed="0.002209"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:59.410754" elapsed="0.002258"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:59.413474" level="INFO">Start mininet --topo tree,1 to 10.30.170.169</msg>
<arg>Start mininet ${options} to ${controller}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:59.413171" elapsed="0.000349"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:59.415949" level="INFO">sudo mn --controller 'remote,ip=10.30.170.169,port=6633' --topo tree,1 --switch ovsk,protocols=OpenFlow13</msg>
<arg>sudo mn --controller 'remote,ip=${controller},port=${ofport}' ${options} --switch ovsk,protocols=OpenFlow${ofversion}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:55:59.413705" elapsed="0.002302"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:55:59.572907" level="INFO">[?2004l*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2 
*** Adding switches:
s1 
*** Adding links:
(s1, h1) (s1, h2) 
*** Configuring hosts
h1 h2 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:55:59.416201" elapsed="0.156860"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:59.573747" level="INFO">Check OVS configuratiom</msg>
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:59.573374" elapsed="0.000419"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:59.574977" level="INFO">sh ovs-vsctl show</msg>
<arg>sh ovs-vsctl show</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:55:59.573970" elapsed="0.001063"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:55:59.584638" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Bridge s1
        Controller "ptcp:6654"
        Controller "tcp:10.30.170.169:6633"
        fail_mode: secure
        Port s1
            Interface s1
                type: internal
        Port s1-eth1
            Interface s1-eth1
        Port s1-eth2
            Interface s1-eth2
    ovs_version: "2.17.11"
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:55:59.575193" elapsed="0.009507"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="PASS" start="2026-04-10T00:55:59.584751" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:55:59.584986" level="INFO">${mininet_conn_id} = 317</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${Follower_Node_1}_IP}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="PASS" start="2026-04-10T00:55:57.100838" elapsed="2.484174"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:55:59.585568" level="INFO">${mininet_conn_id} = 317</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:55:59.585215" elapsed="0.000396"/>
</kw>
<doc>Start mininet with connection to follower node1.</doc>
<status status="PASS" start="2026-04-10T00:55:56.469374" elapsed="3.116356"/>
</test>
<test id="s1-s3-t12" name="Verify Flows In Switch After Cluster Restart" line="110">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:55:59.589890" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:55:59.589620" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:59.591238" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:59.591100" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:59.591078" elapsed="0.000231"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:59.596331" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:59.596223" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:59.596204" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:55:59.597425" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:55:59.597036" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:55:59.597942" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:55:59.597633" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:55:59.598086" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:55:59.598251" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:55:59.596652" elapsed="0.001624"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:59.603933" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:59.603823" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:59.603803" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:59.605217" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:59.605110" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:59.605092" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:59.605766" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:59.605433" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:59.606200" level="INFO">${current_connection_index} = 317</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:59.605955" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:59.689988" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:55:59.606750" elapsed="0.083388"/>
</kw>
<msg time="2026-04-10T00:55:59.690322" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:55:59.690370" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:59.606389" elapsed="0.084018"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:55:59.836806" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:55:59.691007" elapsed="0.145957"/>
</kw>
<msg time="2026-04-10T00:55:59.837137" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:55:59.837183" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:59.690634" elapsed="0.146586"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:59.837602" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:59.837316" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:59.837289" elapsed="0.000400"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:55:59.838162" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:55:59.837838" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:59.838540" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:59.838321" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:59.838303" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:55:59.838672" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:59.841458" elapsed="0.000193"/>
</kw>
<msg time="2026-04-10T00:55:59.841714" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:55:59.840214" elapsed="0.001637"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:59.842133" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:59.842494" elapsed="0.000095"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:55:59.839540" elapsed="0.003162"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:55:59.838983" elapsed="0.003919"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:55:59.604805" elapsed="0.238219"/>
</kw>
<msg time="2026-04-10T00:55:59.843122" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:59.843167" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:59.604177" elapsed="0.239028"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:55:59.843395" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:55:59.843285" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:59.843266" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:59.843914" elapsed="0.000042"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:59.844276" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:55:59.844347" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:55:59.603458" elapsed="0.241001"/>
</kw>
<msg time="2026-04-10T00:55:59.844570" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:55:59.844617" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:59.598692" elapsed="0.245962"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:55:59.844985" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:55:59.844731" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:59.844714" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:55:59.598525" elapsed="0.246561"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:59.850831" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:59.850723" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:59.850704" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:55:59.852083" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:55:59.851975" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:55:59.851956" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:55:59.852622" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:55:59.852300" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:55:59.853042" level="INFO">${current_connection_index} = 317</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:55:59.852808" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:55:59.904357" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:55:59.853585" elapsed="0.050878"/>
</kw>
<msg time="2026-04-10T00:55:59.904650" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:55:59.904697" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:59.853229" elapsed="0.051505"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:00.018140" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:55:59.905260" elapsed="0.113037"/>
</kw>
<msg time="2026-04-10T00:56:00.018477" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:00.018523" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:59.904910" elapsed="0.113734"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:00.019009" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:00.018743" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:00.018717" elapsed="0.000376"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:00.019585" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:00.019241" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:00.020007" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:00.019749" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:00.019730" elapsed="0.000356"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:00.020122" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:00.022842" elapsed="0.000176"/>
</kw>
<msg time="2026-04-10T00:56:00.023079" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:00.021635" elapsed="0.001579"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:00.023489" elapsed="0.000096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:00.023864" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:00.020985" elapsed="0.003065"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:00.020416" elapsed="0.003698"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:55:59.851644" elapsed="0.172570"/>
</kw>
<msg time="2026-04-10T00:56:00.024311" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:00.024356" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:59.851052" elapsed="0.173343"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:00.024679" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:56:00.024472" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:00.024454" elapsed="0.000314"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:00.025170" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:00.025504" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:00.025649" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:55:59.850272" elapsed="0.175490"/>
</kw>
<msg time="2026-04-10T00:56:00.025859" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:00.025904" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:59.845369" elapsed="0.180595"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:00.026396" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:00.026043" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:00.026026" elapsed="0.000449"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:55:59.845224" elapsed="0.181276"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:00.032147" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:00.032037" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:00.032018" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:00.033418" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:00.033309" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:00.033291" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:00.033962" level="INFO">${karaf_connection_index} = 307</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:00.033659" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:00.034389" level="INFO">${current_connection_index} = 317</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:00.034153" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:00.086186" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:00.034938" elapsed="0.051386"/>
</kw>
<msg time="2026-04-10T00:56:00.086508" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:00.086579" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:00.034597" elapsed="0.052021"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:00.182022" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:00.087210" elapsed="0.094966"/>
</kw>
<msg time="2026-04-10T00:56:00.182346" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:00.182392" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:00.086825" elapsed="0.095604"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:00.182816" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:00.182528" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:00.182501" elapsed="0.000398"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:00.183370" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "C "l "u "s "t "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:00.183047" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:00.183805" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:00.183534" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:00.183517" elapsed="0.000369"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:00.183922" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:00.186784" elapsed="0.000177"/>
</kw>
<msg time="2026-04-10T00:56:00.187023" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:00.185460" elapsed="0.001697"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:00.187437" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:00.187823" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:00.184818" elapsed="0.003191"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:00.184226" elapsed="0.003957"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:00.032964" elapsed="0.155327"/>
</kw>
<msg time="2026-04-10T00:56:00.188390" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:00.188435" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:00.032373" elapsed="0.156104"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:00.188684" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:56:00.188575" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:00.188540" elapsed="0.000282"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:00.189228" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:00.189588" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:00.189662" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:00.031658" elapsed="0.158116"/>
</kw>
<msg time="2026-04-10T00:56:00.189872" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:00.189917" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:00.026790" elapsed="0.163165"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:00.190284" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:00.190032" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:00.190015" elapsed="0.000347"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:00.026646" elapsed="0.163740"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:55:59.598338" elapsed="0.592082"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:55:59.595823" elapsed="0.594657"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:55:59.590791" elapsed="0.599748"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:55:59.590310" elapsed="0.600292"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:55:59.587091" elapsed="0.603567"/>
</kw>
<kw name="Verify Aggregate Flow From Mininet Session" owner="MininetKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:00.192805" elapsed="0.000166"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:00.192343" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:00.192326" elapsed="0.000707"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:00.193472" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:00.193204" elapsed="0.000295"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:00.194373" elapsed="0.000158"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:00.194153" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:00.194135" elapsed="0.000471"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:00.197084" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:00.194749" elapsed="0.002392"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:56:00.219592" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<msg time="2026-04-10T00:56:00.219692" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:56:00.197306" elapsed="0.022413"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:56:00.219785" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:56:00.219944" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 317 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:56:00.193850" elapsed="0.026122"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:56:00.220391" level="INFO">${flows} = ['0']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:56:00.220143" elapsed="0.000273"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:00.220972" level="INFO">${total_flows} = 0</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:00.220594" elapsed="0.000405"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:56:00.221472" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-04-10T00:56:00.221635" level="FAIL">0.0 != 1000.0</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-04-10T00:56:00.221186" elapsed="0.000525">0.0 != 1000.0</status>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="FAIL" start="2026-04-10T00:56:00.192037" elapsed="0.029783">0.0 != 1000.0</status>
</kw>
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:02.224241" elapsed="0.000417"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:02.223705" elapsed="0.001050"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.223658" elapsed="0.001155"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:02.225891" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:02.225210" elapsed="0.000763"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:02.228018" elapsed="0.000243"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:02.227533" elapsed="0.000784"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.227494" elapsed="0.000859"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.231722" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:02.228593" elapsed="0.003216"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.258582" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<msg time="2026-04-10T00:56:02.258841" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:56:02.232052" elapsed="0.026834"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:56:02.258988" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T00:56:02.259280" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 317 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:56:02.226844" elapsed="0.032477"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:56:02.260062" level="INFO">${flows} = ['1000']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:56:02.259654" elapsed="0.000446"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:02.260976" level="INFO">${total_flows} = 1000</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:02.260341" elapsed="0.000674"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:56:02.261767" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-04-10T00:56:02.261319" elapsed="0.000535"/>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="PASS" start="2026-04-10T00:56:02.222827" elapsed="0.039115"/>
</kw>
<arg>${time_out}</arg>
<arg>2s</arg>
<arg>MininetKeywords.Check Flows In Mininet</arg>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:56:00.191360" elapsed="2.070657"/>
</kw>
<arg>${mininet_conn_id}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${operation_timeout}</arg>
<doc>Verify flow count per switch</doc>
<status status="PASS" start="2026-04-10T00:56:00.190871" elapsed="2.071238"/>
</kw>
<doc>Verify flows are installed in switch after cluster restart.</doc>
<status status="PASS" start="2026-04-10T00:55:59.586348" elapsed="2.675935"/>
</test>
<test id="s1-s3-t13" name="Stop Mininet Connected To Follower Node1" line="117">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:56:02.268465" elapsed="0.000247"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:56:02.268178" elapsed="0.000594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:02.269836" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:02.269711" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.269689" elapsed="0.000220"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:02.274923" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:02.274815" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.274796" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:02.276020" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:02.275624" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:02.276518" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:02.276212" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:02.276606" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:56:02.276793" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:02.275225" elapsed="0.001600"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:02.282405" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:02.282294" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.282275" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:02.283704" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:02.283597" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.283578" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:02.284227" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:02.283920" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.284682" level="INFO">${current_connection_index} = 317</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:02.284419" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.327074" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:02.285204" elapsed="0.042090"/>
</kw>
<msg time="2026-04-10T00:56:02.327573" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:02.327629" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:02.284869" elapsed="0.042801"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.418006" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:02.328361" elapsed="0.089908"/>
</kw>
<msg time="2026-04-10T00:56:02.418500" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:02.418576" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:02.327925" elapsed="0.090692"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.419115" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:02.418773" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.418735" elapsed="0.000467"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:02.419747" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:02.419350" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.420126" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:02.419908" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.419890" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:02.420240" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:02.423173" elapsed="0.000177"/>
</kw>
<msg time="2026-04-10T00:56:02.423412" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:02.421864" elapsed="0.001705"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.423881" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.424215" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:02.421164" elapsed="0.003362"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:02.420586" elapsed="0.004022"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:02.283268" elapsed="0.141499"/>
</kw>
<msg time="2026-04-10T00:56:02.424864" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:02.424908" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:02.282643" elapsed="0.142304"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:02.425136" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:56:02.425027" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.425007" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.425666" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.426012" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:02.426082" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:02.281945" elapsed="0.144245"/>
</kw>
<msg time="2026-04-10T00:56:02.426286" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:02.426329" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:02.277319" elapsed="0.149047"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.426737" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:02.426443" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.426426" elapsed="0.000388"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:02.277170" elapsed="0.149668"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:02.432371" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:02.432261" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.432242" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:02.433634" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:02.433509" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.433492" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:02.434181" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:02.433852" elapsed="0.000357"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.434656" level="INFO">${current_connection_index} = 317</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:02.434386" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.480752" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:02.435217" elapsed="0.045911"/>
</kw>
<msg time="2026-04-10T00:56:02.481633" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:02.481745" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:02.434871" elapsed="0.046960"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.595240" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:02.483289" elapsed="0.112302"/>
</kw>
<msg time="2026-04-10T00:56:02.595866" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:02.595922" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:02.482311" elapsed="0.113655"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.596664" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:02.596254" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.596210" elapsed="0.000560"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:02.597393" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:02.596944" elapsed="0.000562"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.597886" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:02.597627" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.597605" elapsed="0.000385"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:02.598038" elapsed="0.000054"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:02.601480" elapsed="0.000199"/>
</kw>
<msg time="2026-04-10T00:56:02.601743" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:02.600016" elapsed="0.001980"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.602286" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.602652" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:02.599214" elapsed="0.003627"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:02.598442" elapsed="0.004464"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:02.433206" elapsed="0.169798"/>
</kw>
<msg time="2026-04-10T00:56:02.603101" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:02.603145" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:02.432612" elapsed="0.170572"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:02.603372" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:56:02.603262" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.603243" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.603888" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.604227" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:02.604300" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:02.431900" elapsed="0.172507"/>
</kw>
<msg time="2026-04-10T00:56:02.604502" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:02.604573" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:02.427123" elapsed="0.177490"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.604942" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:02.604691" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.604673" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:02.426969" elapsed="0.178072"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:02.610496" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:02.610388" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.610369" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:02.611851" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:02.611739" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.611721" elapsed="0.000260"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:02.612453" level="INFO">${karaf_connection_index} = 307</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:02.612135" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.613066" level="INFO">${current_connection_index} = 317</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:02.612809" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.659423" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:02.613633" elapsed="0.046043"/>
</kw>
<msg time="2026-04-10T00:56:02.660091" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:02.660141" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:02.613260" elapsed="0.046919"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.762081" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:02.660899" elapsed="0.104002"/>
</kw>
<msg time="2026-04-10T00:56:02.765129" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:02.765178" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:02.660433" elapsed="0.104783"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.765702" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:02.765338" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.765294" elapsed="0.000499"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:02.766326" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:02.765939" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.766745" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:02.766484" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.766465" elapsed="0.000359"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:02.766861" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:02.769745" elapsed="0.000183"/>
</kw>
<msg time="2026-04-10T00:56:02.769991" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:02.768446" elapsed="0.001681"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.770410" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.770912" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:02.767781" elapsed="0.003322"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:02.767181" elapsed="0.003990"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:02.611408" elapsed="0.159908"/>
</kw>
<msg time="2026-04-10T00:56:02.771417" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:02.771461" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:02.610765" elapsed="0.160733"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:02.771808" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:56:02.771686" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.771574" elapsed="0.000322"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.772320" elapsed="0.000102"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.772762" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:02.772837" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:02.610029" elapsed="0.162918"/>
</kw>
<msg time="2026-04-10T00:56:02.773041" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:02.773085" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:02.605315" elapsed="0.167806"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.773450" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:02.773197" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.773180" elapsed="0.000348"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:02.605171" elapsed="0.168397"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:02.276985" elapsed="0.496619"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:56:02.274426" elapsed="0.499235"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:56:02.269391" elapsed="0.504329"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:02.268934" elapsed="0.504831"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:56:02.263944" elapsed="0.509873"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:02.778992" elapsed="0.000174"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:02.778763" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.778745" elapsed="0.000483"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.782024" level="INFO">exit</msg>
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:02.779369" elapsed="0.002716"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.942781" level="INFO">*** Stopping 1 controllers
c0 
*** Stopping 2 links
..
*** Stopping 1 switches
s1 
*** Stopping 2 hosts
h1 h2 
*** Done
completed in 3.467 seconds
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:56:02.782251" elapsed="0.160737"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:02.943280" elapsed="0.000247"/>
</kw>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="PASS" start="2026-04-10T00:56:02.778315" elapsed="0.165310"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:02.946383" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:02.946060" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:02.946035" elapsed="0.000493"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.946887" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:02.946707" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:02.947625" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:02.947187" elapsed="0.000491"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.948229" level="INFO">${conn_id} = 318</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:02.947842" elapsed="0.000413"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:56:02.949625" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:56:02.949707" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:56:02.949313" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:02.949994" elapsed="0.000354"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:56:02.951264" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:56:03.263750" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:55:10 UTC 2026

  System load:  0.0                Processes:             109
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:55:59 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:56:02.950930" elapsed="0.312987"/>
</kw>
<msg time="2026-04-10T00:56:03.264004" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:02.950558" elapsed="0.313528"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:56:02.948891" elapsed="0.315314"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:56:03.264721" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:56:04.452619" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:56:04.453211" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:56:04.453339" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:56:03.264455" elapsed="1.188950"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:04.454135" elapsed="0.000948"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:04.456512" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:04.455704" elapsed="0.000987"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:04.457312" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:04.456917" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:04.456852" elapsed="0.000654"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:56:04.458010" elapsed="0.000083"/>
</return>
<status status="PASS" start="2026-04-10T00:56:04.457674" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:04.457636" elapsed="0.000612"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:04.458332" elapsed="0.000035"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:04.462856" elapsed="0.000499"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:04.463624" elapsed="0.000253"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:04.464092" 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-04-10T00:56:04.458974" elapsed="0.005357"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:56:02.945491" elapsed="1.518977"/>
</kw>
<msg time="2026-04-10T00:56:04.464571" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:02.944871" elapsed="1.519783"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:56:02.944328" elapsed="1.520442"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:04.467979" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:04.467582" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:04.467534" elapsed="0.000559"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:04.468523" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:04.468312" elapsed="0.000564"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:04.469674" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:04.469099" elapsed="0.000676"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:04.470843" level="INFO">${conn_id} = 320</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:04.469999" elapsed="0.000871"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:56:04.471827" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:56:04.471904" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:56:04.471495" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:04.472088" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:56:04.473277" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:56:04.799859" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:55:10 UTC 2026

  System load:  0.0                Processes:             109
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:56:03 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:56:04.472951" elapsed="0.327061"/>
</kw>
<msg time="2026-04-10T00:56:04.800094" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:04.472592" elapsed="0.327579"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:56:04.471097" elapsed="0.329187"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:56:04.800809" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:56:04.833115" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:56:04.833355" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:56:04.833452" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:56:04.800531" elapsed="0.032972"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:04.833935" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:04.835422" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:04.834817" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:04.836003" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:04.835717" elapsed="0.000393"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:04.835670" elapsed="0.000490"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:56:04.836506" elapsed="0.000086"/>
</return>
<status status="PASS" start="2026-04-10T00:56:04.836277" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:04.836244" elapsed="0.000481"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:04.836802" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:04.842847" elapsed="0.000322"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:04.843338" elapsed="0.000157"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:04.843742" elapsed="0.000102"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:04.837490" elapsed="0.006407"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:56:04.466792" elapsed="0.377199"/>
</kw>
<msg time="2026-04-10T00:56:04.844047" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:04.465947" elapsed="0.378150"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:56:04.465169" elapsed="0.379009"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:02.943896" elapsed="1.900339"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="PASS" start="2026-04-10T00:56:02.263003" elapsed="2.581339"/>
</test>
<test id="s1-s3-t14" name="Delete All Flows From Follower Node1" line="122">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:56:04.848404" elapsed="0.000231"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:56:04.848136" elapsed="0.000558"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:04.849713" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:04.849600" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:04.849581" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:04.854862" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:04.854753" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:04.854735" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:04.855930" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:04.855532" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:04.856417" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:04.856117" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:04.856486" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:04.856657" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:04.855156" elapsed="0.001526"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:04.862710" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:04.862599" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:04.862580" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:04.864245" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:04.864137" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:04.864119" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:04.864792" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:04.864462" elapsed="0.000357"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:04.865312" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:04.865092" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:04.905129" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:04.865885" elapsed="0.039343"/>
</kw>
<msg time="2026-04-10T00:56:04.905407" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:04.905456" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:04.865517" elapsed="0.040049"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:04.984309" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:04.906117" elapsed="0.078365"/>
</kw>
<msg time="2026-04-10T00:56:04.984666" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:04.984712" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:04.905771" elapsed="0.078977"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:04.985055" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:04.984827" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:04.984808" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:04.985618" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:04.985279" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:04.985992" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:04.985773" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:04.985755" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:04.986104" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:04.987558" elapsed="0.000773"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:04.988633" elapsed="0.000456"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:04.989356" elapsed="0.000392"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:04.986929" elapsed="0.002925"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:04.986378" elapsed="0.003541"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:04.863741" elapsed="0.126278"/>
</kw>
<msg time="2026-04-10T00:56:04.990110" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:04.990153" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:04.863121" elapsed="0.127068"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:04.990374" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:56:04.990266" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:04.990248" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:04.990875" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:04.991211" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:04.991284" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:04.862244" elapsed="0.129149"/>
</kw>
<msg time="2026-04-10T00:56:04.991485" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:04.991529" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:04.857059" elapsed="0.134520"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:04.991912" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:04.991657" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:04.991639" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:04.856914" elapsed="0.135098"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.003399" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:05.003093" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.003012" elapsed="0.000628"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.006817" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:05.006528" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.006489" elapsed="0.000484"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:05.008048" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.007308" elapsed="0.000802"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:05.009009" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:05.008479" elapsed="0.000589"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:05.051412" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:05.009968" elapsed="0.041556"/>
</kw>
<msg time="2026-04-10T00:56:05.051723" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:05.051770" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.009477" elapsed="0.042329"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:05.138811" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:05.052352" elapsed="0.086717"/>
</kw>
<msg time="2026-04-10T00:56:05.139305" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:05.139354" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.051992" elapsed="0.087399"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.139910" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.139522" elapsed="0.000452"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.139483" elapsed="0.000520"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.140599" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.140156" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.141024" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.140760" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.140737" elapsed="0.000372"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:05.141151" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:05.143175" elapsed="0.000802"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.144279" elapsed="0.000504"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:05.145055" elapsed="0.000389"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:05.142144" elapsed="0.003425"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:05.141529" elapsed="0.004110"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:05.005840" elapsed="0.139902"/>
</kw>
<msg time="2026-04-10T00:56:05.145840" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:05.145886" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.004242" elapsed="0.141680"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:05.146111" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:56:05.146003" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.145984" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.146722" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.147078" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.147152" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:05.002019" elapsed="0.145247"/>
</kw>
<msg time="2026-04-10T00:56:05.147365" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:05.147409" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:04.992281" elapsed="0.155165"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.147798" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.147525" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.147507" elapsed="0.000371"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:04.992138" elapsed="0.155763"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.153521" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:05.153408" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.153388" elapsed="0.000220"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.154790" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:05.154677" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.154659" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:05.155311" level="INFO">${karaf_connection_index} = 307</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.155005" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:05.155742" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:05.155501" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:05.193951" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:05.156276" elapsed="0.037775"/>
</kw>
<msg time="2026-04-10T00:56:05.194211" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:05.194257" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.155934" elapsed="0.038357"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:05.277788" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:05.194832" elapsed="0.083433"/>
</kw>
<msg time="2026-04-10T00:56:05.278521" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:05.278598" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.194462" elapsed="0.084176"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.279100" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.278764" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.278729" elapsed="0.000459"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.279758" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "1 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.279337" elapsed="0.000514"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.280137" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.279919" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.279901" elapsed="0.000418"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:05.280359" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:05.281988" elapsed="0.000827"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.283106" elapsed="0.000524"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:05.283910" elapsed="0.000368"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:05.281320" elapsed="0.003100"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:05.280714" elapsed="0.003775"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:05.154351" elapsed="0.130268"/>
</kw>
<msg time="2026-04-10T00:56:05.284729" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:05.284779" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.153765" elapsed="0.131055"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:05.285045" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:56:05.284918" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.284894" 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 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.285642" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.286328" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.286417" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:05.153030" elapsed="0.133503"/>
</kw>
<msg time="2026-04-10T00:56:05.286654" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:05.286698" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.148184" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.287082" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.286813" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.286795" elapsed="0.000365"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:05.148039" elapsed="0.139144"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:04.856740" elapsed="0.430479"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:56:04.854365" elapsed="0.432918"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:56:04.849280" elapsed="0.438064"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:04.848852" elapsed="0.438540"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:56:04.845496" elapsed="0.441954"/>
</kw>
<kw name="Delete Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Delete Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.302405" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:05.301932" elapsed="0.000516"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:05.302525" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:56:05.302756" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:05.301429" elapsed="0.001359"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.317447" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.317117" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.318038" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.317794" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.318487" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.318239" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.318943" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.318702" elapsed="0.000286"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:05.319832" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:56:05.319616" elapsed="0.000242"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:56:05.320188" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:56:05.320016" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.320366" elapsed="0.000225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.321001" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.320751" elapsed="0.000295"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:56:05.321092" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:56:05.321267" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:56:05.319191" elapsed="0.002119"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:05.343422" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Content-Length': '402', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:56:05.343473" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:05.343603" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:05.323728" elapsed="0.019903"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.321396" elapsed="0.022282"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.343860" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.343707" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.321374" elapsed="0.022574"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.347372" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.344996" elapsed="0.002420"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.344771" elapsed="0.002681"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.344753" elapsed="0.002723"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.350103" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.347769" elapsed="0.002381"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.347532" elapsed="0.002653"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.347515" elapsed="0.002694"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.350804" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:05.350390" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.351137" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.350901" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.351695" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:05.351380" elapsed="0.000956"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.351217" elapsed="0.001266"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.350883" elapsed="0.001630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.353237" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:05.352795" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.353677" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.353423" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.354231" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:05.353923" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.353760" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.353403" elapsed="0.000917"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:05.354477" elapsed="0.000379"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:05.355307" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:05.355025" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.355516" elapsed="0.002376"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:05.344313" elapsed="0.013647"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.358139" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:05.358034" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.358016" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:05.360735" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:05.358352" elapsed="0.002410"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:05.360810" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:05.360964" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:05.314423" elapsed="0.046565"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:05.361053" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:56:05.361198" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.311683" elapsed="0.049539"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:05.361292" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:56:05.361438" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.300534" elapsed="0.060928"/>
</kw>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Delete Bulk Flow in member 2 according to ${json_body_del}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.294631" elapsed="0.066893"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.368570" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:05.368254" elapsed="0.000345"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:05.368646" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:05.368801" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:05.367902" elapsed="0.000924"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.375477" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.375221" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.375955" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.375702" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:05.389636" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:05.389705" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:05 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:05 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782565,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:05.389847" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:05.378332" elapsed="0.011542"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.376071" elapsed="0.013846"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.390098" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.389943" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.376052" elapsed="0.014131"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.393589" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782565,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.391204" elapsed="0.002434"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.390977" elapsed="0.002695"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.390959" elapsed="0.002755"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.399607" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.394342" elapsed="0.005368"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.393836" elapsed="0.005950"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.393799" elapsed="0.006039"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.401037" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:05.400198" elapsed="0.000897"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.401771" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.401299" elapsed="0.000532"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.402314" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:05.402016" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.401854" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.401212" elapsed="0.001184"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.402930" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:05.402570" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.403258" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.403026" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.403807" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:05.403497" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.403337" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.403008" elapsed="0.000880"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:05.404038" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:05.404832" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:05.404541" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.405011" elapsed="0.002495"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:05.390539" elapsed="0.017047"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:05.407767" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:56:05.407656" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.407638" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.407998" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.408069" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:56:05.410345" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782565,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:05.369164" elapsed="0.041242"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:05.410461" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:05.410629" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782565,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.367417" elapsed="0.043238"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.411629" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782565, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:05.411215" elapsed="0.000442"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:05.411705" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:05.411859" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782565, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:05.410876" elapsed="0.001008"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:05.412241" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.412065" elapsed="0.000200"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.412760" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:05.412444" elapsed="0.000342"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.413217" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:05.412959" elapsed="0.000324"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.413460" elapsed="0.000339"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:56:05.362813" elapsed="0.051046"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:56:05.362160" elapsed="0.051747"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 2.</doc>
<status status="PASS" start="2026-04-10T00:56:05.361763" elapsed="0.052202"/>
</kw>
<arg>${temp_json_config_del}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Delete Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:56:05.293736" elapsed="0.120280"/>
</kw>
<doc>1000 Flows deleted via Follower Node1 and verify it gets applied in all instances.</doc>
<status status="PASS" start="2026-04-10T00:56:04.844816" elapsed="0.569331"/>
</test>
<test id="s1-s3-t15" name="Verify No Flows In Cluster" line="129">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:56:05.418108" elapsed="0.000202"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:56:05.417844" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.419349" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:05.419241" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.419223" elapsed="0.000193"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.424367" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:05.424263" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.424246" elapsed="0.000188"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.425568" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:05.425048" elapsed="0.000550"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.426069" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:05.425762" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:05.426138" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:05.426292" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.424673" elapsed="0.001642"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.433947" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:05.433766" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.433731" elapsed="0.000333"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.436191" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:05.435860" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.435836" elapsed="0.000452"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:05.436913" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.436493" elapsed="0.000457"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:05.437497" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:05.437168" elapsed="0.000361"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:05.478758" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:05.438445" elapsed="0.040600"/>
</kw>
<msg time="2026-04-10T00:56:05.479368" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:05.479440" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.437775" elapsed="0.041721"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:05.554475" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:05.480564" elapsed="0.074060"/>
</kw>
<msg time="2026-04-10T00:56:05.554792" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:05.554840" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.479895" elapsed="0.074983"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.555263" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.554990" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.554957" elapsed="0.000395"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.555841" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.555504" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.556220" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.555999" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.555981" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:05.556339" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:05.558024" elapsed="0.000790"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.559099" elapsed="0.000504"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:05.559870" elapsed="0.000392"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:05.557335" elapsed="0.003032"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:05.556713" elapsed="0.003719"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:05.435324" elapsed="0.125211"/>
</kw>
<msg time="2026-04-10T00:56:05.560658" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:05.560703" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.434345" elapsed="0.126396"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:05.560928" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:56:05.560820" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.560802" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.561453" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.561890" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.561965" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:05.433061" elapsed="0.129017"/>
</kw>
<msg time="2026-04-10T00:56:05.562178" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:05.562222" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.426771" elapsed="0.135488"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.562606" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.562337" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.562320" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:05.426579" elapsed="0.136129"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.568380" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:05.568273" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.568255" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.569741" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:05.569635" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.569617" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:05.570257" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.569955" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:05.570680" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:05.570443" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:05.609433" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:05.571205" elapsed="0.038327"/>
</kw>
<msg time="2026-04-10T00:56:05.609734" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:05.609781" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.570865" elapsed="0.038953"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:05.691044" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:05.610331" elapsed="0.080928"/>
</kw>
<msg time="2026-04-10T00:56:05.691472" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:05.691519" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.609990" elapsed="0.081593"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.692034" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.691707" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.691670" elapsed="0.000455"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.692681" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.692276" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.693058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.692839" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.692820" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:05.693206" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:05.694906" elapsed="0.000780"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.695971" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:05.696730" elapsed="0.000376"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:05.694236" elapsed="0.002976"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:05.693639" elapsed="0.003637"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:05.569309" elapsed="0.128069"/>
</kw>
<msg time="2026-04-10T00:56:05.697476" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:05.697520" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.568710" elapsed="0.128863"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:05.697766" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:56:05.697654" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.697636" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.698267" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.698631" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.698704" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:05.567922" elapsed="0.130893"/>
</kw>
<msg time="2026-04-10T00:56:05.698911" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:05.698956" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.563007" elapsed="0.135987"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.699320" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.699070" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.699054" elapsed="0.000342"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:05.562861" elapsed="0.136559"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.707824" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:05.707713" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.707693" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.709038" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:05.708933" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.708915" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:05.709602" level="INFO">${karaf_connection_index} = 307</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.709275" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:05.710013" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:05.709792" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:05.747591" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:05.710536" elapsed="0.037300"/>
</kw>
<msg time="2026-04-10T00:56:05.748080" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:05.748128" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.710198" elapsed="0.037965"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:05.818219" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:05.748909" elapsed="0.069662"/>
</kw>
<msg time="2026-04-10T00:56:05.818806" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:05.818854" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.748422" elapsed="0.070468"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.819359" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.819013" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.818977" elapsed="0.000473"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.820013" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.819618" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.820378" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.820161" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.820143" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:05.820495" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:05.822121" elapsed="0.000790"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.823195" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:05.823961" elapsed="0.000365"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:05.821452" elapsed="0.002978"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:05.820851" elapsed="0.003643"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:05.708630" elapsed="0.115979"/>
</kw>
<msg time="2026-04-10T00:56:05.824706" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:05.824750" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.708045" elapsed="0.116741"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:05.825199" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:56:05.825091" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.825072" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.825724" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.826078" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.826151" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:05.707342" elapsed="0.118919"/>
</kw>
<msg time="2026-04-10T00:56:05.826359" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:05.826404" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.699726" elapsed="0.126713"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.826813" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.826517" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.826500" elapsed="0.000405"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:05.699578" elapsed="0.127350"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:05.426375" elapsed="0.400591"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:56:05.423908" elapsed="0.403118"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:56:05.418958" elapsed="0.408163"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:05.418517" elapsed="0.408654"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:56:05.415458" elapsed="0.411770"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.839165" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:05.838779" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.839677" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:05.839354" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:05.839749" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:05.839901" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.838371" elapsed="0.001555"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.850140" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:05.849840" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:05.850212" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:05.850358" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:05.849475" elapsed="0.000907"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.863857" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.863605" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.864299" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.864061" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.864760" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.864498" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.865220" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.864957" elapsed="0.000306"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:05.866091" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:56:05.865887" elapsed="0.000230"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:56:05.866441" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:56:05.866272" elapsed="0.000194"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.866632" elapsed="0.000207"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.867240" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.866997" elapsed="0.000286"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:56:05.867325" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:05.867479" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:56:05.865468" elapsed="0.002035"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:05.882921" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:56:05.883038" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:05.883256" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:05.869846" elapsed="0.013452"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.867590" elapsed="0.015800"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.883897" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.883571" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.867571" elapsed="0.016650"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.889455" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.885950" elapsed="0.003584"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.885607" elapsed="0.004013"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.885578" elapsed="0.004083"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.893589" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.890123" elapsed="0.003550"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.889761" elapsed="0.003978"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.889730" elapsed="0.004050"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.894783" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:05.894108" elapsed="0.000714"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.895300" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.894938" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.896230" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:05.895691" elapsed="0.000579"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.895422" elapsed="0.000901"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.894908" elapsed="0.001448"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.897244" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:05.896628" elapsed="0.000655"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.897748" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.897391" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.898294" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:05.897993" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.897830" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.897364" elapsed="0.001012"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:05.898560" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:05.899382" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:05.899084" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.899580" elapsed="0.002568"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:05.884839" elapsed="0.017392"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.902457" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:05.902333" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.902305" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:05.905262" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:05.902738" elapsed="0.002557"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:05.905355" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:56:05.905558" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:05.860921" elapsed="0.044664"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:05.905657" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:56:05.905809" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.858320" elapsed="0.047514"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:05.905981" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:56:05.906133" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.849031" elapsed="0.057126"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.844590" elapsed="0.061633"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:05.840120" elapsed="0.066140"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.917116" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:05.916713" elapsed="0.000436"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:05.917212" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:56:05.917385" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:05.916324" elapsed="0.001086"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.931221" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.930960" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.931678" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.931423" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.932124" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.931883" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.932570" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.932319" elapsed="0.000296"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:05.933513" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:56:05.933313" elapsed="0.000226"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:56:05.933879" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:56:05.933710" elapsed="0.000195"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.934056" elapsed="0.000200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.934673" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.934410" elapsed="0.000309"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:56:05.934765" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:05.934920" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:56:05.932866" elapsed="0.002079"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:05.945782" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:56:05.945831" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:05.945919" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:05.937165" elapsed="0.008779"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.935027" elapsed="0.010963"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.946170" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.946017" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.935006" elapsed="0.011251"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.949991" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.947294" elapsed="0.002759"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.947069" elapsed="0.003033"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.947051" elapsed="0.003084"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.953815" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.950520" elapsed="0.003359"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.950212" elapsed="0.003795"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.950189" elapsed="0.003853"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.954862" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:05.954289" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.955331" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.955001" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.956110" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:05.955690" elapsed="0.000457"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.955444" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.954976" elapsed="0.001250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.956992" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:05.956447" elapsed="0.000583"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:05.957453" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:05.957129" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.958225" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:05.957817" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.957587" elapsed="0.000723"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.957104" elapsed="0.001235"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:05.958570" elapsed="0.000483"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:05.959697" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:05.959282" elapsed="0.000452"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.959999" elapsed="0.002940"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:05.946633" elapsed="0.016370"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:05.963178" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:05.963075" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.963057" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:05.965829" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:05.963390" elapsed="0.002466"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:05.965904" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:05.966057" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:05.928269" elapsed="0.037812"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:05.966145" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:56:05.966291" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.925701" elapsed="0.040614"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:05.966365" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:56:05.966507" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.915854" elapsed="0.050677"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.911144" elapsed="0.055464"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:05.906372" elapsed="0.060270"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.976764" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:05.976446" elapsed="0.000344"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:05.976875" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:05.977046" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:05.976075" elapsed="0.000997"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.990878" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.990625" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.991317" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.991080" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.991780" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.991517" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.992213" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.991976" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:05.993067" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:56:05.992867" elapsed="0.000226"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:56:05.993411" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:56:05.993246" elapsed="0.000190"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:56:05.993601" elapsed="0.000185"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:05.994186" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:05.993944" elapsed="0.000285"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:56:05.994270" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:05.994424" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:56:05.992450" elapsed="0.001998"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:06.004664" level="INFO">POST Request : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:56:06.004718" level="INFO">POST Response : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:06.004823" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:05.996604" elapsed="0.008245"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:05.994519" elapsed="0.010377"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:06.005126" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:06.004922" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:05.994501" elapsed="0.010716"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.012485" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:06.007159" elapsed="0.005453"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:06.006649" elapsed="0.006043"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:06.006601" elapsed="0.006148"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.018163" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:06.013399" elapsed="0.004811"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:06.012876" elapsed="0.005367"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:06.012838" elapsed="0.005429"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.018813" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:06.018429" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:06.019146" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:06.018912" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.019701" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:06.019387" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:06.019226" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:06.018894" elapsed="0.000946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.020366" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:06.020004" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:06.020715" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:06.020463" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.021267" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:06.020973" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:06.020797" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:06.020446" elapsed="0.000905"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:06.021502" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:06.022298" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:06.022030" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:06.022479" elapsed="0.002575"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:06.005611" elapsed="0.019507"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:06.025297" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:06.025192" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:06.025173" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:06.027978" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:06.025512" elapsed="0.002493"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:06.028055" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:06.028208" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:05.987799" elapsed="0.040434"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:06.028298" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:56:06.028444" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.985087" elapsed="0.043381"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:06.028518" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:56:06.028679" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.975636" elapsed="0.053067"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.971205" elapsed="0.057560"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:05.966737" elapsed="0.062060"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:05.839984" elapsed="0.188844"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.040374" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:06.040007" elapsed="0.000400"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:06.040469" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:56:06.040664" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:06.039631" elapsed="0.001060"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.048058" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:06.047672" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.048685" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:06.048409" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:06.057094" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:06.057198" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:06 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782566,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:06.057351" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:06.051041" elapsed="0.006341"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:06.048828" elapsed="0.008618"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:06.057770" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:06.057488" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:06.048802" elapsed="0.009065"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.062370" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782566,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:06.059110" elapsed="0.003352"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:06.058853" elapsed="0.003732"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:06.058831" elapsed="0.003816"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.067163" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:06.063193" elapsed="0.004067"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:06.062779" elapsed="0.004551"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:06.062736" elapsed="0.004638"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.068436" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:06.067754" elapsed="0.000724"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:06.069045" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:06.068630" elapsed="0.000522"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.070009" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:06.069512" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:06.069194" elapsed="0.001006"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:06.068595" elapsed="0.001638"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.071039" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:06.070477" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:06.071528" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:06.071181" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.072357" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:06.071916" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:06.071674" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:06.071155" elapsed="0.001324"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:06.072748" elapsed="0.000584"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:06.073933" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:06.073602" elapsed="0.000358"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:06.074117" elapsed="0.002441"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:06.058324" elapsed="0.018309"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:06.076828" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:56:06.076711" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:06.076692" 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-04-10T00:56:06.077180" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:06.077252" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:56:06.079589" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782566,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:06.041065" elapsed="0.038554"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:06.079675" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:06.079837" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782566,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:06.039076" elapsed="0.040787"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.080901" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782566, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:06.080479" elapsed="0.000464"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:06.080999" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:06.081158" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782566, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:06.080112" elapsed="0.001072"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:06.081559" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:06.081364" elapsed="0.000223"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.082071" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:06.081763" elapsed="0.000337"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.082536" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:06.082272" elapsed="0.000306"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:56:06.083187" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:56:06.082757" elapsed="0.000508">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:56:06.034595" elapsed="0.048788">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:07.095808" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:07.095236" elapsed="0.000624"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:07.095951" elapsed="0.000060"/>
</return>
<msg time="2026-04-10T00:56:07.096205" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:07.094433" elapsed="0.001811"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:07.104123" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:07.103847" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:07.104627" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:07.104335" elapsed="0.000337"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:07.113467" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:07.113530" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:07 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:07 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782567,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:07.113650" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:07.106914" elapsed="0.006763"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:07.104750" elapsed="0.008972"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:07.114010" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:07.113832" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:07.104729" elapsed="0.009370"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:07.118286" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782567,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:07.115160" elapsed="0.003200"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:07.114929" elapsed="0.003483"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:07.114910" elapsed="0.003537"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:07.122687" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:07.118964" elapsed="0.003804"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:07.118531" elapsed="0.004291"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:07.118506" elapsed="0.004353"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:07.123725" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:07.123119" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:07.124224" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:07.123871" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:07.125036" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:07.124704" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:07.124345" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:07.123844" elapsed="0.001280"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:07.125698" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:07.125286" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:07.126047" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:07.125804" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:07.126612" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:07.126289" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:07.126130" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:07.125784" elapsed="0.000913"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:07.126859" elapsed="0.000393"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:07.127778" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:07.127427" elapsed="0.000378"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:07.127965" elapsed="0.002574"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:07.114472" elapsed="0.016156"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:07.130815" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:56:07.130703" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:07.130683" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:07.131060" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:07.131132" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:56:07.134043" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782567,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:07.096868" elapsed="0.037205"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:07.134127" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:07.134286" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782567,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:07.093372" elapsed="0.040941"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:07.135528" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782567, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:07.135090" elapsed="0.000487"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:07.135675" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:56:07.135846" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782567, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:07.134674" elapsed="0.001200"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:07.136241" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:07.136055" elapsed="0.000212"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:07.136877" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:07.136480" elapsed="0.000426"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:07.137421" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:07.137081" elapsed="0.000367"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:56:07.138077" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:56:07.137700" elapsed="0.000453">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:56:07.084351" elapsed="0.053917">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:08.150430" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:08.150056" elapsed="0.000408"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:08.150524" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T00:56:08.150713" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:08.149692" elapsed="0.001046"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:08.157568" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:08.157282" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:08.158030" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:08.157782" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:08.165445" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:08.165504" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:08 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:08 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782568,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:08.165620" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:08.160244" elapsed="0.005403"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:08.158149" elapsed="0.007544"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:08.165879" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:08.165720" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:08.158128" elapsed="0.007835"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:08.169736" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782568,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:08.166979" elapsed="0.002827"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:08.166755" elapsed="0.003100"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:08.166737" elapsed="0.003152"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:08.173627" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:08.170279" elapsed="0.003414"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:08.169966" elapsed="0.003776"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:08.169943" elapsed="0.003833"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:08.174631" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:08.174018" elapsed="0.000651"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:08.175198" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:08.174858" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:08.176018" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:08.175568" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:08.175314" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:08.174831" elapsed="0.001306"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:08.176895" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:08.176363" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:08.177365" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:08.177032" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:08.178154" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:08.177728" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:08.177479" elapsed="0.000763"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:08.177007" elapsed="0.001265"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:08.178489" elapsed="0.000519"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:08.179662" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:08.179241" elapsed="0.000459"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:08.179950" elapsed="0.002679"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:08.166321" elapsed="0.016374"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:08.182876" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:56:08.182767" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:08.182748" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:08.183115" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:08.183187" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:56:08.185476" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782568,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:08.151091" elapsed="0.034414"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:08.185572" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:08.185727" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782568,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:08.149176" elapsed="0.036577"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:08.186728" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782568, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:08.186310" elapsed="0.000446"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:08.186804" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:08.186959" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782568, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:08.185972" elapsed="0.001013"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:08.187341" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:08.187163" elapsed="0.000204"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:08.187858" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:08.187540" elapsed="0.000358"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:08.188336" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:08.188071" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:56:08.188938" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:56:08.188531" elapsed="0.000476">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:56:08.139191" elapsed="0.049924">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.200755" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:09.200229" elapsed="0.000570"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:09.200880" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:56:09.201115" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:09.199715" elapsed="0.001435"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.208651" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:09.208360" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.209103" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:09.208858" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:09.216135" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:09.216197" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:09 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:09 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782569,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:09.216297" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:09.211321" elapsed="0.005002"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:09.209224" elapsed="0.007145"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:09.216586" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:09.216400" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:09.209202" elapsed="0.007473"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.222016" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782569,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:09.217780" elapsed="0.004296"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:09.217530" elapsed="0.004585"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:09.217510" elapsed="0.004633"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.225525" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:09.222452" elapsed="0.003166"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:09.222206" elapsed="0.003466"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:09.222186" elapsed="0.003523"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.226600" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:09.225988" elapsed="0.000653"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:09.227105" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:09.226748" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.227970" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:09.227483" elapsed="0.000527"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:09.227225" elapsed="0.000839"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:09.226721" elapsed="0.001375"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.228897" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:09.228335" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:09.229391" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:09.229043" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.230222" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:09.229777" elapsed="0.000567"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:09.229512" elapsed="0.000890"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:09.229016" elapsed="0.001418"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:09.230693" elapsed="0.000523"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:09.231941" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:09.231482" elapsed="0.000497"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:09.232211" elapsed="0.003598"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:09.217080" elapsed="0.018809"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:09.236073" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:56:09.235963" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:09.235945" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:09.236324" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:09.236395" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:56:09.238690" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782569,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:09.201654" elapsed="0.037065"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:09.238773" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:09.238927" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782569,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:09.199008" elapsed="0.039945"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.239993" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782569, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:09.239588" elapsed="0.000434"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:09.240071" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:09.240227" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782569, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:09.239196" elapsed="0.001057"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:09.240633" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:09.240434" elapsed="0.000224"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.241148" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:09.240841" elapsed="0.000335"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.241627" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:09.241348" elapsed="0.000304"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:56:09.241826" elapsed="0.000314"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:56:09.190054" elapsed="0.052149"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:56:06.033989" elapsed="3.208265"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:06.033581" elapsed="3.208739"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:06.029044" elapsed="3.213310"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.253948" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:09.253635" elapsed="0.000341"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:09.254023" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:09.254177" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:09.253262" elapsed="0.000940"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.260881" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:09.260622" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.261329" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:09.261085" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:09.269976" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:09.270038" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:09 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:09 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782569,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:09.270164" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:09.263505" elapsed="0.006687"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:09.261442" elapsed="0.008794"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:09.270418" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:09.270264" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:09.261423" elapsed="0.009080"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.274057" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782569,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:09.271614" elapsed="0.002493"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:09.271323" elapsed="0.002819"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:09.271305" elapsed="0.002862"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.277373" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:09.274447" elapsed="0.002997"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:09.274224" elapsed="0.003272"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:09.274207" elapsed="0.003325"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.278418" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:09.277806" elapsed="0.000654"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:09.278960" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:09.278598" elapsed="0.000451"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.279872" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:09.279330" elapsed="0.000583"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:09.279086" elapsed="0.000883"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:09.278568" elapsed="0.001434"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.280809" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:09.280244" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:09.281303" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:09.280954" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.282124" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:09.281686" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:09.281424" elapsed="0.000801"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:09.280928" elapsed="0.001329"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:09.282512" elapsed="0.000552"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:09.283827" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:09.283313" elapsed="0.000543"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:09.284018" elapsed="0.002565"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:09.270903" elapsed="0.015835"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:09.286929" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:56:09.286815" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:09.286796" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:09.287176" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:09.287250" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:56:09.289656" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782569,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:09.254623" elapsed="0.035063"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:09.289739" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:09.289892" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782569,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:09.252805" elapsed="0.037113"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.290964" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782569, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:09.290565" elapsed="0.000427"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:09.291041" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:09.291195" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782569, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:09.290196" elapsed="0.001025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:09.291615" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:09.291415" elapsed="0.000226"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.292123" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:09.291819" elapsed="0.000329"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.292596" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:09.292320" elapsed="0.000302"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:56:09.293147" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:56:09.292795" elapsed="0.000425">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:56:09.248188" elapsed="0.045143">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.305714" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:10.305313" elapsed="0.000435"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:10.305810" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:56:10.305985" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:10.304939" elapsed="0.001071"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.313345" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.313079" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.313819" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.313568" 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-04-10T00:56:10.321647" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:10.321708" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:10 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:10 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782570,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:10.321873" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:10.316120" elapsed="0.005781"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.313943" elapsed="0.008002"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.322130" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.321972" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.313920" elapsed="0.008296"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.326651" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782570,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.323359" elapsed="0.003364"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.323131" elapsed="0.003642"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.323111" elapsed="0.003697"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.330655" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.327257" elapsed="0.003467"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.326917" elapsed="0.003856"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.326887" elapsed="0.003922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.331703" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.331118" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.332181" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.331844" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.332982" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:10.332524" elapsed="0.000496"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.332297" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.331818" elapsed="0.001285"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.333888" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.333329" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.334363" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.334029" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.335698" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:10.334733" elapsed="0.001007"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.334478" elapsed="0.001314"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.334003" elapsed="0.001821"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:10.336000" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:10.336855" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.336541" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.337040" elapsed="0.002446"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:10.322620" elapsed="0.016950"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:10.339757" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:56:10.339647" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.339628" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.340004" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:10.340077" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:56:10.342392" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782570,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:10.306393" elapsed="0.036030"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:10.342478" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:56:10.342673" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782570,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:10.304428" elapsed="0.038314"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.343873" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782570, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.343380" elapsed="0.000522"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:10.343953" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:56:10.344117" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782570, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:10.343024" elapsed="0.001120"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:10.344572" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.344364" elapsed="0.000236"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.345095" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:10.344783" elapsed="0.000341"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.345584" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:10.345299" elapsed="0.000313"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.345789" elapsed="0.000321"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:56:10.294395" elapsed="0.051776"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:56:09.247609" elapsed="1.098615"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:09.247168" elapsed="1.099122"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:09.242456" elapsed="1.103870"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.358183" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:10.357882" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:10.358257" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:10.358408" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:10.357514" elapsed="0.000919"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.365360" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.365106" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.365830" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.365582" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:10.374696" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:10.374755" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:10 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:10 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782570,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:10.374899" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:10.368103" elapsed="0.006830"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.365947" elapsed="0.009036"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.375173" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.375016" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.365928" elapsed="0.009332"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.380165" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782570,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.376471" elapsed="0.003764"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.376159" elapsed="0.004126"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.376134" elapsed="0.004255"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.384420" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.380827" elapsed="0.003661"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.380478" elapsed="0.004060"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.380453" elapsed="0.004150"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.385393" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.384843" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.385901" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.385531" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.386699" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:10.386248" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.386018" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.385506" elapsed="0.001312"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.387749" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.387150" elapsed="0.000639"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.388119" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.387881" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.388688" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:10.388364" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.388202" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.387863" elapsed="0.000910"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:10.388928" elapsed="0.000448"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:10.389970" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.389604" elapsed="0.000394"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.390185" elapsed="0.002844"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:10.375638" elapsed="0.017487"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:10.393338" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:56:10.393223" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.393202" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.393652" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:10.393760" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:56:10.396217" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782570,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:10.358798" elapsed="0.037449"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:10.396301" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:10.396460" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782570,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:10.357055" elapsed="0.039443"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.397680" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782570, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.397255" elapsed="0.000454"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:10.397758" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:10.397913" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782570, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:10.396830" elapsed="0.001109"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:10.398471" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.398243" elapsed="0.000254"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.399067" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:10.398689" elapsed="0.000406"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.399646" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:10.399269" elapsed="0.000414"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.399919" elapsed="0.000368"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:56:10.352511" elapsed="0.047841"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:56:10.351914" elapsed="0.048497"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:10.351401" elapsed="0.049105"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:10.346444" elapsed="0.054128"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:06.028884" elapsed="4.371735"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.413763" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:10.413347" elapsed="0.000445"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:10.413843" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:56:10.414035" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:10.412941" elapsed="0.001127"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.421988" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.421690" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.422503" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.422249" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:10.430087" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:10.430147" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:10 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:10 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782570,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:10.430243" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:10.424828" elapsed="0.005441"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.422677" elapsed="0.007635"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.430496" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.430339" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.422649" elapsed="0.007954"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.434055" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782570,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.431688" elapsed="0.002415"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.431447" elapsed="0.002690"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.431429" elapsed="0.002733"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.436778" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.434436" elapsed="0.002388"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.434217" elapsed="0.002642"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.434200" elapsed="0.002683"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.437440" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.437056" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.437793" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.437537" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.438419" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:10.438110" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.437937" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.437519" elapsed="0.000986"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.439068" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.438685" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.439403" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.439166" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.439984" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:10.439684" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.439485" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.439148" elapsed="0.000921"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:10.440224" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:10.441045" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.440759" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.441224" elapsed="0.002552"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:10.431022" elapsed="0.012821"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:10.444022" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:56:10.443914" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.443896" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.444260" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:10.444331" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:56:10.446602" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782570,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:10.414471" elapsed="0.032159"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:10.446683" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:10.446850" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782570,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:10.412372" elapsed="0.034504"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:56:10.446923" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:56:10.447065" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782570,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 1. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:56:10.406933" elapsed="0.040157"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.448073" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782570, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.447673" elapsed="0.000429"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:10.448150" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:10.448305" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782570, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:10.447312" elapsed="0.001019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:10.448707" level="INFO">${value} = 0</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.448510" elapsed="0.000222"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.449191" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:56:10.448911" elapsed="0.000336"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 0.</doc>
<status status="PASS" start="2026-04-10T00:56:10.406347" elapsed="0.042961"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:10.400895" elapsed="0.048500"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.460098" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:10.459790" elapsed="0.000335"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:10.460171" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:56:10.460321" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:10.459425" elapsed="0.000920"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.467108" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.466851" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.467586" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.467314" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:10.474864" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:10.474925" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:10 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:10 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782570,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:10.475024" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:10.469899" elapsed="0.005153"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.467714" elapsed="0.007380"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.475297" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.475121" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.467693" elapsed="0.007695"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.480131" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782570,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.476682" elapsed="0.003518"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.476349" elapsed="0.003900"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.476324" elapsed="0.003959"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.484071" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.480701" elapsed="0.003449"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.480360" elapsed="0.003839"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.480338" elapsed="0.003896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.485039" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.484472" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.485582" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.485189" elapsed="0.000480"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.486368" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:10.485939" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.485704" elapsed="0.000763"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.485161" elapsed="0.001335"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.487352" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.486761" elapsed="0.000629"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.487846" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.487491" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.488409" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:10.488094" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.487932" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.487466" elapsed="0.001032"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:10.488674" elapsed="0.000412"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:10.489599" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.489254" elapsed="0.000379"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.489809" elapsed="0.002423"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:10.475779" elapsed="0.016518"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:10.492472" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:56:10.492367" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.492349" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.492727" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:10.492807" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:56:10.495126" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782570,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:10.460700" elapsed="0.034455"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:10.495208" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:10.495360" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782570,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:10.458971" elapsed="0.036415"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:56:10.495432" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:56:10.495590" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782570,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:56:10.454498" elapsed="0.041119"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.496615" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782570, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.496207" elapsed="0.000436"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:10.496691" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:10.496845" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782570, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:10.495867" elapsed="0.001004"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:10.497225" level="INFO">${value} = 0</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.497047" elapsed="0.000202"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.497720" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:56:10.497424" elapsed="0.000351"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 0.</doc>
<status status="PASS" start="2026-04-10T00:56:10.454049" elapsed="0.043784"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:10.449495" elapsed="0.048373"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.508794" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:10.508478" elapsed="0.000344"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:10.508867" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:10.509015" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:10.508130" elapsed="0.000910"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.515555" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.515292" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.516002" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.515760" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:10.522968" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:10.523025" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:10 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:10 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782570,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:10.523118" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:10.518174" elapsed="0.004970"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.516115" elapsed="0.007073"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.523369" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.523216" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.516096" elapsed="0.007358"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.527002" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782570,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.524494" elapsed="0.002557"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.524274" elapsed="0.002812"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.524256" elapsed="0.002855"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.529746" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.527388" elapsed="0.002404"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.527167" elapsed="0.002660"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.527150" elapsed="0.002700"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.530393" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.530017" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.530743" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.530490" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.531321" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:10.531022" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.530857" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.530472" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.531988" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.531579" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.532447" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.532122" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.533218" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:10.532810" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:10.532582" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.532098" elapsed="0.001234"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:10.533559" elapsed="0.000486"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:10.534676" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.534274" elapsed="0.000438"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.534955" elapsed="0.003263"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:10.523855" elapsed="0.014450"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:10.538567" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:56:10.538401" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.538376" elapsed="0.000313"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.538920" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:10.539072" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:56:10.542238" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782570,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:10.509365" elapsed="0.032912"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:10.542349" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:56:10.542577" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782570,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:10.507673" elapsed="0.034942"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:56:10.542682" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:56:10.542924" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782570,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 3. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:56:10.503334" elapsed="0.039626"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.544174" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782570, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:10.543756" elapsed="0.000446"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:10.544250" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:10.544402" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782570, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:10.543264" elapsed="0.001164"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:10.544800" level="INFO">${value} = 0</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.544621" elapsed="0.000204"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.545279" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:56:10.545002" elapsed="0.000331"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 0.</doc>
<status status="PASS" start="2026-04-10T00:56:10.502892" elapsed="0.042498"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:10.498131" elapsed="0.047294"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:10.400700" elapsed="0.144756"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_del}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:56:05.836040" elapsed="4.709476"/>
</kw>
<doc>Verify flow count is 0 across cluster nodes.</doc>
<status status="PASS" start="2026-04-10T00:56:05.414839" elapsed="5.130822"/>
</test>
<test id="s1-s3-t16" name="Get Inventory Leader Before Leader Restart" line="136">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:56:10.549049" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:56:10.548780" elapsed="0.000529"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:10.550317" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:10.550209" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.550191" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:10.555853" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:10.555740" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.555720" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.556987" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:10.556575" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.557489" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:10.557177" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:10.557576" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:56:10.557741" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:10.556179" elapsed="0.001586"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:10.563300" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:10.563127" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.563108" elapsed="0.000263"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:10.564582" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:10.564452" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.564435" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:10.565096" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.564796" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:10.565515" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:10.565292" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:10.601028" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:10.566086" elapsed="0.035050"/>
</kw>
<msg time="2026-04-10T00:56:10.601325" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:10.601371" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:10.565720" elapsed="0.035687"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:10.701204" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:10.601968" elapsed="0.099421"/>
</kw>
<msg time="2026-04-10T00:56:10.701601" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:10.701649" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:10.601610" elapsed="0.100077"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.702100" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.701800" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.701766" elapsed="0.000418"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.702752" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.702344" elapsed="0.000500"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.703131" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.702912" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.702894" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:10.703243" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:10.704891" elapsed="0.000810"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.705983" elapsed="0.002223"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:10.708529" elapsed="0.000389"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:10.704222" elapsed="0.004801"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:10.703600" elapsed="0.005487"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:10.564150" elapsed="0.145039"/>
</kw>
<msg time="2026-04-10T00:56:10.709284" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:10.709328" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:10.563525" elapsed="0.145839"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:10.709632" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:56:10.709499" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.709479" elapsed="0.000241"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.710247" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.710604" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:10.710692" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:10.562786" elapsed="0.148016"/>
</kw>
<msg time="2026-04-10T00:56:10.710895" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:10.710938" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:10.558150" elapsed="0.152823"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.711331" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.711047" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.711031" elapsed="0.000380"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:10.558002" elapsed="0.153432"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:10.717069" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:10.716962" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.716943" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:10.718297" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:10.718189" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.718171" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:10.718882" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.718511" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:10.719290" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:10.719072" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:10.756252" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:10.719837" elapsed="0.036514"/>
</kw>
<msg time="2026-04-10T00:56:10.756532" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:10.756599" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:10.719478" elapsed="0.037156"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:10.856156" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:10.757162" elapsed="0.099227"/>
</kw>
<msg time="2026-04-10T00:56:10.856631" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:10.856681" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:10.756809" elapsed="0.099908"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.857157" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.856844" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.856803" elapsed="0.000442"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.857784" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.857394" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.858263" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.858042" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.858024" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:10.858376" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:10.860047" elapsed="0.000791"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.861121" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:10.861888" 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-04-10T00:56:10.859379" elapsed="0.002975"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:10.858785" elapsed="0.003637"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:10.717881" elapsed="0.144642"/>
</kw>
<msg time="2026-04-10T00:56:10.862676" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:10.862733" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:10.717293" elapsed="0.145486"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:10.862992" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:56:10.862879" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.862855" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.863510" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.864139" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:10.864216" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:10.716614" elapsed="0.147712"/>
</kw>
<msg time="2026-04-10T00:56:10.864421" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:10.864467" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:10.711825" elapsed="0.152678"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.864855" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.864596" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.864578" elapsed="0.000357"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:10.711674" elapsed="0.153284"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:10.870561" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:10.870442" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.870423" elapsed="0.000253"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:10.871988" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:10.871881" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.871864" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:10.872505" level="INFO">${karaf_connection_index} = 307</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:10.872201" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:10.872934" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:10.872711" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:10.911026" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:10.873459" elapsed="0.037725"/>
</kw>
<msg time="2026-04-10T00:56:10.911454" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:10.911502" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:10.873120" elapsed="0.038418"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:10.992936" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:10.912177" elapsed="0.081045"/>
</kw>
<msg time="2026-04-10T00:56:10.993469" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:10.993517" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:10.911776" elapsed="0.081804"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.994069" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.993706" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.993668" elapsed="0.000490"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:10.994795" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "L "e "a "d "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:10.994309" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:10.995209" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:10.994987" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:10.994968" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:10.995323" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:10.997288" 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-04-10T00:56:10.998359" elapsed="0.000571"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:10.999391" elapsed="0.000381"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:10.996459" elapsed="0.003421"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:10.995679" elapsed="0.004267"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:10.871425" elapsed="0.128625"/>
</kw>
<msg time="2026-04-10T00:56:11.000153" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:11.000200" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:10.870861" elapsed="0.129376"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:11.000436" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:56:11.000322" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.000301" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.000992" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.001348" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.001422" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:10.870087" elapsed="0.131448"/>
</kw>
<msg time="2026-04-10T00:56:11.001666" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:11.001713" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:10.865237" elapsed="0.136515"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.002205" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.001947" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.001928" elapsed="0.000354"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:10.865092" elapsed="0.137214"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:10.557824" elapsed="0.444517"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:56:10.555279" elapsed="0.447123"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:56:10.549924" elapsed="0.452537"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:10.549462" elapsed="0.453046"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:56:10.546673" elapsed="0.455974"/>
</kw>
<kw name="Get InventoryConfig Shard Status" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.010423" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:11.010036" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.011010" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:11.010669" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:11.011081" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:56:11.011242" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:11.009659" elapsed="0.001607"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:56:11.011421" elapsed="0.000191"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.012106" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:11.011775" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.012528" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:11.012290" elapsed="0.000278"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.012965" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:11.012719" 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-04-10T00:56:11.015511" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.015211" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:11.015600" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:11.015750" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:11.014859" elapsed="0.000915"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.091188" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.090768" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:56:11.092068" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:56:11.091761" elapsed="0.000388">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:56:11.092244" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:56:11.091402" elapsed="0.000868"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.092842" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:11.092435" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:56:11.093267" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:56:11.093431" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:56:11.093121" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.093885" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.093631" 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-04-10T00:56:11.095011" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.094745" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.095495" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:56:11.095219" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.095895" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.096104" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.096283" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:56:11.095753" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.095602" elapsed="0.000773"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:56:11.096426" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:56:11.096622" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:56:11.094331" elapsed="0.002317"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.094014" elapsed="0.002666"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.096856" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.096706" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.093988" elapsed="0.002946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.097534" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.097081" elapsed="0.000501"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:56:11.097634" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:56:11.089981" elapsed="0.007822"/>
</kw>
<msg time="2026-04-10T00:56:11.097876" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:11.076011" elapsed="0.022004"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.112303" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.126047" elapsed="0.000052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.139800" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.140199" elapsed="0.000075"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.140513" elapsed="0.000093"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.141332" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.141102" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:11.141073" elapsed="0.000366"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.141735" elapsed="0.000035"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.142040" elapsed="0.000034"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.142333" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:56:11.141009" elapsed="0.001407"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.140751" elapsed="0.001776"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.142896" elapsed="0.000076"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.143140" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:56:11.143321" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:56:11.065193" elapsed="0.078154"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:56:11.145318" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:56:11.145009" elapsed="0.000379">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:56:11.145535" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:56:11.144214" elapsed="0.001392"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.147022" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.145753" elapsed="0.001358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.147971" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.147454" elapsed="0.000563"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.147150" elapsed="0.000917"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.145734" elapsed="0.002367"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.151163" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:11.148303" elapsed="0.002902"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:56:11.151337" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:56:11.151581" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:56:11.143756" elapsed="0.007852"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:56:11.153502" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:56:11.153199" elapsed="0.000505">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:56:11.153855" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:56:11.152416" elapsed="0.001478"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:56:11.154326" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-10T00:56:11.154039" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.154020" elapsed="0.000554"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.154839" elapsed="0.000078"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.155160" elapsed="0.000073"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.155352" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:56:11.169510" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:56:11.151963" elapsed="0.017575"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.172606" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.171986" elapsed="0.000763"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.173819" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.172987" elapsed="0.000966"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:11.206963" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:11.207962" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:56:11.208834" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:11.177553" elapsed="0.031387"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.174080" elapsed="0.034995"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.211526" elapsed="0.000117"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.209171" elapsed="0.002606"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.174059" elapsed="0.037799"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.218982" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.216042" elapsed="0.003269"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.215738" elapsed="0.003637"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.215703" elapsed="0.003722"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.222243" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.219841" elapsed="0.002449"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.219524" elapsed="0.002826"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.219494" elapsed="0.002906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.223387" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.222839" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.223876" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.223562" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.224533" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.224225" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.224009" elapsed="0.000626"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.223514" elapsed="0.001167"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.225525" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.225022" elapsed="0.000619"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.226058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.225754" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.226791" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.226399" elapsed="0.000419"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.226187" elapsed="0.000692"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.225723" elapsed="0.001202"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:11.227259" elapsed="0.000459"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:11.228500" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.228064" elapsed="0.000496"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:11.228902" elapsed="0.002493"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:11.213837" elapsed="0.017643"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.231875" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:11.231669" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.231647" elapsed="0.000392"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:11.242849" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:11.232240" elapsed="0.010655"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:11.243034" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:56:11.243290" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:11.170132" elapsed="0.073185"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:11.243384" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:11.243555" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:56:11.024410" elapsed="0.219173"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.243930" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.243674" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.243655" elapsed="0.000418"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:11.244107" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:56:11.020091" elapsed="0.224146"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.015844" elapsed="0.228438"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.015825" elapsed="0.228483"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:56:11.244954" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:56:11.244848" elapsed="0.000165"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.245073" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:11.245036" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.244830" elapsed="0.000304"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.245288" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:56:11.245410" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:56:11.244565" elapsed="0.000871"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.246021" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.245639" elapsed="0.000409"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.246731" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.246206" elapsed="0.000554"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.252492" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.252217" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.252982" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.252713" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:11.418706" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:11.418910" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:11 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:11 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":178000,"InMemoryJournalLogSize":72,"ReplicatedToAllIndex":178000,"Leader":"member-3-shard-inventory-config","LastIndex":178072,"RaftState":"Follower","LastApplied":178072,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":178072,"LastLeadershipChangeTime":"2026-04-10 00:55:34.574","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"151.4 ms","CurrentTerm":6,"LastTerm":6,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":6,"StatRetrievalError":null,"CommitIndex":178072,"SnapshotTerm":6,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":796701},"timestamp":1775782571,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:11.419182" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:11.255259" elapsed="0.163965"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.253093" elapsed="0.166213"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.419682" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.419357" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.253074" elapsed="0.166736"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.427372" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":178000,"InMemoryJournalLogSize":72,"ReplicatedToAllIndex":178000,"Leader":"member-3-shard-inventory-config","LastIndex":178072,"RaftState":"Follower","LastApplied":178072,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":178072,"LastLeadershipChangeTime":"2026-04-10 00:55:34.574","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"151.4 ms","CurrentTerm":6,"LastTerm":6,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":6,"StatRetrievalError":null,"CommitIndex":178072,"SnapshotTerm":6,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":796701},"timestamp":1775782571,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.421793" elapsed="0.005815"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.421324" elapsed="0.006377"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.421297" elapsed="0.006432"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.430815" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.428098" elapsed="0.002853"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.427789" elapsed="0.003253"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.427770" elapsed="0.003300"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.431904" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.431260" elapsed="0.000672"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.432657" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.432036" elapsed="0.000799"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.434291" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.433558" elapsed="0.000799"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.432863" elapsed="0.001600"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.432016" elapsed="0.002473"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.435392" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.434672" elapsed="0.000747"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.436173" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.435523" elapsed="0.000825"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.437609" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.436871" elapsed="0.000780"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.436375" elapsed="0.001376"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.435504" elapsed="0.002271"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:11.437934" elapsed="0.000794"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:11.439493" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.438950" elapsed="0.000569"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:11.439756" elapsed="0.002629"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:11.420616" elapsed="0.021879"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.442726" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:11.442597" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.442573" elapsed="0.000239"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:11.459017" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:11.442960" elapsed="0.016090"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:11.459107" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:56:11.459283" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:11.247691" elapsed="0.211618"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:11.459424" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:11.459599" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:56:11.246981" elapsed="0.212645"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.460727" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782571, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.460259" elapsed="0.000497"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:11.460805" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:11.460975" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782571, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:11.459885" elapsed="0.001117"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:11.461360" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 178072, 'CommittedTransactionsCount': 0, 'CurrentTerm': 6, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerIni...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:11.461159" elapsed="0.000228"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:11.461761" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:11.461557" elapsed="0.000230"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:56:11.461833" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:11.461988" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:56:11.014162" elapsed="0.447851"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:56:11.462072" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:56:11.462221" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:56:11.013429" elapsed="0.448817"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:11.462914" elapsed="0.000202"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.462375" elapsed="0.000780"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.463325" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.463179" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.463561" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.463402" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.462351" elapsed="0.001285"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:11.013255" elapsed="0.450406"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.466163" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.465696" elapsed="0.000494"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:11.466236" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:11.466413" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:11.465338" elapsed="0.001106"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.541522" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.541114" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:56:11.542415" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:56:11.542092" elapsed="0.000421">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:56:11.542724" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:56:11.541753" elapsed="0.000997"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.543309" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:11.542922" elapsed="0.000414"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:56:11.543661" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:56:11.543821" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:56:11.543500" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.544252" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.544005" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.545305" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.545047" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.545811" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:56:11.545515" elapsed="0.000323"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.546174" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.546424" elapsed="0.000030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.546634" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:56:11.546034" elapsed="0.000661"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.545892" elapsed="0.000834"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:56:11.546774" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:56:11.546942" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:56:11.544719" elapsed="0.002248"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.544378" elapsed="0.002621"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.547172" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.547023" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.544354" elapsed="0.002895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.547856" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.547393" elapsed="0.000491"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:56:11.547933" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:56:11.540409" elapsed="0.007690"/>
</kw>
<msg time="2026-04-10T00:56:11.548171" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:11.526777" elapsed="0.021532"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.562212" elapsed="0.000072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.576017" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.589817" elapsed="0.000054"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.590459" elapsed="0.000106"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.590820" elapsed="0.000076"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.591661" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.591407" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:11.591376" elapsed="0.000395"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.592045" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.592372" elapsed="0.000036"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.592705" elapsed="0.000036"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:56:11.591309" elapsed="0.001481"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.591044" elapsed="0.001823"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.593374" elapsed="0.000074"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.593665" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:56:11.593886" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:56:11.516208" elapsed="0.077706"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:56:11.596158" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:56:11.595798" elapsed="0.000440">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:56:11.596390" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:56:11.594933" elapsed="0.001496"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.597877" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.596641" elapsed="0.001323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.598888" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.598337" elapsed="0.000602"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.598002" elapsed="0.000987"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.596620" elapsed="0.002404"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.602089" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:11.599227" elapsed="0.002904"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:56:11.602319" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:56:11.602605" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:56:11.594378" elapsed="0.008254"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:56:11.604673" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:56:11.604297" elapsed="0.000443">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:56:11.604978" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:56:11.603499" elapsed="0.001519"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:56:11.605456" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-10T00:56:11.605165" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.605146" elapsed="0.000506"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.605852" elapsed="0.000079"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.606173" elapsed="0.000093"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.606407" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:56:11.620356" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:56:11.602991" elapsed="0.017394"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.623221" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.622622" elapsed="0.000732"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.624183" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.623604" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:11.661505" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:11.662140" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:56:11.662715" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:11.627799" elapsed="0.034983"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.624438" elapsed="0.038432"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.664336" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.662933" elapsed="0.001539"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.624418" elapsed="0.040104"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.671984" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.667944" elapsed="0.004497"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.667494" elapsed="0.005033"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.667448" elapsed="0.005171"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.676669" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.673162" elapsed="0.003573"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.672754" elapsed="0.004064"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.672712" elapsed="0.004174"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.678135" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.677372" elapsed="0.000848"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.678880" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.678406" elapsed="0.000586"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.679813" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.679357" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.679059" elapsed="0.000874"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.678355" elapsed="0.001641"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.681197" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.680461" elapsed="0.000800"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.681857" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.681411" elapsed="0.000557"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.682881" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.682412" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.682035" elapsed="0.000934"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.681369" elapsed="0.001646"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:11.683348" elapsed="0.000454"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:11.684597" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.684149" elapsed="0.000495"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:11.684979" elapsed="0.002749"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:11.665722" elapsed="0.022089"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.688182" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:11.687978" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.687958" elapsed="0.000386"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:11.699231" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:11.688555" elapsed="0.010737"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:11.699449" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:56:11.699746" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:11.621037" elapsed="0.078737"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:11.699841" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:11.699999" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:56:11.475161" elapsed="0.224864"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.700439" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.700123" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.700103" elapsed="0.000519"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:11.700657" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:56:11.470858" elapsed="0.229929"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.466528" elapsed="0.234305"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.466507" elapsed="0.234351"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:56:11.701505" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:56:11.701399" elapsed="0.000196"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.701658" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:11.701619" elapsed="0.000078"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.701382" elapsed="0.000337"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.701885" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:56:11.702005" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:56:11.701098" elapsed="0.000932"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.702704" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.702236" elapsed="0.000495"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.703355" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.702891" elapsed="0.000491"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.709093" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.708808" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.709611" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.709298" 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-04-10T00:56:11.726710" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:11.726823" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:11 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:11 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":177875,"InMemoryJournalLogSize":197,"ReplicatedToAllIndex":177875,"Leader":"member-3-shard-inventory-config","LastIndex":178072,"RaftState":"Follower","LastApplied":178072,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":178072,"LastLeadershipChangeTime":"2026-04-10 00:55:34.560","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"3.802 ms","CurrentTerm":6,"LastTerm":6,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":6,"StatRetrievalError":null,"CommitIndex":178072,"SnapshotTerm":6,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":813611},"timestamp":1775782571,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:11.727097" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:11.711894" elapsed="0.015261"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.709725" elapsed="0.017526"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.727695" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.727309" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.709707" elapsed="0.018178"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.737258" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":177875,"InMemoryJournalLogSize":197,"ReplicatedToAllIndex":177875,"Leader":"member-3-shard-inventory-config","LastIndex":178072,"RaftState":"Follower","LastApplied":178072,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":178072,"LastLeadershipChangeTime":"2026-04-10 00:55:34.560","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"3.802 ms","CurrentTerm":6,"LastTerm":6,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":6,"StatRetrievalError":null,"CommitIndex":178072,"SnapshotTerm":6,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":813611},"timestamp":1775782571,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.730823" elapsed="0.006624"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.730047" elapsed="0.007492"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.730007" elapsed="0.007574"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.740729" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.737954" elapsed="0.002908"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.737640" elapsed="0.003310"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.737623" elapsed="0.003355"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.741743" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.741156" elapsed="0.000615"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.742539" elapsed="0.000092"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.741873" elapsed="0.000861"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.744003" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.743244" elapsed="0.000801"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.742761" elapsed="0.001382"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.741854" elapsed="0.002314"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.744900" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.744333" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.745652" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.745033" elapsed="0.000795"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.747167" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.746412" elapsed="0.000797"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.745855" elapsed="0.001456"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.745014" elapsed="0.002321"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:11.747494" elapsed="0.000780"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:11.749042" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.748490" elapsed="0.000579"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:11.749265" elapsed="0.002833"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:11.729017" elapsed="0.023177"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.752377" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:11.752266" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.752247" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:11.768961" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:11.752609" elapsed="0.016382"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:11.769046" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:56:11.769213" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:11.704303" elapsed="0.064938"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:11.769344" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:11.769500" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:56:11.703613" elapsed="0.065914"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.770641" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782571, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.770143" elapsed="0.000528"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:11.770720" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:11.770890" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782571, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:11.769781" elapsed="0.001136"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:11.771273" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 178072, 'CommittedTransactionsCount': 0, 'CurrentTerm': 6, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerIni...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:11.771074" elapsed="0.000226"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:11.771933" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:11.771458" elapsed="0.000503"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:56:11.772010" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:11.772162" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:56:11.464734" elapsed="0.307453"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:56:11.772245" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:56:11.772392" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:56:11.464000" elapsed="0.308417"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:11.772737" elapsed="0.000194"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.772499" elapsed="0.000470"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.773143" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.772993" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.773365" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.773220" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.772480" elapsed="0.000957"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:11.463829" elapsed="0.309632"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.776159" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.775853" elapsed="0.000333"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:11.776232" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:11.776379" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:11.775241" elapsed="0.001162"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.899798" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.899160" elapsed="0.000687"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:56:11.900843" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:56:11.900538" elapsed="0.000389">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:56:11.901117" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:56:11.900095" elapsed="0.001049"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.901725" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:11.901315" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:56:11.902071" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:56:11.902291" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:56:11.901925" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.902761" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.902483" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.903902" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.903640" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.904390" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:56:11.904113" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.904786" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.905001" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.905182" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:56:11.904642" elapsed="0.000599"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.904474" elapsed="0.000801"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:56:11.905327" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:56:11.905505" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:56:11.903270" elapsed="0.002260"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.902900" elapsed="0.002680"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.905761" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.905606" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.902871" elapsed="0.002969"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.906688" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:11.905991" elapsed="0.000726"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:56:11.906768" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:56:11.898019" elapsed="0.008938"/>
</kw>
<msg time="2026-04-10T00:56:11.907031" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:11.882028" elapsed="0.025156"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.922200" elapsed="0.000082"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.938773" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.953382" elapsed="0.000076"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.953933" elapsed="0.000107"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.954440" elapsed="0.000153"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.955674" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.955327" elapsed="0.000445"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:11.955284" elapsed="0.000546"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.956201" elapsed="0.000049"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.956652" elapsed="0.000049"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.957065" elapsed="0.000047"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:56:11.955186" elapsed="0.001993"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.954807" elapsed="0.002472"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.957741" elapsed="0.000105"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.958130" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:56:11.958453" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:56:11.871513" elapsed="0.086980"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:56:11.960762" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:56:11.960386" elapsed="0.000457">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:56:11.960994" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:56:11.959529" elapsed="0.001505"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.962484" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:11.961183" elapsed="0.001464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.963496" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:11.962995" elapsed="0.000561"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.962687" elapsed="0.000922"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.961162" elapsed="0.002483"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.966692" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:11.963849" elapsed="0.002886"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:56:11.966869" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:56:11.967103" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:56:11.959038" elapsed="0.008091"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:56:11.969054" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:56:11.968748" elapsed="0.000372">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:56:11.969316" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:56:11.967961" elapsed="0.001395"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:56:11.969815" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-10T00:56:11.969504" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.969485" elapsed="0.000508"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.970232" elapsed="0.000077"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:11.970692" elapsed="0.000076"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:56:11.970888" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:56:11.984822" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:56:11.967488" elapsed="0.017363"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.987957" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.987346" elapsed="0.000743"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:11.988923" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:11.988328" elapsed="0.000726"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:12.014732" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:12.015742" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:56:12.016738" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:11.995535" elapsed="0.021313"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.989180" elapsed="0.027812"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.019272" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.017092" elapsed="0.002328"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.989160" elapsed="0.030312"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.027972" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:12.023203" elapsed="0.005121"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:12.022737" elapsed="0.005657"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.022688" elapsed="0.005759"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.031426" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:12.028891" elapsed="0.002583"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:12.028568" elapsed="0.002970"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.028521" elapsed="0.003086"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.032595" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:12.032010" elapsed="0.000636"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.033078" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.032762" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.033778" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:12.033432" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:12.033211" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.032729" elapsed="0.001185"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.034851" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:12.034279" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.035335" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.035023" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.036027" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:12.035707" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:12.035464" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.034991" elapsed="0.001171"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:12.036580" elapsed="0.000458"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:12.038130" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:12.037477" elapsed="0.000711"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:12.038537" elapsed="0.002496"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:12.020789" elapsed="0.020336"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:12.041524" elapsed="0.000058"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:12.041309" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.041287" elapsed="0.000425"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:12.052490" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:12.041916" elapsed="0.010623"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:12.052718" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:56:12.052985" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:11.985407" elapsed="0.067606"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:12.053082" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:12.053238" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:56:11.830314" elapsed="0.222951"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.053664" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.053356" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.053336" elapsed="0.000496"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:12.053868" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:56:11.825733" elapsed="0.228266"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:11.776471" elapsed="0.277595"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:11.776454" elapsed="0.277640"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:56:12.054765" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:56:12.054654" elapsed="0.000174"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:56:12.054889" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:12.054852" elapsed="0.000077"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.054636" elapsed="0.000315"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.055113" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:56:12.055235" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:56:12.054339" elapsed="0.000922"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.055895" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:12.055450" elapsed="0.000473"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.056566" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:12.056083" elapsed="0.000512"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.062295" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:12.061972" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.062795" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:12.062505" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:12.077365" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:12.077518" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:12 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:12 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":2001,"SnapshotIndex":178071,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":178071,"Leader":"member-3-shard-inventory-config","LastIndex":178072,"RaftState":"Leader","LastApplied":178072,"LastCommittedTransactionTime":"2026-04-10 00:56:05.391","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","LastLogIndex":178072,"LastLeadershipChangeTime":"2026-04-10 00:55:34.571","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.138","active":true,"matchIndex":178072,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":178073},{"timeSinceLastActivity":"00:00:00.138","active":true,"matchIndex":178072,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":178073}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.956 ms","CurrentTerm":6,"LastTerm":6,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":6,"StatRetrievalError":null,"CommitIndex":178072,"SnapshotTerm":6,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":4002,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":813611},"timestamp":1775782572,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:12.077791" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:12.064956" elapsed="0.012873"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:12.062908" elapsed="0.014985"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.078184" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.077934" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.062890" elapsed="0.015475"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.084591" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":2001,"SnapshotIndex":178071,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":178071,"Leader":"member-3-shard-inventory-config","LastIndex":178072,"RaftState":"Leader","LastApplied":178072,"LastCommittedTransactionTime":"2026-04-10 00:56:05.391","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","LastLogIndex":178072,"LastLeadershipChangeTime":"2026-04-10 00:55:34.571","FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.138","active":true,"matchIndex":178072,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":178073},{"timeSinceLastActivity":"00:00:00.138","active":true,"matchIndex":178072,"voting":true,"id":"member-2-shard-inventory-config","nextIndex":178073}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.956 ms","CurrentTerm":6,"LastTerm":6,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-3-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":6,"StatRetrievalError":null,"CommitIndex":178072,"SnapshotTerm":6,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":4002,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":813611},"timestamp":1775782572,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:12.080281" elapsed="0.004536"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:12.079788" elapsed="0.005163"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.079762" elapsed="0.005229"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.089539" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:12.085568" elapsed="0.004185"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:12.085105" elapsed="0.004773"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.085071" elapsed="0.004845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.091149" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:12.090211" elapsed="0.000977"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.092241" elapsed="0.000108"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.091339" elapsed="0.001155"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.094368" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:12.093262" elapsed="0.001166"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:12.092532" elapsed="0.002099"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.091311" elapsed="0.003359"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.095762" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:12.094904" elapsed="0.000896"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.096848" elapsed="0.000108"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.095949" elapsed="0.001374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.099332" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:12.098125" elapsed="0.001284"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:12.097366" elapsed="0.002257"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.095920" elapsed="0.003753"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:12.099968" elapsed="0.001082"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:12.102227" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:12.101361" elapsed="0.000904"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:12.102707" elapsed="0.002745"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:12.079113" elapsed="0.026449"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:12.105753" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:12.105639" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.105619" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:12.122742" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:12.105969" elapsed="0.016810"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:12.122911" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:56:12.123123" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:12.057513" elapsed="0.065639"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:12.123215" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:12.123374" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:56:12.056813" elapsed="0.066587"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.124615" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782572, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:12.124112" elapsed="0.000533"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:12.124696" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:12.124875" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782572, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:12.123711" elapsed="0.001191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:12.125269" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 178072, 'CommittedTransactionsCount': 1, 'CurrentTerm': 6, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:12.125062" elapsed="0.000235"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:12.125933" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:12.125455" elapsed="0.000504"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:56:12.126020" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:12.126177" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:56:11.774634" elapsed="0.351568"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:56:12.126260" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:56:12.126411" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:56:11.773822" elapsed="0.352613"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.126765" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.126524" elapsed="0.000298"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:12.127052" elapsed="0.000194"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:12.126846" elapsed="0.000437"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.127454" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.127306" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.126505" elapsed="0.001023"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:11.773649" elapsed="0.353920"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:11.013044" elapsed="1.114560"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:56:12.127646" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:56:12.127848" level="INFO">${leader_list} = [3]</msg>
<msg time="2026-04-10T00:56:12.127893" level="INFO">${follower_list} = [1, 2]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:56:11.008902" elapsed="1.119015"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.128370" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:56:12.128446" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:56:12.128092" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.128777" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.128539" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.128521" elapsed="0.000442"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.131620" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:56:12.129107" elapsed="0.002563"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:56:12.132031" level="INFO">${leader} = 3</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:12.131837" elapsed="0.000220"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:56:12.132235" elapsed="0.000028"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:56:11.006309" elapsed="1.126081"/>
</kw>
<msg time="2026-04-10T00:56:12.132495" level="INFO">${inv_conf_leader} = 3</msg>
<msg time="2026-04-10T00:56:12.132557" level="INFO">${inv_conf_followers_list} = [1, 2]</msg>
<var>${inv_conf_leader}</var>
<var>${inv_conf_followers_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Get_Leader_And_Followers_For_Shard</arg>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:56:11.005496" elapsed="1.127087"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.133068" level="INFO">config inventory Leader is 3 and followers are [1, 2]</msg>
<arg>config inventory Leader is ${inv_conf_leader} and followers are ${inv_conf_followers_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:12.132776" elapsed="0.000336"/>
</kw>
<return>
<value>${inv_conf_leader}</value>
<value>${inv_conf_followers_list}</value>
<status status="PASS" start="2026-04-10T00:56:12.133154" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:56:12.133354" level="INFO">${inventory_leader} = 3</msg>
<msg time="2026-04-10T00:56:12.133401" level="INFO">${inventory_followers} = [1, 2]</msg>
<var>${inventory_leader}</var>
<var>${inventory_followers}</var>
<doc>Check Status for Inventory Config shard in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:56:11.002974" elapsed="1.130450"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.134107" level="INFO">${Inventory_Leader} = 3</msg>
<arg>${Inventory_Leader}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:56:12.133668" elapsed="0.000495"/>
</kw>
<doc>Find leader in the inventory config shard</doc>
<status status="PASS" start="2026-04-10T00:56:10.546109" elapsed="1.588195"/>
</test>
<test id="s1-s3-t17" name="Start Mininet Connect To Leader" line="141">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:56:12.138291" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:56:12.138020" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:12.139704" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:12.139588" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.139568" elapsed="0.000207"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:12.144979" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:12.144870" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.144851" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.146145" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:12.145701" elapsed="0.000473"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.146691" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:12.146335" elapsed="0.000385"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:12.146765" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:56:12.146922" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:12.145278" elapsed="0.001668"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:12.152722" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:12.152612" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.152593" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:12.154025" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:12.153900" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.153881" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:12.154584" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:12.154261" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:12.155035" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:12.154798" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:12.196465" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:12.155728" elapsed="0.040888"/>
</kw>
<msg time="2026-04-10T00:56:12.196814" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:12.196863" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:12.155285" elapsed="0.041615"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:12.275194" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:12.197487" elapsed="0.078047"/>
</kw>
<msg time="2026-04-10T00:56:12.275914" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:12.276003" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:12.197101" elapsed="0.078974"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.276812" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.276268" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.276213" elapsed="0.000764"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.277946" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:12.277267" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.278689" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.278252" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.278218" elapsed="0.000625"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:12.278914" elapsed="0.000067"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:12.281764" elapsed="0.001384"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:12.283512" elapsed="0.000639"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:12.284491" elapsed="0.000468"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:12.280572" elapsed="0.004515"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:12.279480" elapsed="0.005689"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:12.153591" elapsed="0.131704"/>
</kw>
<msg time="2026-04-10T00:56:12.285417" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:12.285474" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:12.152946" elapsed="0.132577"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:12.285779" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:56:12.285643" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.285619" elapsed="0.000270"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.286426" elapsed="0.000032"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.286884" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:12.286975" elapsed="0.000020"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:12.152249" elapsed="0.134865"/>
</kw>
<msg time="2026-04-10T00:56:12.287321" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:12.287380" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:12.147339" elapsed="0.140091"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.287872" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.287529" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.287506" elapsed="0.000465"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:12.147191" elapsed="0.140811"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:12.295528" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:12.295389" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.295365" elapsed="0.000284"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:12.297177" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:12.297034" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.297010" elapsed="0.000257"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:12.297867" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:12.297461" elapsed="0.000464"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:12.298433" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:12.298147" elapsed="0.000322"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:12.336190" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:12.299167" elapsed="0.037279"/>
</kw>
<msg time="2026-04-10T00:56:12.336721" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:12.336770" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:12.298710" elapsed="0.038100"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:12.410006" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:12.337583" elapsed="0.072635"/>
</kw>
<msg time="2026-04-10T00:56:12.410423" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:12.410472" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:12.337082" elapsed="0.073428"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.410966" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.410650" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.410615" elapsed="0.000438"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.411598" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:12.411203" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.411985" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.411761" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.411743" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:12.412101" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:12.413711" elapsed="0.000818"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:12.414827" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:12.415590" elapsed="0.000365"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:12.413034" elapsed="0.003137"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:12.412426" elapsed="0.003812"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:12.296648" elapsed="0.119692"/>
</kw>
<msg time="2026-04-10T00:56:12.416436" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:12.416480" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:12.295860" elapsed="0.120659"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:12.416726" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:56:12.416616" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.416598" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.417224" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.417584" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:12.417659" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:12.294937" elapsed="0.122834"/>
</kw>
<msg time="2026-04-10T00:56:12.417886" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:12.417932" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:12.288355" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.418301" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.418047" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.418030" elapsed="0.000346"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:12.288168" elapsed="0.130233"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:12.424058" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:12.423949" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.423930" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:12.425519" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:12.425411" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.425394" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:12.426099" level="INFO">${karaf_connection_index} = 307</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:12.425760" elapsed="0.000367"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:12.426505" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:12.426285" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:12.461501" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:12.427047" elapsed="0.034576"/>
</kw>
<msg time="2026-04-10T00:56:12.461784" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:12.461859" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:12.426709" elapsed="0.035188"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:12.533774" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:12.462415" elapsed="0.071506"/>
</kw>
<msg time="2026-04-10T00:56:12.534083" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:12.534129" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:12.462070" elapsed="0.072137"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.534521" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.534291" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.534270" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.535089" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:12.534776" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.535462" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.535244" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.535227" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:12.535590" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:12.537012" elapsed="0.000802"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:12.538097" elapsed="0.000504"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:12.538899" elapsed="0.000355"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:12.536382" elapsed="0.002974"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:12.535855" elapsed="0.003564"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:12.425106" elapsed="0.114412"/>
</kw>
<msg time="2026-04-10T00:56:12.539635" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:12.539681" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:12.424282" elapsed="0.115436"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:12.539903" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:56:12.539796" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.539778" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.540376" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.540732" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:12.540804" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:12.423597" elapsed="0.117316"/>
</kw>
<msg time="2026-04-10T00:56:12.541006" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:12.541050" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:12.418692" elapsed="0.122394"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.541411" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.541162" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.541144" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:12.418533" elapsed="0.122978"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:12.147001" elapsed="0.394554"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:56:12.144481" elapsed="0.397136"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:56:12.139272" elapsed="0.402405"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:12.138733" elapsed="0.402991"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:56:12.135403" elapsed="0.406437"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.544996" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:12.544771" elapsed="0.000271"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:12.547522" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:12.547255" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:12.547237" elapsed="0.000397"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:12.547923" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:12.547787" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.548622" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:12.548204" elapsed="0.000466"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:12.549204" level="INFO">${conn_id} = 334</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:12.548832" elapsed="0.000398"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:56:12.550172" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:56:12.550248" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:56:12.549889" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:12.550471" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:56:12.551658" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:56:13.177257" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:56:12 UTC 2026

  System load:  0.0                Processes:             107
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:56:04 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:56:12.551330" elapsed="0.626090"/>
</kw>
<msg time="2026-04-10T00:56:13.177536" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:12.550975" elapsed="0.626661"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:56:12.549448" elapsed="0.628301"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:56:13.178513" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:56:14.384702" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:56:14.385044" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:56:14.385112" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:56:13.178001" elapsed="1.207148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:14.385497" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:14.386660" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:14.386202" elapsed="0.000632"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:14.387168" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:14.386962" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:14.386923" elapsed="0.000350"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:56:14.387503" elapsed="0.000067"/>
</return>
<status status="PASS" start="2026-04-10T00:56:14.387350" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:14.387328" elapsed="0.000328"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:14.387706" elapsed="0.000020"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:14.391728" elapsed="0.000463"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:14.392432" elapsed="0.000250"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:14.392920" 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-04-10T00:56:14.388171" elapsed="0.004971"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:56:12.546730" elapsed="1.846544"/>
</kw>
<msg time="2026-04-10T00:56:14.393353" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:12.546159" elapsed="1.847269"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:56:12.545619" elapsed="1.847991"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:14.396590" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:14.396172" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:14.396146" elapsed="0.000562"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:14.397181" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:14.396984" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:14.398096" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:14.397603" elapsed="0.000541"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:14.398703" level="INFO">${conn_id} = 336</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:14.398304" elapsed="0.000425"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:56:14.399688" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:56:14.399767" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:56:14.399372" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:14.399953" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:56:14.401382" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:56:14.714314" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:56:12 UTC 2026

  System load:  0.0                Processes:             107
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:56:13 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:56:14.401060" elapsed="0.313403"/>
</kw>
<msg time="2026-04-10T00:56:14.714650" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:14.400661" elapsed="0.314068"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:56:14.398956" elapsed="0.315881"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:56:14.715327" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:56:14.747732" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:56:14.748049" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:56:14.748167" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:56:14.715079" elapsed="0.033147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:14.748801" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:14.750161" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:14.749647" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:14.750632" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:14.750372" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:14.750333" elapsed="0.000432"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:56:14.751042" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-04-10T00:56:14.750860" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:14.750832" elapsed="0.000362"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:14.751255" elapsed="0.000025"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:14.756009" elapsed="0.000457"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:14.756835" elapsed="0.000265"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:14.757300" elapsed="0.000132"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:14.751838" elapsed="0.005665"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:56:14.395402" elapsed="0.362250"/>
</kw>
<msg time="2026-04-10T00:56:14.757731" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:14.394607" elapsed="0.363198"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:56:14.393882" elapsed="0.364033"/>
</kw>
<arg>${mininet}</arg>
<status status="PASS" start="2026-04-10T00:56:12.545245" elapsed="2.212752"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:14.764748" level="INFO">${tools_connection} = 338</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:14.764170" elapsed="0.000616"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:56:14.767317" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:56:14.767426" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:56:14.766928" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:14.767701" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:56:14.769225" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:56:15.087945" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:56:12 UTC 2026

  System load:  0.0                Processes:             107
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:56:14 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:56:14.768903" elapsed="0.319189"/>
</kw>
<msg time="2026-04-10T00:56:15.088259" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:14.768387" elapsed="0.319956"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:56:14.766158" elapsed="0.322294"/>
</kw>
<msg time="2026-04-10T00:56:15.088502" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:14.765605" elapsed="0.322974"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:56:14.765055" elapsed="0.323621"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-10T00:56:15.088738" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:56:15.088961" level="INFO">${mininet_conn_id} = 338</msg>
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-10T00:56:14.763447" elapsed="0.325545"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.089690" level="INFO">${mininet_conn_id} = 338</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:56:15.089263" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.092000" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.089819" elapsed="0.002240"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.089797" elapsed="0.002287"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.092597" level="INFO">Start mininet --topo tree,1 to 10.30.171.151</msg>
<arg>Start mininet ${options} to ${controller}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.092246" elapsed="0.000412"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:15.095098" level="INFO">sudo mn --controller 'remote,ip=10.30.171.151,port=6633' --topo tree,1 --switch ovsk,protocols=OpenFlow13</msg>
<arg>sudo mn --controller 'remote,ip=${controller},port=${ofport}' ${options} --switch ovsk,protocols=OpenFlow${ofversion}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:15.092841" elapsed="0.002319"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:56:15.230174" level="INFO">[?2004l*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2 
*** Adding switches:
s1 
*** Adding links:
(s1, h1) (s1, h2) 
*** Configuring hosts
h1 h2 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:56:15.095322" elapsed="0.134957"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.230927" level="INFO">Check OVS configuratiom</msg>
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.230583" elapsed="0.000393"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:15.232368" level="INFO">sh ovs-vsctl show</msg>
<arg>sh ovs-vsctl show</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:15.231151" elapsed="0.001272"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:56:15.242359" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Bridge s1
        Controller "tcp:10.30.171.151:6633"
        Controller "ptcp:6654"
        fail_mode: secure
        Port s1-eth2
            Interface s1-eth2
        Port s1
            Interface s1
                type: internal
        Port s1-eth1
            Interface s1-eth1
    ovs_version: "2.17.11"
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:56:15.232669" elapsed="0.009764"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="PASS" start="2026-04-10T00:56:15.242489" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:56:15.242733" level="INFO">${mininet_conn_id} = 338</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${Inventory_Leader}_IP}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="PASS" start="2026-04-10T00:56:12.542161" elapsed="2.700598"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.243346" level="INFO">${mininet_conn_id} = 338</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:56:15.242991" elapsed="0.000397"/>
</kw>
<doc>Start mininet with connection to Leader Node.</doc>
<status status="PASS" start="2026-04-10T00:56:12.134727" elapsed="3.108778"/>
</test>
<test id="s1-s3-t18" name="Add Bulk Flow From Leader" line="148">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:56:15.247261" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:56:15.246989" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:15.248654" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:15.248459" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.248439" elapsed="0.000298"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:15.253848" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:15.253739" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.253721" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.254937" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:15.254530" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.255510" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:15.255198" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:15.255602" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:15.255761" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:15.254149" elapsed="0.001637"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:15.261600" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:15.261474" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.261455" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:15.262866" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:15.262758" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.262740" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:15.263381" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:15.263082" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:15.263848" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:15.263603" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:15.300295" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:15.264379" elapsed="0.036089"/>
</kw>
<msg time="2026-04-10T00:56:15.300714" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:15.300763" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:15.264038" elapsed="0.036761"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:15.369274" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:15.301352" elapsed="0.068074"/>
</kw>
<msg time="2026-04-10T00:56:15.369628" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:15.369677" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:15.300988" elapsed="0.068726"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.370088" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.369815" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.369788" elapsed="0.000402"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.370701" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.370343" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.371087" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.370861" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.370841" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:15.371215" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:15.374099" elapsed="0.000193"/>
</kw>
<msg time="2026-04-10T00:56:15.374358" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:15.372838" elapsed="0.001661"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.374812" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.375157" elapsed="0.000141"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:15.372128" elapsed="0.003290"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:15.371523" elapsed="0.003975"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:15.262428" elapsed="0.113235"/>
</kw>
<msg time="2026-04-10T00:56:15.375798" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:15.375859" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:15.261824" elapsed="0.114084"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:15.376180" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:56:15.376010" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.375987" elapsed="0.000309"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.376905" 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-04-10T00:56:15.377388" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:15.377489" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:15.261128" elapsed="0.116542"/>
</kw>
<msg time="2026-04-10T00:56:15.377820" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:15.377889" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:15.256174" elapsed="0.121773"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.378450" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.378066" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.378039" elapsed="0.000563"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:15.256027" elapsed="0.122615"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:15.386209" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:15.386095" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.386074" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:15.387450" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:15.387342" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.387325" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:15.387995" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:15.387687" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:15.388467" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:15.388183" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:15.427902" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:15.389024" elapsed="0.039177"/>
</kw>
<msg time="2026-04-10T00:56:15.428726" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:15.428839" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:15.388679" elapsed="0.040244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:15.493773" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:15.429871" elapsed="0.064137"/>
</kw>
<msg time="2026-04-10T00:56:15.494249" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:15.494299" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:15.429233" elapsed="0.065193"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.494956" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.494599" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.494535" elapsed="0.000515"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.495599" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.495198" elapsed="0.000489"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.495980" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.495757" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.495739" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:15.496102" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:15.498798" elapsed="0.000173"/>
</kw>
<msg time="2026-04-10T00:56:15.499038" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:15.497696" elapsed="0.001475"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.499453" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.499815" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:15.497032" elapsed="0.002968"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:15.496439" elapsed="0.003625"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:15.387041" elapsed="0.113122"/>
</kw>
<msg time="2026-04-10T00:56:15.500262" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:15.500307" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:15.386439" elapsed="0.113905"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:15.500644" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:56:15.500507" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.500485" 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-04-10T00:56:15.501134" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.501475" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:15.501563" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:15.385664" elapsed="0.116013"/>
</kw>
<msg time="2026-04-10T00:56:15.501774" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:15.501819" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:15.379084" elapsed="0.122772"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.502184" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.501932" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.501916" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:15.378847" elapsed="0.123437"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:15.508099" elapsed="0.000973"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:15.507991" elapsed="0.001119"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.507970" elapsed="0.001163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:15.510324" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:15.510217" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.510200" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:15.510868" level="INFO">${karaf_connection_index} = 307</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:15.510539" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:15.511291" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:15.511055" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:15.545565" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:15.511841" elapsed="0.033829"/>
</kw>
<msg time="2026-04-10T00:56:15.545854" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:15.545901" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:15.511477" elapsed="0.034460"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:15.617119" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:15.546465" elapsed="0.070781"/>
</kw>
<msg time="2026-04-10T00:56:15.617408" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:15.617453" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:15.546116" elapsed="0.071373"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.617837" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.617594" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.617571" elapsed="0.000345"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.618371" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.618062" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.618763" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.618525" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.618508" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:15.618877" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:15.621504" elapsed="0.000190"/>
</kw>
<msg time="2026-04-10T00:56:15.621757" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:15.620404" elapsed="0.001485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.622161" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.622496" 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-04-10T00:56:15.619732" elapsed="0.002970"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:15.619169" elapsed="0.003596"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:15.509870" elapsed="0.112994"/>
</kw>
<msg time="2026-04-10T00:56:15.622960" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:15.623005" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:15.509288" elapsed="0.113756"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:15.623229" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:56:15.623122" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.623104" elapsed="0.000259"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.623793" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.624136" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:15.624210" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:15.507536" elapsed="0.116799"/>
</kw>
<msg time="2026-04-10T00:56:15.624434" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:15.624479" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:15.502575" elapsed="0.121940"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.624861" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.624607" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.624590" elapsed="0.000346"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:15.502415" elapsed="0.122546"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:15.255843" elapsed="0.369156"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:56:15.253360" elapsed="0.371699"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:56:15.248156" elapsed="0.376962"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:15.247703" elapsed="0.377462"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:56:15.244661" elapsed="0.380559"/>
</kw>
<kw name="Add Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Add Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.636161" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:15.635852" elapsed="0.000335"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:15.636234" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:15.636397" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:15.635487" elapsed="0.000934"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.650624" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.650325" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.651093" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.650852" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.651539" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.651296" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.651991" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.651754" elapsed="0.000280"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:15.652877" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:56:15.652671" elapsed="0.000232"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:56:15.653225" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:56:15.653057" elapsed="0.000193"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:56:15.653401" elapsed="0.000218"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.654020" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.653777" elapsed="0.000286"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:56:15.654106" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:56:15.654278" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:56:15.652232" elapsed="0.002070"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:15.676407" level="INFO">POST Request : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Content-Length': '401', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:56:15.676529" level="INFO">POST Response : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:15.676822" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:15.656743" elapsed="0.020141"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:15.654468" elapsed="0.022528"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.677440" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.677064" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.654447" elapsed="0.023234"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.684072" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.680190" elapsed="0.003947"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:15.679667" elapsed="0.004520"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.679624" elapsed="0.004599"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.688248" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.684794" elapsed="0.003552"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:15.684415" elapsed="0.003982"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.684377" elapsed="0.004055"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.689298" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:15.688728" elapsed="0.000609"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.689829" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.689442" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.690647" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:15.690179" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:15.689946" elapsed="0.000791"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.689416" elapsed="0.001352"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.691526" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:15.691001" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.692041" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.691697" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.692899" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:15.692426" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:15.692157" elapsed="0.000834"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.691671" elapsed="0.001351"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:15.693241" elapsed="0.000530"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:15.694431" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:15.694016" elapsed="0.000475"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:15.694769" elapsed="0.003157"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:15.678602" elapsed="0.019395"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:15.698286" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:15.698123" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.698102" elapsed="0.000301"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:15.701146" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:15.698676" elapsed="0.002499"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:15.701226" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:56:15.701396" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:15.647295" elapsed="0.054126"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:15.701490" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:56:15.701682" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:56:15.644341" elapsed="0.057366"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:15.701762" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:56:15.701911" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:15.635041" elapsed="0.066895"/>
</kw>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Add Bulk Flow in member 3 according to ${json_body_add}.</doc>
<status status="PASS" start="2026-04-10T00:56:15.630605" elapsed="0.071429"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.709350" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:15.709041" elapsed="0.000337"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:15.709426" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:15.709597" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:15.708615" elapsed="0.001020"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.716476" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.716197" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.716988" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.716707" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:15.723744" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:15.723804" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:15 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:15 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782575,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:15.723900" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:15.719400" elapsed="0.004527"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:15.717103" elapsed="0.006867"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.724155" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.723998" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.717084" elapsed="0.007221"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.727801" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782575,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.725378" elapsed="0.002472"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:15.725145" elapsed="0.002740"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.725127" elapsed="0.002783"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.730573" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:15.728195" elapsed="0.002441"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:15.727967" elapsed="0.002709"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.727949" elapsed="0.002754"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.731297" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:15.730874" elapsed="0.000497"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.731712" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.731447" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.732310" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:15.731963" elapsed="0.000377"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:15.731796" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.731428" elapsed="0.000974"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.733037" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:15.732600" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.733521" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:15.733181" elapsed="0.000466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.734411" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:15.733978" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:15.733691" elapsed="0.000808"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.733155" elapsed="0.001373"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:15.734840" elapsed="0.000554"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:15.736135" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:15.735685" elapsed="0.000488"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:15.736417" elapsed="0.003647"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:15.724705" elapsed="0.015451"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:15.740442" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:56:15.740283" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:15.740231" elapsed="0.000392"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:15.740842" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:15.740953" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:56:15.744306" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782575,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:15.709982" elapsed="0.034369"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:15.744426" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:56:15.744667" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782575,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:15.708063" elapsed="0.036642"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.745891" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782575, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:15.745447" elapsed="0.000474"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:15.745970" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:15.746126" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782575, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:15.745058" elapsed="0.001094"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:15.746526" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:15.746335" elapsed="0.000237"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.747092" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:15.746755" elapsed="0.000371"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.747606" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:15.747318" elapsed="0.000364"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:56:15.748262" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:56:15.747863" elapsed="0.000475">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:56:15.703326" elapsed="0.045125">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:16.761680" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:16.761255" elapsed="0.000461"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:16.761778" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:56:16.761952" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:16.760847" elapsed="0.001130"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:16.768987" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:16.768721" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:16.769465" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:16.769209" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:16.775779" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:16.775842" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:16 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:16 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782576,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:16.775939" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:16.771777" elapsed="0.004191"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:16.769604" elapsed="0.006408"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:16.776202" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:16.776042" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.769583" elapsed="0.006711"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:16.779799" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782576,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:16.777366" elapsed="0.002484"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:16.777127" elapsed="0.002759"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.777109" elapsed="0.002802"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:16.782582" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:16.780199" elapsed="0.002432"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:16.779968" elapsed="0.002699"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.779951" elapsed="0.002740"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:16.783279" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:16.782874" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:16.783650" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:16.783379" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:16.784258" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:16.783944" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:16.783772" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.783361" elapsed="0.000982"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:16.784918" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:16.784528" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:16.785254" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:16.785016" elapsed="0.000390"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:16.785944" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:16.785635" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:16.785435" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.784998" elapsed="0.001034"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:16.786192" elapsed="0.000382"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:16.787042" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:16.786746" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:16.787228" elapsed="0.002420"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:16.776694" elapsed="0.013019"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:16.789894" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:56:16.789785" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.789767" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:16.790136" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:16.790209" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:56:16.792522" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782576,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:16.762342" elapsed="0.030233"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:16.792632" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:16.792789" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782576,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:16.760327" elapsed="0.032488"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:16.793809" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782576, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:16.793387" elapsed="0.000451"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:16.793885" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:16.794041" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782576, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:16.793038" elapsed="0.001029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:16.794428" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:16.794246" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:16.794966" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:16.794657" elapsed="0.000335"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:16.795620" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:16.795168" elapsed="0.000481"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:56:16.795855" elapsed="0.000318"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:56:16.749388" elapsed="0.046846"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:56:15.702735" elapsed="1.093549"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 3.</doc>
<status status="PASS" start="2026-04-10T00:56:15.702276" elapsed="1.094071"/>
</kw>
<arg>${temp_json_config_add}</arg>
<arg>${Inventory_Leader}</arg>
<arg>${operation_timeout}</arg>
<doc>Add Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:56:15.630097" elapsed="1.166307"/>
</kw>
<doc>1000 Flows added via Follower Node1 and verify it gets applied in all instances.</doc>
<status status="PASS" start="2026-04-10T00:56:15.243933" elapsed="1.552595"/>
</test>
<test id="s1-s3-t19" name="Get Bulk Flows and Verify In Cluster Before Leader Restart" line="152">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:56:16.800289" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:56:16.800013" elapsed="0.000612"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:16.801668" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:16.801538" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.801519" elapsed="0.000231"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:16.806905" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:16.806783" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.806762" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:16.808038" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:16.807604" elapsed="0.000461"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:16.808538" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:16.808230" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:16.808627" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:56:16.808786" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:16.807202" elapsed="0.001609"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:16.814293" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:16.814184" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.814165" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:16.815592" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:16.815458" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.815441" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:16.816158" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:16.815845" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:16.816613" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:16.816348" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:16.850798" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:16.817154" elapsed="0.033793"/>
</kw>
<msg time="2026-04-10T00:56:16.851180" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:16.851247" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:16.816803" elapsed="0.034495"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:16.950726" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:16.852093" elapsed="0.098828"/>
</kw>
<msg time="2026-04-10T00:56:16.951109" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:16.951158" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:16.851576" elapsed="0.099619"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:16.951590" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:16.951298" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.951269" elapsed="0.000431"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:16.952188" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:16.951850" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:16.952655" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:16.952414" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.952394" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:16.952770" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:16.955398" elapsed="0.000189"/>
</kw>
<msg time="2026-04-10T00:56:16.955666" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:16.954294" elapsed="0.001508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:16.956081" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:16.956441" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:16.953656" elapsed="0.002995"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:16.953071" elapsed="0.003645"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:16.815152" elapsed="0.141662"/>
</kw>
<msg time="2026-04-10T00:56:16.956909" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:16.956953" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:16.814516" elapsed="0.142474"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:16.957180" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:56:16.957070" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.957050" 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-04-10T00:56:16.957681" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:16.958021" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:16.958095" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:16.813832" elapsed="0.144372"/>
</kw>
<msg time="2026-04-10T00:56:16.958300" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:16.958345" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:16.809213" elapsed="0.149169"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:16.958740" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:16.958459" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.958442" elapsed="0.000374"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:16.809065" elapsed="0.149775"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:16.964464" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:16.964355" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.964337" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:16.965707" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:16.965598" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:16.965579" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:16.966414" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:16.965922" elapsed="0.000519"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:16.966866" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:16.966618" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:17.224052" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:16.967506" elapsed="0.256807"/>
</kw>
<msg time="2026-04-10T00:56:17.224535" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:17.224605" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:16.967052" elapsed="0.257592"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:17.239634" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:17.225288" elapsed="0.014638"/>
</kw>
<msg time="2026-04-10T00:56:17.240280" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:17.240384" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:17.224870" elapsed="0.015596"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.241205" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.240689" elapsed="0.000637"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.240642" elapsed="0.000739"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.242391" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.241730" elapsed="0.000904"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.243265" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.242783" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.242744" elapsed="0.000691"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:17.243591" elapsed="0.000077"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:17.248683" elapsed="0.000175"/>
</kw>
<msg time="2026-04-10T00:56:17.248920" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:17.246950" elapsed="0.002102"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.249325" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.249682" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:17.245441" elapsed="0.004424"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:17.244222" elapsed="0.005707"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:16.965265" elapsed="0.284762"/>
</kw>
<msg time="2026-04-10T00:56:17.250118" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:17.250161" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:16.964702" elapsed="0.285496"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:17.250393" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:56:17.250275" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.250257" elapsed="0.000242"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.250922" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.251263" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:17.251337" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:16.963997" elapsed="0.287452"/>
</kw>
<msg time="2026-04-10T00:56:17.251644" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:17.251690" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:16.959111" elapsed="0.292618"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.252065" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.251808" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.251790" elapsed="0.000356"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:16.958968" elapsed="0.293202"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:17.257758" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:17.257644" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.257535" elapsed="0.000293"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:17.259000" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:17.258892" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.258873" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:17.259579" level="INFO">${karaf_connection_index} = 307</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:17.259216" elapsed="0.000393"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:17.260011" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:17.259770" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:17.299226" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:17.260537" elapsed="0.038887"/>
</kw>
<msg time="2026-04-10T00:56:17.299689" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:17.299739" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:17.260198" elapsed="0.039578"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:17.396914" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:17.300417" elapsed="0.096793"/>
</kw>
<msg time="2026-04-10T00:56:17.397458" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:17.397508" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:17.300002" elapsed="0.097571"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.398127" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.397705" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.397665" elapsed="0.000554"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.398806" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.398368" elapsed="0.000543"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.399206" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.398982" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.398963" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:17.399324" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:17.402414" elapsed="0.000206"/>
</kw>
<msg time="2026-04-10T00:56:17.402689" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:17.401018" elapsed="0.001816"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.403194" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.403578" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:17.400323" elapsed="0.003452"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:17.399720" elapsed="0.004122"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:17.258581" elapsed="0.145362"/>
</kw>
<msg time="2026-04-10T00:56:17.404048" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:17.404093" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:17.257984" elapsed="0.146326"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:17.404528" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-10T00:56:17.404407" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.404385" 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-04-10T00:56:17.405077" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.405430" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:17.405505" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:17.257202" elapsed="0.148437"/>
</kw>
<msg time="2026-04-10T00:56:17.405740" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:17.405787" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:17.252447" elapsed="0.153378"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.406169" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.405904" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.405886" elapsed="0.000360"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:17.252301" elapsed="0.153970"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:16.808878" elapsed="0.597428"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:56:16.806391" elapsed="0.599974"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:56:16.801245" elapsed="0.605179"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:16.800808" elapsed="0.605664"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:56:16.797522" elapsed="0.609005"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.419294" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:17.418778" elapsed="0.000550"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.419893" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:17.419567" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:17.419979" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:56:17.420171" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:17.418324" elapsed="0.001872"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.431358" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:17.430965" elapsed="0.000428"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:17.431614" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:56:17.431799" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:17.430588" elapsed="0.001235"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.445639" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.445296" elapsed="0.000488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.446219" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.445959" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.446742" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.446444" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.447215" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.446957" elapsed="0.000302"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:17.448177" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:56:17.447956" elapsed="0.000247"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:56:17.448535" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:56:17.448360" elapsed="0.000218"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:56:17.448733" elapsed="0.000210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.449350" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.449101" elapsed="0.000292"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:56:17.449440" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:56:17.449643" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:56:17.447489" elapsed="0.002180"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:17.458893" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:56:17.458943" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:17.459051" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:17.452071" elapsed="0.007007"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.449754" elapsed="0.009372"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.459314" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.459155" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.449732" elapsed="0.009700"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.462954" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.460520" elapsed="0.002498"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.460292" elapsed="0.002769"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.460274" elapsed="0.002812"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.466488" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.463375" elapsed="0.003199"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.463144" elapsed="0.003480"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.463126" elapsed="0.003532"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.467503" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:17.466909" elapsed="0.000655"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.468072" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.467729" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.468870" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:17.468414" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.468186" elapsed="0.000846"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.467700" elapsed="0.001363"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.469822" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:17.469288" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.470284" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.469958" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.471052" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:17.470639" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.470397" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.469933" elapsed="0.001234"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:17.471383" elapsed="0.000533"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:17.472563" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:17.472148" elapsed="0.000454"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:17.472821" elapsed="0.003316"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:17.459837" elapsed="0.016365"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:17.476384" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:17.476277" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.476258" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:17.479026" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:17.476616" elapsed="0.002440"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:17.479105" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:56:17.479262" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:17.442454" elapsed="0.036833"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:17.479351" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:56:17.479515" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:56:17.439726" elapsed="0.039813"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:17.479609" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:56:17.479756" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:17.430034" elapsed="0.049745"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:56:17.425400" elapsed="0.054443"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:17.420412" elapsed="0.059467"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.490048" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:17.489750" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:17.490120" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:17.490266" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:17.489390" elapsed="0.000900"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.504069" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.503815" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.504504" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.504268" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.505008" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.504762" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.505451" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.505205" elapsed="0.000289"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:17.506305" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:56:17.506115" elapsed="0.000216"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:56:17.506670" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:56:17.506484" elapsed="0.000212"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:56:17.506846" elapsed="0.000188"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.507472" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.507191" elapsed="0.000326"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:56:17.507576" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:17.507733" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:56:17.505713" elapsed="0.002044"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:17.520228" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:56:17.520350" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:17.520612" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:17.510848" elapsed="0.009827"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.507829" elapsed="0.012955"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.521221" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.520847" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.507811" elapsed="0.013605"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.529730" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.523903" elapsed="0.005932"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.523314" elapsed="0.006601"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.523272" elapsed="0.006698"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.533777" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.530632" elapsed="0.003192"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.530097" elapsed="0.003762"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.530059" elapsed="0.003825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.534478" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:17.534069" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.534834" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.534592" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.535532" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:17.535083" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.534915" elapsed="0.000706"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.534573" elapsed="0.001069"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.536174" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:17.535808" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.536502" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.536271" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.537052" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:17.536759" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.536598" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.536253" elapsed="0.000970"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:17.537382" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:17.538212" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:17.537916" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:17.538391" elapsed="0.002392"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:17.522278" elapsed="0.018571"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:17.541033" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:17.540923" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.540904" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:17.543742" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:17.541253" elapsed="0.002517"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:17.543818" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:56:17.543985" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:17.501114" elapsed="0.042894"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:17.544075" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:56:17.544224" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:56:17.498486" elapsed="0.045763"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:17.544300" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:56:17.544447" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:17.488938" elapsed="0.055533"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:56:17.484477" elapsed="0.060059"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:17.479980" elapsed="0.064610"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.554877" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:17.554573" elapsed="0.000330"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:17.554948" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:17.555096" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:17.554214" elapsed="0.000906"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.568741" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.568467" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.569183" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.568944" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.569638" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.569381" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.570075" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.569834" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:17.570932" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:56:17.570733" elapsed="0.000224"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:56:17.571277" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:56:17.571110" elapsed="0.000192"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:56:17.571526" elapsed="0.000212"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.572142" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.571895" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:56:17.572227" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:17.572382" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:56:17.570317" elapsed="0.002089"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:17.580396" level="INFO">POST Request : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:56:17.580458" level="INFO">POST Response : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:17.580597" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:17.574529" elapsed="0.006096"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.572477" elapsed="0.008204"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.580909" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.580715" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.572459" elapsed="0.008543"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.585019" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.582172" elapsed="0.002917"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.581932" elapsed="0.003210"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.581911" elapsed="0.003268"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.589178" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.585621" elapsed="0.003631"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.585264" elapsed="0.004042"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.585239" elapsed="0.004104"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.590235" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:17.589651" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.590772" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.590384" elapsed="0.000476"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.591628" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:17.591137" elapsed="0.000531"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.590895" elapsed="0.000826"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.590356" elapsed="0.001398"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.592536" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:17.591995" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.593056" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.592706" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.593883" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:17.593417" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.593178" elapsed="0.000797"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.592679" elapsed="0.001327"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:17.594246" elapsed="0.000534"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:17.595504" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:17.595026" elapsed="0.000536"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:17.595796" elapsed="0.002900"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:17.581419" elapsed="0.017432"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:17.599063" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:17.598941" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.598918" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:17.601746" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:17.599297" elapsed="0.002478"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:17.601827" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:56:17.601998" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:17.565651" elapsed="0.036373"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:17.602096" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:56:17.602247" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:56:17.563055" elapsed="0.039217"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:17.602323" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:56:17.602469" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:17.553762" elapsed="0.048732"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:56:17.549225" elapsed="0.053350"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:17.544698" elapsed="0.057913"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:17.420266" elapsed="0.182383"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.614485" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:17.614130" elapsed="0.000390"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:17.614598" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:56:17.614773" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:17.613762" elapsed="0.001036"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.621646" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.621276" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.622115" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.621872" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:17.628596" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:17.628658" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:17 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782577,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:17.628762" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:17.624400" elapsed="0.004388"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.622247" elapsed="0.006587"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.629023" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.628864" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.622220" elapsed="0.006887"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.633069" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782577,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.630303" elapsed="0.002816"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.629991" elapsed="0.003164"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.629973" elapsed="0.003206"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.635894" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:17.633464" elapsed="0.002477"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.633236" elapsed="0.002740"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.633219" elapsed="0.002782"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.636865" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:17.636267" elapsed="0.000638"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.637354" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.637010" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.638156" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:17.637727" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.637468" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.636984" elapsed="0.001288"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.639028" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:17.638498" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.639509" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:17.639164" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.640283" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:17.639872" elapsed="0.000447"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:17.639644" elapsed="0.000724"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.639139" elapsed="0.001258"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:17.640636" elapsed="0.000487"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:17.641789" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:17.641356" elapsed="0.000469"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:17.642047" elapsed="0.002955"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:17.629520" elapsed="0.015548"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:17.645248" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:56:17.645139" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:17.645120" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:17.645495" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:17.645587" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:56:17.648038" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782577,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:17.615153" elapsed="0.032914"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:17.648119" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:17.648269" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782577,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:17.613264" elapsed="0.035031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.649275" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782577, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:17.648879" elapsed="0.000424"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:17.649350" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:17.649564" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782577, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:17.648518" elapsed="0.001075"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:17.649959" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:17.649775" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.650465" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:17.650163" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.650942" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:17.650680" elapsed="0.000288"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:56:17.651509" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:56:17.651144" elapsed="0.000455">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:56:17.608828" elapsed="0.042886">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:18.664758" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:18.664368" elapsed="0.000422"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:18.664851" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:56:18.665022" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:18.663951" elapsed="0.001095"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:18.672149" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:18.671885" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:18.672616" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:18.672357" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:18.679769" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:18.679830" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782578,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:18.679927" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:18.674810" elapsed="0.005143"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:18.672736" elapsed="0.007261"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:18.680185" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:18.680026" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:18.672713" elapsed="0.007559"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:18.684322" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782578,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:18.681363" elapsed="0.003033"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:18.681132" elapsed="0.003316"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:18.681112" elapsed="0.003372"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:18.688571" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:18.684930" elapsed="0.003713"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:18.684594" elapsed="0.004101"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:18.684566" elapsed="0.004164"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:18.689584" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:18.688988" elapsed="0.000639"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:18.690108" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:18.689734" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:18.690987" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:18.690473" elapsed="0.000638"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:18.690232" elapsed="0.000945"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:18.689707" elapsed="0.001508"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:18.692155" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:18.691517" elapsed="0.000678"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:18.692685" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:18.692300" elapsed="0.000473"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:18.693497" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:18.693053" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:18.692810" elapsed="0.000803"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:18.692273" elapsed="0.001372"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:18.693874" elapsed="0.000521"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:18.695126" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:18.694666" elapsed="0.000487"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:18.695323" elapsed="0.002389"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:18.680663" elapsed="0.017133"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:18.698009" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:56:18.697893" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:18.697871" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:18.698250" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:18.698323" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:56:18.700644" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782578,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:18.665394" elapsed="0.035279"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:18.700727" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:18.700879" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782578,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:18.663337" elapsed="0.037568"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:18.701895" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782578, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:18.701470" elapsed="0.000453"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:18.701972" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:18.702129" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782578, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:18.701127" elapsed="0.001028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:18.702531" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:18.702348" elapsed="0.000230"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:18.703084" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:18.702759" elapsed="0.000352"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:18.703563" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:18.703285" elapsed="0.000305"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:56:18.704129" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:56:18.703773" elapsed="0.000429">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:56:18.652630" elapsed="0.051684">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:19.720320" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:19.719523" elapsed="0.000867"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:19.720510" elapsed="0.000111"/>
</return>
<msg time="2026-04-10T00:56:19.720908" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:19.718688" elapsed="0.002277"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:19.731096" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:19.730733" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:19.731928" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:19.731585" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:19.739734" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:19.739793" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782579,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:19.739888" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:19.735008" elapsed="0.004907"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:19.732096" elapsed="0.007862"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:19.740147" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:19.739986" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:19.732068" elapsed="0.008165"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:19.744061" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782579,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:19.741265" elapsed="0.002865"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:19.741041" elapsed="0.003141"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:19.741023" elapsed="0.003193"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:19.748154" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:19.744625" elapsed="0.003594"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:19.744293" elapsed="0.003974"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:19.744269" elapsed="0.004032"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:19.749114" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:19.748571" elapsed="0.000580"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:19.749600" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:19.749248" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:19.750376" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:19.749942" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:19.749716" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:19.749223" elapsed="0.001272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:19.751248" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:19.750741" elapsed="0.000547"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:19.751796" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:19.751405" elapsed="0.000473"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:19.752570" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:19.752136" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:19.751911" elapsed="0.000749"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:19.751371" elapsed="0.001318"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:19.752902" elapsed="0.000482"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:19.754112" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:19.753707" elapsed="0.000441"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:19.754399" elapsed="0.002568"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:19.740618" elapsed="0.016412"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:19.757204" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:56:19.757099" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:19.757080" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:19.757437" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:19.757507" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:56:19.759816" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782579,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:19.721762" elapsed="0.038083"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:19.759895" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:19.760045" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782579,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:19.717276" elapsed="0.042795"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:19.761040" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782579, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:19.760646" elapsed="0.000422"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:19.761116" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:19.761269" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782579, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:19.760291" elapsed="0.001004"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:19.761671" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:19.761474" elapsed="0.000222"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:19.762175" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:19.761874" elapsed="0.000326"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:19.762668" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:19.762385" elapsed="0.000308"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:56:19.763214" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:56:19.762865" elapsed="0.000420">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:56:19.705221" elapsed="0.058174">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.776256" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:20.775893" elapsed="0.000396"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:20.776346" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:56:20.776511" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:20.775498" elapsed="0.001038"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.783828" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.783445" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.784316" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.784061" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:20.791801" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:20.791958" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782580,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:20.792087" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:20.786707" elapsed="0.005409"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.784449" elapsed="0.007722"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:20.792410" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:20.792208" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.784423" elapsed="0.008077"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.797432" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782580,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.793707" elapsed="0.003809"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.793440" elapsed="0.004154"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.793421" elapsed="0.004213"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.801859" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.798112" elapsed="0.003829"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.797727" elapsed="0.004274"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.797699" elapsed="0.004343"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.802997" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.802351" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:20.803521" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:20.803154" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.804379" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:20.803920" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.803670" elapsed="0.000803"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.803125" elapsed="0.001380"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.805361" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.804793" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:20.805966" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:20.805508" elapsed="0.000548"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.806578" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:20.806260" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.806092" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.805481" elapsed="0.001182"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:20.806834" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:20.807681" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.807366" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:20.807867" elapsed="0.002540"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:20.792947" elapsed="0.017537"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:20.810708" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:56:20.810588" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.810563" 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-04-10T00:56:20.810972" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:20.811043" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:56:20.813367" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782580,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:20.776908" elapsed="0.036572"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:20.813538" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:56:20.813712" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782580,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:20.774851" elapsed="0.038887"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.814870" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782580, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.814414" elapsed="0.000485"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:20.814947" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:20.815102" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782580, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:20.814016" elapsed="0.001112"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:20.815490" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:20.815309" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.816020" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:20.815711" elapsed="0.000335"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.816477" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:20.816216" elapsed="0.000286"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:56:20.816691" elapsed="0.000313"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:56:20.764263" elapsed="0.052803"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:56:17.608113" elapsed="3.209005"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:17.607533" elapsed="3.209651"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:17.602864" elapsed="3.214355"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.830952" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:20.830650" elapsed="0.000329"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:20.831026" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:20.831178" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:20.830285" elapsed="0.000917"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.837829" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.837534" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.838279" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.838033" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:20.846889" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:20.846949" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782580,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:20.847052" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:20.840429" elapsed="0.006650"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.838391" elapsed="0.008740"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:20.847397" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:20.847170" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.838372" elapsed="0.009239"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.853001" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782580,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.849133" elapsed="0.003941"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.848807" elapsed="0.004318"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.848780" elapsed="0.004381"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.857183" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.853595" elapsed="0.003658"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.853244" elapsed="0.004060"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.853219" elapsed="0.004122"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.858184" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.857616" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:20.858522" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:20.858283" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.859092" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:20.858787" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.858623" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.858264" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.859716" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.859337" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:20.860048" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:20.859813" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.860604" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:20.860290" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.860129" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.859794" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:20.860841" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:20.861655" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.861357" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:20.861852" elapsed="0.002348"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:20.848156" elapsed="0.016108"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:20.864440" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:56:20.864336" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.864317" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:20.864694" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:20.864766" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:56:20.867075" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782580,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:20.831538" elapsed="0.035566"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:20.867157" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:20.867309" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782580,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:20.829826" elapsed="0.037510"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.868304" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782580, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.867913" elapsed="0.000421"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:20.868419" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:20.868594" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782580, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:20.867571" elapsed="0.001051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:20.868983" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:20.868801" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.869487" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:20.869185" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.870000" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:20.869702" elapsed="0.000324"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:56:20.870197" elapsed="0.000436"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:56:20.825340" elapsed="0.045353"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:56:20.824758" elapsed="0.045985"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:20.824322" elapsed="0.046482"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:20.817326" elapsed="0.053512"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.882218" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:20.881919" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:20.882289" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:20.882438" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:20.881540" elapsed="0.000923"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.889065" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.888817" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.889512" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.889269" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:20.896166" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:20.896222" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782580,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:20.896314" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:20.891727" elapsed="0.004613"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.889641" elapsed="0.006742"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:20.896582" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:20.896410" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.889622" elapsed="0.007049"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.901147" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782580,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.897693" elapsed="0.003525"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.897453" elapsed="0.003817"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.897435" elapsed="0.003870"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.905317" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.901735" elapsed="0.003648"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.901386" elapsed="0.004048"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.901361" elapsed="0.004108"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.906356" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.905731" elapsed="0.000665"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:20.906874" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:20.906501" elapsed="0.000459"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.907701" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:20.907234" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.906995" elapsed="0.000799"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.906475" elapsed="0.001350"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.908641" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.908062" elapsed="0.000619"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:20.909128" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:20.908784" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.909987" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:20.909484" elapsed="0.000542"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.909248" elapsed="0.000830"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.908758" elapsed="0.001350"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:20.910256" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:20.911047" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.910779" elapsed="0.000293"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:20.911226" elapsed="0.002498"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:20.897031" elapsed="0.016771"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:20.913974" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:56:20.913872" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.913853" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:20.914204" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:20.914275" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:56:20.916571" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782580,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:20.882806" elapsed="0.033794"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:20.916652" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:20.916801" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782580,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:20.881090" elapsed="0.035737"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.917801" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782580, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.917381" elapsed="0.000450"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:20.917880" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:20.918035" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782580, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:20.917044" elapsed="0.001018"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:20.918419" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:20.918239" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.918938" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:20.918635" elapsed="0.000329"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.919440" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:56:20.919136" elapsed="0.000331"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:56:20.919654" elapsed="0.000312"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:56:20.876460" elapsed="0.043566"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:56:20.875840" elapsed="0.044236"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:20.875428" elapsed="0.044709"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:20.870929" elapsed="0.049241"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:17.602709" elapsed="3.317492"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.931053" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:20.930747" elapsed="0.000333"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:20.931127" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:20.931276" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:20.930380" elapsed="0.000921"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.938088" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.937837" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.938534" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.938293" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:20.945532" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:20.945609" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782580,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:20.945704" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:20.940696" elapsed="0.005054"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.938662" elapsed="0.007132"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:20.945979" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:20.945822" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.938643" elapsed="0.007423"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.949507" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782580,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.947109" elapsed="0.002463"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.946883" elapsed="0.002725"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.946865" elapsed="0.002768"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.952593" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.949928" elapsed="0.002717"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.949689" elapsed="0.002995"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.949672" elapsed="0.003039"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.953374" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.952923" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:20.953800" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:20.953479" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.954654" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:20.954050" elapsed="0.000644"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.953886" elapsed="0.000860"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.953459" elapsed="0.001318"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.955714" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.955150" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:20.956209" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:20.955861" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.957037" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:20.956594" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.956331" elapsed="0.000799"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.955834" elapsed="0.001328"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:20.957400" elapsed="0.000574"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:20.958669" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.958224" elapsed="0.000485"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:20.958943" elapsed="0.004013"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:20.946437" elapsed="0.016669"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:20.963501" elapsed="0.000095"/>
</return>
<status status="PASS" start="2026-04-10T00:56:20.963268" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.963225" elapsed="0.000503"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:20.964059" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:20.964212" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:56:20.968139" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782580,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:20.931646" elapsed="0.036539"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:20.968264" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:56:20.968485" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782580,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:20.929921" elapsed="0.038604"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:56:20.968612" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:56:20.968818" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782580,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 1. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:56:20.925425" elapsed="0.043430"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.970398" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782580, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:20.969781" elapsed="0.000654"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:20.970503" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:56:20.970738" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782580, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:20.969205" elapsed="0.001572"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:20.971277" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:20.971024" elapsed="0.000287"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.971977" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:56:20.971583" elapsed="0.000474"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:56:20.924983" elapsed="0.047159"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:20.920388" elapsed="0.051807"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.987969" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:20.987464" elapsed="0.000667"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:20.988216" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:56:20.988443" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:20.986948" elapsed="0.001529"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.998052" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.997530" elapsed="0.000602"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:20.998813" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:20.998440" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:21.007947" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:21.008037" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:21 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782581,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:21.008184" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:21.001973" elapsed="0.006247"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:20.998988" elapsed="0.009300"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.008588" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.008329" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:20.998955" elapsed="0.009760"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.013878" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782581,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:21.010291" elapsed="0.003652"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:21.009922" elapsed="0.004071"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.009894" elapsed="0.004131"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.017633" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:21.014407" elapsed="0.003318"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:21.014103" elapsed="0.003673"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.014080" elapsed="0.003728"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.018600" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:21.018057" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.019059" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.018733" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.019826" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:21.019399" elapsed="0.000467"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:21.019171" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.018708" elapsed="0.001241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.020683" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:21.020176" elapsed="0.000581"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.021179" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.020853" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.021947" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:21.021510" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:21.021291" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.020830" elapsed="0.001230"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:21.022273" elapsed="0.000495"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:21.023380" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:21.022994" elapsed="0.000489"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:21.023731" elapsed="0.003258"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:21.009270" elapsed="0.017806"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:21.027321" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T00:56:21.027172" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.027148" elapsed="0.000298"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.027676" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.027774" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:56:21.030667" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782581,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:20.988974" elapsed="0.041722"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:21.030749" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:21.030902" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782581,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:20.986170" elapsed="0.044757"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:56:21.030973" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:56:21.031117" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782581,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:56:20.979976" elapsed="0.051170"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.032125" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782581, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:21.031729" elapsed="0.000424"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:21.032202" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:21.032353" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782581, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:21.031367" elapsed="0.001011"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:21.032750" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:21.032570" elapsed="0.000206"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.033228" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:56:21.032953" elapsed="0.000330"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:56:20.979180" elapsed="0.054160"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:20.972326" elapsed="0.061047"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.044195" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:21.043892" elapsed="0.000330"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:21.044267" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:21.044413" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:21.043533" elapsed="0.000904"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.051170" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:21.050919" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.051635" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:21.051374" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:21.058523" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:21.058646" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:21 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782581,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:21.058743" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:21.053801" elapsed="0.004968"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:21.051748" elapsed="0.007065"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.058993" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.058839" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.051729" elapsed="0.007351"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.062458" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782581,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:21.060087" elapsed="0.002420"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:21.059867" elapsed="0.002688"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.059849" elapsed="0.002733"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.065171" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:21.062860" elapsed="0.002357"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:21.062639" elapsed="0.002613"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.062622" elapsed="0.002654"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.065838" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:21.065437" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.066169" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.065935" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.066722" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:21.066409" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:21.066250" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.065917" elapsed="0.000887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.067315" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:21.066961" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.067655" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.067409" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.068188" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:21.067897" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:21.067735" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.067392" elapsed="0.000876"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:21.068417" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:21.069204" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:21.068938" elapsed="0.000292"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:21.069383" elapsed="0.002373"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:21.059430" elapsed="0.012388"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:56:21.071992" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:56:21.071887" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.071869" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.072224" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.072294" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:56:21.074604" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782581,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:21.044778" elapsed="0.029903"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:21.074736" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:21.074890" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782581,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:56:21.043078" elapsed="0.031838"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:56:21.074962" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:56:21.075105" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782581,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 3. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:56:21.038596" elapsed="0.036536"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.076091" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782581, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:21.075701" elapsed="0.000418"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:21.076167" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:21.076320" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782581, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:21.075347" elapsed="0.001000"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:21.076716" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:21.076521" elapsed="0.000220"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.077196" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:56:21.076917" elapsed="0.000333"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:56:21.038143" elapsed="0.039164"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:21.033470" elapsed="0.043871"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:20.920253" elapsed="0.157119"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:56:17.415504" elapsed="3.661925"/>
</kw>
<doc>Initiate get operation and check flow count across cluster nodes</doc>
<status status="PASS" start="2026-04-10T00:56:16.796773" elapsed="4.280791"/>
</test>
<test id="s1-s3-t20" name="Verify Flows In Switch Before Leader Restart" line="159">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:56:21.081680" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:56:21.081382" elapsed="0.000566"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.082947" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.082838" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.082820" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.088057" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.087950" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.087932" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.089118" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:21.088742" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.089622" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:21.089305" elapsed="0.000366"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:21.089716" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:21.089869" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:21.088350" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.095287" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.095181" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.095163" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.096522" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.096417" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.096400" elapsed="0.000255"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:21.097107" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:21.096805" elapsed="0.000332"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.097564" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:21.097302" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.133676" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:21.098125" elapsed="0.035795"/>
</kw>
<msg time="2026-04-10T00:56:21.134143" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:21.134193" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.097780" elapsed="0.036452"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.221361" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:21.134935" elapsed="0.086701"/>
</kw>
<msg time="2026-04-10T00:56:21.221860" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:21.221909" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.134477" elapsed="0.087470"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.222373" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.222061" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.222030" elapsed="0.000428"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.222989" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:21.222623" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.223374" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.223154" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.223136" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:21.223490" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:21.226076" elapsed="0.000171"/>
</kw>
<msg time="2026-04-10T00:56:21.226308" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:21.225047" elapsed="0.001396"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.226898" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.227245" elapsed="0.000265"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:21.224389" elapsed="0.003300"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:21.223820" elapsed="0.003960"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:21.096117" elapsed="0.131797"/>
</kw>
<msg time="2026-04-10T00:56:21.228233" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:21.228313" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.095506" elapsed="0.132862"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:21.228641" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:56:21.228476" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.228451" elapsed="0.000380"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.229559" 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-04-10T00:56:21.230062" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.230162" 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-04-10T00:56:21.094848" elapsed="0.135468"/>
</kw>
<msg time="2026-04-10T00:56:21.230443" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:21.230507" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.090257" elapsed="0.140333"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.231040" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.230698" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.230674" elapsed="0.000472"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:21.090116" elapsed="0.141070"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.238692" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.238523" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.238498" elapsed="0.000289"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.240327" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.240187" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.240161" elapsed="0.000260"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:21.241090" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:21.240644" elapsed="0.000484"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.241734" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:21.241345" elapsed="0.000426"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.276579" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:21.242456" elapsed="0.034239"/>
</kw>
<msg time="2026-04-10T00:56:21.276861" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:21.276908" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.241993" elapsed="0.034952"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.357572" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:21.277471" elapsed="0.080427"/>
</kw>
<msg time="2026-04-10T00:56:21.358206" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:21.358279" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.277121" elapsed="0.081216"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.358967" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.358491" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.358448" elapsed="0.000645"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.359864" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:21.359315" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.360600" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.360240" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.360212" elapsed="0.000507"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:21.360773" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:21.364981" elapsed="0.000267"/>
</kw>
<msg time="2026-04-10T00:56:21.365346" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:21.363048" elapsed="0.002625"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.366311" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.366690" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:21.362083" elapsed="0.004801"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:21.361215" elapsed="0.005736"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:21.239783" elapsed="0.127271"/>
</kw>
<msg time="2026-04-10T00:56:21.367157" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:21.367203" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.238992" elapsed="0.128251"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:21.367460" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:56:21.367338" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.367314" 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 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.368023" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.368404" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.368479" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:21.238063" elapsed="0.130554"/>
</kw>
<msg time="2026-04-10T00:56:21.368717" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:21.368763" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.231576" elapsed="0.137225"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.369136" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.368879" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.368862" elapsed="0.000350"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:21.231359" elapsed="0.137877"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.374999" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.374869" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.374846" elapsed="0.000234"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.376348" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.376242" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.376225" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:21.376912" level="INFO">${karaf_connection_index} = 307</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:21.376595" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.377350" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:21.377105" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.413325" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:21.377938" elapsed="0.035799"/>
</kw>
<msg time="2026-04-10T00:56:21.413988" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:21.414050" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.377590" elapsed="0.036504"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.506648" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:21.414872" elapsed="0.092110"/>
</kw>
<msg time="2026-04-10T00:56:21.507264" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:21.507326" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.414362" elapsed="0.093013"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.507969" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.507525" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.507483" elapsed="0.000595"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.508765" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:21.508275" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.509264" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.508972" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.508950" elapsed="0.000412"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:21.509408" elapsed="0.000095"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:21.512935" elapsed="0.000225"/>
</kw>
<msg time="2026-04-10T00:56:21.513245" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:21.511386" elapsed="0.002040"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.513839" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.514496" elapsed="0.000133"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:21.510615" elapsed="0.004167"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:21.509888" elapsed="0.004981"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:21.375935" elapsed="0.139068"/>
</kw>
<msg time="2026-04-10T00:56:21.515136" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:21.515195" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.375263" elapsed="0.139985"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:21.515525" elapsed="0.000087"/>
</return>
<status status="PASS" start="2026-04-10T00:56:21.515371" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.515339" elapsed="0.000358"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.516306" elapsed="0.000036"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.516838" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.516928" 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-04-10T00:56:21.374436" elapsed="0.142627"/>
</kw>
<msg time="2026-04-10T00:56:21.517263" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:21.517318" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.369639" elapsed="0.147725"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.517829" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.517479" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.517437" elapsed="0.000485"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:21.369367" elapsed="0.148583"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:21.089946" elapsed="0.428046"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:56:21.087587" elapsed="0.430482"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:56:21.082535" elapsed="0.435612"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.082103" elapsed="0.436104"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:56:21.078690" elapsed="0.439594"/>
</kw>
<kw name="Verify Aggregate Flow From Mininet Session" owner="MininetKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:21.520908" elapsed="0.000221"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:21.520573" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.520520" elapsed="0.000686"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.521915" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:21.521431" elapsed="0.000512"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:21.522848" elapsed="0.000162"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:21.522623" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.522605" elapsed="0.000465"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.525259" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:21.523212" elapsed="0.002122"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.553015" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<msg time="2026-04-10T00:56:21.553303" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:56:21.525516" elapsed="0.027827"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:56:21.553487" elapsed="0.000097"/>
</return>
<msg time="2026-04-10T00:56:21.553790" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 338 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:56:21.522292" elapsed="0.031535"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:56:21.554509" level="INFO">${flows} = ['1000']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:56:21.554133" elapsed="0.000408"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.555323" level="INFO">${total_flows} = 1000</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:21.554779" elapsed="0.000577"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.556015" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-04-10T00:56:21.555652" elapsed="0.000439"/>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="PASS" start="2026-04-10T00:56:21.520156" elapsed="0.036014"/>
</kw>
<arg>${time_out}</arg>
<arg>2s</arg>
<arg>MininetKeywords.Check Flows In Mininet</arg>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:56:21.519299" elapsed="0.036938"/>
</kw>
<arg>${mininet_conn_id}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${operation_timeout}</arg>
<doc>Verify flow count per switch</doc>
<status status="PASS" start="2026-04-10T00:56:21.518605" elapsed="0.037716"/>
</kw>
<doc>Verify flows are installed in switch before leader restart.</doc>
<status status="PASS" start="2026-04-10T00:56:21.078033" elapsed="0.478445"/>
</test>
<test id="s1-s3-t21" name="Kill Leader From Cluster Node" line="166">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:56:21.564382" elapsed="0.000336"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:56:21.564030" elapsed="0.000768"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.566255" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.566089" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.566059" elapsed="0.000291"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.573296" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.573134" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.573106" elapsed="0.000297"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.574629" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:21.574161" elapsed="0.000498"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.575142" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:21.574828" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:21.575214" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:56:21.575379" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:21.573755" elapsed="0.001649"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.581126" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.581013" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.580993" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.582437" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.582330" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.582313" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:21.582992" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:21.582679" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.583433" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:21.583183" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.626865" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:21.583992" elapsed="0.043158"/>
</kw>
<msg time="2026-04-10T00:56:21.627427" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:21.627476" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.583653" elapsed="0.043862"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.723259" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "L "e "a "[78Cd "[A[78Ce
 "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:21.628760" elapsed="0.094817"/>
</kw>
<msg time="2026-04-10T00:56:21.723838" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:21.723889" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.627862" elapsed="0.096067"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.724431" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.724060" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.724022" elapsed="0.000503"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.725129" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "L "e "a "[78Cd "[A[78Ce
 "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:21.724709" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.725618" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.725306" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.725287" elapsed="0.000494"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:21.725820" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:21.728755" elapsed="0.000190"/>
</kw>
<msg time="2026-04-10T00:56:21.729015" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:21.727453" elapsed="0.001707"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.729513" elapsed="0.000200"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.729994" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:21.726769" elapsed="0.003424"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:21.726151" elapsed="0.004114"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:21.582030" elapsed="0.148382"/>
</kw>
<msg time="2026-04-10T00:56:21.730516" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:21.730578" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.581355" elapsed="0.149263"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:21.731019" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:56:21.730710" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.730685" elapsed="0.000429"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.731599" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.731952" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.732025" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:21.580662" elapsed="0.151475"/>
</kw>
<msg time="2026-04-10T00:56:21.732237" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:21.732284" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.575841" elapsed="0.156492"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.732696" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.732413" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.732396" elapsed="0.000380"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:21.575691" elapsed="0.157108"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.738854" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.738716" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.738690" elapsed="0.000251"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.740272" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.740162" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.740145" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:21.740833" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:21.740491" elapsed="0.000372"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.741279" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:21.741030" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.776638" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:21.741934" elapsed="0.035023"/>
</kw>
<msg time="2026-04-10T00:56:21.777538" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:21.777631" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.741517" elapsed="0.036165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.868523" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "L "e "a "[78Cd "[A[78Ce
 "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:21.778685" elapsed="0.090149"/>
</kw>
<msg time="2026-04-10T00:56:21.869080" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:21.869128" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.778029" elapsed="0.091138"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.869718" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.869329" elapsed="0.000452"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.869258" elapsed="0.000552"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:21.870744" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "L "e "a "[78Cd "[A[78Ce
 "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:21.869961" elapsed="0.000869"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.871118" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.870898" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.870880" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:21.871233" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:21.874112" elapsed="0.000180"/>
</kw>
<msg time="2026-04-10T00:56:21.874353" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:21.872834" elapsed="0.001654"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.874788" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.875123" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:21.872170" elapsed="0.003145"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:21.871578" elapsed="0.004004"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:21.739860" elapsed="0.135824"/>
</kw>
<msg time="2026-04-10T00:56:21.875806" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:21.875854" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.739145" elapsed="0.136747"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:21.876080" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:56:21.875972" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.875953" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.876583" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.876924" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.876995" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:21.738236" elapsed="0.138869"/>
</kw>
<msg time="2026-04-10T00:56:21.877201" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:21.877245" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.733085" elapsed="0.144307"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:21.877759" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:21.877474" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.877457" elapsed="0.000380"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:21.732935" elapsed="0.144925"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.883426" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.883318" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.883300" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:21.884660" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:21.884525" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:21.884508" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:21.885175" level="INFO">${karaf_connection_index} = 307</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:21.884873" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.885634" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:21.885380" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:21.924306" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:21.886161" elapsed="0.038487"/>
</kw>
<msg time="2026-04-10T00:56:21.924939" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:21.924999" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.885824" elapsed="0.039224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:22.001622" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "L "e "a "[78Cd "[A[78Ce
 "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:21.926100" elapsed="0.075807"/>
</kw>
<msg time="2026-04-10T00:56:22.002146" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:22.002195" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.925443" elapsed="0.076790"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.002743" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:22.002360" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.002321" elapsed="0.000510"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.003362" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "L "e "a "[78Cd "[A[78Ce
 "r "[C "F "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:22.002983" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.003761" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:22.003522" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.003503" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:22.003878" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:22.007107" elapsed="0.000185"/>
</kw>
<msg time="2026-04-10T00:56:22.007363" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:22.005789" elapsed="0.001717"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.007828" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.008167" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:22.005101" elapsed="0.003526"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:22.004195" elapsed="0.004500"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:21.884226" elapsed="0.124571"/>
</kw>
<msg time="2026-04-10T00:56:22.008901" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:22.008947" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.883662" elapsed="0.125323"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:22.009199" elapsed="0.000083"/>
</return>
<status status="PASS" start="2026-04-10T00:56:22.009078" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.009054" elapsed="0.000291"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.009808" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.010163" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:22.010237" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:21.882969" elapsed="0.127380"/>
</kw>
<msg time="2026-04-10T00:56:22.010447" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:22.010493" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.878134" elapsed="0.132397"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.010891" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:22.010629" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.010612" elapsed="0.000357"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:21.877990" elapsed="0.133004"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:21.575464" elapsed="0.435564"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:56:21.572600" elapsed="0.438487"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:56:21.565711" elapsed="0.445436"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:21.565092" elapsed="0.446102"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:56:21.561057" elapsed="0.450192"/>
</kw>
<kw name="Kill_Single_Member" owner="ClusterManagement">
<kw name="ClusterManagement__Build_List" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.014621" level="INFO">${member_int} = 3</msg>
<var>${member_int}</var>
<arg>${member}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:56:22.014232" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.015096" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>${member_int}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:22.014806" elapsed="0.000316"/>
</kw>
<return>
<value>${index_list}</value>
<status status="PASS" start="2026-04-10T00:56:22.015171" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:56:22.015333" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>${member}</arg>
<status status="PASS" start="2026-04-10T00:56:22.013891" elapsed="0.001467"/>
</kw>
<kw name="Return_Member_IP" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.016221" level="INFO">${member_int} = 3</msg>
<var>${member_int}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:56:22.015909" elapsed="0.000338"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:22.016803" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_int}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:22.016408" elapsed="0.000422"/>
</kw>
<return>
<value>${member_ip}</value>
<status status="PASS" start="2026-04-10T00:56:22.016877" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:22.017029" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>${member}</arg>
<doc>Return the IP address of the member given the member_index.</doc>
<status status="PASS" start="2026-04-10T00:56:22.015586" elapsed="0.001468"/>
</kw>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:22.024607" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:22.024396" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.024367" elapsed="0.000494"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.026144" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:22.025675" elapsed="0.000498"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.026706" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:22.026340" elapsed="0.000395"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:22.026781" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:56:22.026948" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:22.025188" elapsed="0.001785"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:22.033025" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:22.032886" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.032862" elapsed="0.000247"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:22.034367" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:22.034260" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.034243" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:22.034849" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:22.034602" elapsed="0.000276"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:22.035250" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:22.035046" elapsed="0.000230"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:22.081884" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "1 ". "1 "5 "1 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:22.035797" elapsed="0.046301"/>
</kw>
<msg time="2026-04-10T00:56:22.082311" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:22.082371" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:22.035437" elapsed="0.046983"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:22.087430" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:22.083333" elapsed="0.004253"/>
</kw>
<msg time="2026-04-10T00:56:22.087754" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:22.087811" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:22.082768" elapsed="0.005076"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.088358" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:22.087984" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.087941" elapsed="0.000528"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.089098" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:22.088687" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.089731" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:22.089410" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.089385" elapsed="0.000449"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:22.089884" elapsed="0.000054"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:22.092642" elapsed="0.000291"/>
</kw>
<msg time="2026-04-10T00:56:22.093066" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:22.091575" elapsed="0.001626"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.093418" elapsed="0.000028"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.093706" elapsed="0.000030"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:22.091059" elapsed="0.002856"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:22.090308" elapsed="0.003671"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:22.033958" elapsed="0.060152"/>
</kw>
<msg time="2026-04-10T00:56:22.094241" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:22.094297" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:22.033343" elapsed="0.060990"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:22.094985" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T00:56:22.094455" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.094423" elapsed="0.000687"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.095706" elapsed="0.000036"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.096145" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:22.096243" 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-04-10T00:56:22.032448" elapsed="0.063940"/>
</kw>
<msg time="2026-04-10T00:56:22.096511" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:22.096584" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:22.027378" elapsed="0.069242"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.097066" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:22.096721" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.096699" elapsed="0.000496"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:22.027227" elapsed="0.070003"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:22.103154" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:22.103009" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.102983" elapsed="0.000257"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:22.104501" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:22.104393" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.104375" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:22.104986" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:22.104741" elapsed="0.000273"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:22.105416" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:22.105207" elapsed="0.000236"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:22.137882" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "1 ". "1 "5 "1 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:22.106038" elapsed="0.032130"/>
</kw>
<msg time="2026-04-10T00:56:22.138477" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:22.138627" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:22.105622" elapsed="0.033091"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:22.143298" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:22.140069" elapsed="0.003368"/>
</kw>
<msg time="2026-04-10T00:56:22.143685" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:22.143785" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:22.139175" elapsed="0.004670"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.144758" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:22.144169" elapsed="0.000715"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.144116" elapsed="0.000825"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.145940" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:22.145288" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.146726" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:22.146204" elapsed="0.000645"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.146163" elapsed="0.000739"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:22.146980" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:22.150798" elapsed="0.000262"/>
</kw>
<msg time="2026-04-10T00:56:22.151193" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:22.149925" elapsed="0.001353"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.151449" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.151633" elapsed="0.000021"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:22.148953" elapsed="0.002770"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:22.147635" elapsed="0.004139"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:22.104089" elapsed="0.047789"/>
</kw>
<msg time="2026-04-10T00:56:22.151984" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:22.152027" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:22.103443" elapsed="0.048612"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:22.152281" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:56:22.152157" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.152128" elapsed="0.000247"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.153164" 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-04-10T00:56:22.153516" elapsed="0.000044"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:22.153611" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:22.102509" elapsed="0.051215"/>
</kw>
<msg time="2026-04-10T00:56:22.153823" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:22.153867" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:22.097523" elapsed="0.056370"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.154229" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:22.153970" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.153952" elapsed="0.000354"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:22.097372" elapsed="0.056957"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:22.159896" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:22.159786" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.159768" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:22.161053" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:22.160948" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.160930" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:22.161524" level="INFO">${karaf_connection_index} = 307</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:22.161297" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:22.162019" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:22.161822" elapsed="0.000223"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:22.204255" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "1 ". "1 "5 "1 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:22.162561" elapsed="0.041776"/>
</kw>
<msg time="2026-04-10T00:56:22.204440" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:22.204485" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:22.162206" elapsed="0.042316"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:22.207362" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:22.205058" elapsed="0.002364"/>
</kw>
<msg time="2026-04-10T00:56:22.207519" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:22.207578" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:22.204714" elapsed="0.002892"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.207906" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:22.207684" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.207665" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.208388" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:22.208129" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.208735" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:22.208503" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.208485" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:22.208847" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:22.210580" elapsed="0.000223"/>
</kw>
<msg time="2026-04-10T00:56:22.210902" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:22.210022" elapsed="0.000944"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.211126" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.211295" elapsed="0.000020"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:22.209661" elapsed="0.001715"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:22.209139" elapsed="0.002283"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:22.160648" elapsed="0.050870"/>
</kw>
<msg time="2026-04-10T00:56:22.211633" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:22.211677" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:22.160119" elapsed="0.051585"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:22.211887" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:56:22.211780" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.211763" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.212358" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.212893" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:22.212968" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:22.159420" elapsed="0.053710"/>
</kw>
<msg time="2026-04-10T00:56:22.213227" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:22.213270" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:22.154634" elapsed="0.058664"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.213644" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:22.213375" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.213358" elapsed="0.000364"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:22.154466" elapsed="0.059280"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:22.027036" elapsed="0.186739"/>
</for>
<arg>Killing ODL${member} ${member_ip}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:56:22.022169" elapsed="0.191667"/>
</kw>
<kw name="Kill_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.215417" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:22.215043" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.215926" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:22.215627" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:22.215996" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:22.216151" level="INFO">${kill_index_list} = [3]</msg>
<var>${kill_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:22.214672" elapsed="0.001503"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.217170" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:22.216769" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.217678" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:22.217356" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:22.217749" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:22.217903" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${original_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:22.216379" elapsed="0.001548"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.219370" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:22.219000" elapsed="0.000397"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.219875" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:22.219581" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:22.219945" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:22.220096" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:22.218630" elapsed="0.001491"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:22.221186" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:22.220903" elapsed="0.000310"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:22.222001" level="INFO">index=338
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:22.221854" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.225491" elapsed="0.000094"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:22.224793" elapsed="0.000882"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.224774" elapsed="0.000929"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:22.225993" level="INFO">index=338
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:22.225857" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.227320" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:22.226347" elapsed="0.001038"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:22.228328" level="INFO">${conn_id} = 339</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:22.227586" elapsed="0.000769"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.229939" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:56:22.230208" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:56:22.229377" elapsed="0.000929"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:22.230621" elapsed="0.000595"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:56:22.232492" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:56:22.557183" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:55:49 UTC 2026

  System load:  0.93               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:55:49 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:56:22.232171" elapsed="0.325192"/>
</kw>
<msg time="2026-04-10T00:56:22.557525" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:22.231517" elapsed="0.326164"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:56:22.228642" elapsed="0.329230"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:56:22.558624" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh'.</msg>
<msg time="2026-04-10T00:56:22.581610" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:56:22.581921" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:56:22.582019" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:56:22.558190" elapsed="0.023879"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:22.582607" elapsed="0.000467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.584859" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:22.583517" elapsed="0.001488"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:22.585513" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:22.585225" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.585182" elapsed="0.000561"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:56:22.586054" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:56:22.585820" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.585799" elapsed="0.000472"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:22.586320" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:22.592961" elapsed="0.000227"/>
</kw>
<msg time="2026-04-10T00:56:22.593277" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:22.591187" elapsed="0.002252"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.594048" elapsed="0.000071"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.594542" elapsed="0.000091"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:22.586833" elapsed="0.008032"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:56:22.224133" elapsed="0.370864"/>
</kw>
<msg time="2026-04-10T00:56:22.595071" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:22.223334" elapsed="0.371807"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:56:22.222809" elapsed="0.372447"/>
</kw>
<msg time="2026-04-10T00:56:22.595312" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:22.222282" elapsed="0.373093"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:22.599249" elapsed="0.000167"/>
</kw>
<msg time="2026-04-10T00:56:22.599459" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:22.598757" elapsed="0.000762"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.599707" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:22.599870" elapsed="0.000023"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:22.595828" elapsed="0.004127"/>
</kw>
<msg time="2026-04-10T00:56:22.600047" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:56:22.221428" elapsed="0.378644"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.600506" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:22.600259" elapsed="0.000391"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:56:22.600697" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:56:22.220482" elapsed="0.380343"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:22.220308" elapsed="0.380555"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:22.220176" elapsed="0.380728"/>
</for>
<arg>command=${NODE_KILL_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:56:22.218133" elapsed="0.382851"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:22.601468" level="INFO">${updated_index_list} = [1, 2, 3]</msg>
<var>${updated_index_list}</var>
<arg>@{index_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:22.601157" elapsed="0.000336"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{kill_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:22.601666" elapsed="0.000226"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-10T00:56:22.602069" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:22.601963" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:22.601946" elapsed="0.000188"/>
</if>
<kw name="Sleep" owner="BuiltIn">
<msg time="2026-04-10T00:56:23.602804" level="INFO">Slept 1 second.</msg>
<msg time="2026-04-10T00:56:23.602965" level="INFO">Kill -9 closes open files, which may take longer than ssh overhead, but not long enough to warrant WUKS.</msg>
<arg>1s</arg>
<arg>Kill -9 closes open files, which may take longer than ssh overhead, but not long enough to warrant WUKS.</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="PASS" start="2026-04-10T00:56:22.602276" elapsed="1.000826"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Verify_Karaf_Is_Not_Running_On_Member" owner="ClusterManagement">
<kw name="Count_Running_Karafs_On_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:23.606818" level="INFO">${command} = ps axf | grep org.apache.karaf | grep -v grep | wc -l</msg>
<var>${command}</var>
<arg>${NODE_KARAF_COUNT_COMMAND}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:23.606051" elapsed="0.000829"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:23.609094" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:23.608270" elapsed="0.000886"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:23.610933" level="INFO">index=338
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:23.610606" elapsed="0.000748"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:23.617924" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:23.616976" elapsed="0.001086"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:23.616911" elapsed="0.001250"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:23.619103" level="INFO">index=338
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:23.618571" elapsed="0.001111"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:23.621000" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:23.620057" elapsed="0.001242"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:23.622868" level="INFO">${conn_id} = 340</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:23.621773" elapsed="0.001237"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:56:23.625181" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:56:23.625267" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:56:23.624797" elapsed="0.000493"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:23.625498" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:56:23.626856" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:56:23.986758" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:55:49 UTC 2026

  System load:  0.93               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:56:22 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:56:23.626517" elapsed="0.360420"/>
</kw>
<msg time="2026-04-10T00:56:23.987024" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:23.626154" elapsed="0.360955"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:56:23.623528" elapsed="0.363829"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:56:23.988176" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-04-10T00:56:24.010536" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:56:24.011255" level="INFO">${stdout} = 0</msg>
<msg time="2026-04-10T00:56:24.011674" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:56:23.987737" elapsed="0.024154"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:24.012602" elapsed="0.000933"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:24.015133" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:24.014391" elapsed="0.001026"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:24.016057" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:24.015652" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:24.015584" elapsed="0.000702"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:56:24.016881" elapsed="0.000086"/>
</return>
<status status="PASS" start="2026-04-10T00:56:24.016477" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:24.016420" elapsed="0.000711"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:24.017256" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:24.023394" elapsed="0.000239"/>
</kw>
<msg time="2026-04-10T00:56:24.023695" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.022531" elapsed="0.001304"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:24.024190" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:24.024778" elapsed="0.000051"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:24.018209" elapsed="0.006784"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:56:23.615158" elapsed="0.410143"/>
</kw>
<msg time="2026-04-10T00:56:24.025411" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:23.613861" elapsed="0.411603"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:56:23.612991" elapsed="0.412570"/>
</kw>
<msg time="2026-04-10T00:56:24.025606" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:23.611747" elapsed="0.413906"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:24.029082" elapsed="0.000189"/>
</kw>
<msg time="2026-04-10T00:56:24.029314" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.028585" elapsed="0.000791"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:24.029536" elapsed="0.000037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:24.029717" elapsed="0.000021"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:24.025947" elapsed="0.003852"/>
</kw>
<msg time="2026-04-10T00:56:24.029889" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:56:23.609668" elapsed="0.420246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:24.030344" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:24.030093" elapsed="0.000296"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:56:24.030431" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:24.030643" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>command=${command}</arg>
<arg>member_index=${member_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:56:23.607327" elapsed="0.423343"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-04-10T00:56:24.030718" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:56:24.030866" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>member_index=${member_index}</arg>
<doc>Remotely execute grep for karaf process, return count as string.</doc>
<status status="PASS" start="2026-04-10T00:56:23.605216" elapsed="0.425674"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>0</arg>
<arg>${count}</arg>
<arg>Found running Karaf count: ${count}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-04-10T00:56:24.031050" elapsed="0.000367"/>
</kw>
<arg>member_index=${index}</arg>
<doc>Fail if non-zero karaf instances are counted on member of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:23.604212" elapsed="0.427268"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:23.603761" elapsed="0.427751"/>
</iter>
<var>${index}</var>
<value>@{kill_index_list}</value>
<status status="PASS" start="2026-04-10T00:56:23.603279" elapsed="0.428282"/>
</for>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:24.034805" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:24.034383" elapsed="0.000449"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:24.035302" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:24.034995" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:24.035373" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:24.035530" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:24.033996" elapsed="0.001575"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:24.036720" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:24.036431" elapsed="0.000315"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:24.037513" level="INFO">index=338
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:24.037368" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:24.042451" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:24.041769" elapsed="0.000866"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:24.041749" elapsed="0.000913"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:24.042953" level="INFO">index=338
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:24.042817" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:24.044284" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:24.043310" elapsed="0.001038"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:24.045271" level="INFO">${conn_id} = 341</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:24.044527" elapsed="0.000771"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:56:24.046851" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:56:24.047117" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:56:24.046294" elapsed="0.000922"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.047511" elapsed="0.000617"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:56:24.049430" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:56:24.428278" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:55:48 UTC 2026

  System load:  1.01               Processes:             122
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:55:48 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:56:24.049109" elapsed="0.379341"/>
</kw>
<msg time="2026-04-10T00:56:24.428627" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.048451" elapsed="0.380288"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:56:24.045580" elapsed="0.383337"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:56:24.429588" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:56:24.442435" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:56:24.442680" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:56:24.442745" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:56:24.429205" elapsed="0.013573"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:24.443104" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:24.444587" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:24.443767" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:24.445105" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:24.444829" elapsed="0.000638"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:24.444789" elapsed="0.000741"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:56:24.446058" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-04-10T00:56:24.445693" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:24.445656" elapsed="0.000730"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:24.446465" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:24.453586" elapsed="0.000217"/>
</kw>
<msg time="2026-04-10T00:56:24.453891" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.452188" elapsed="0.001857"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:24.454462" elapsed="0.000065"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:24.454936" elapsed="0.000064"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:24.447235" elapsed="0.007972"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:56:24.041127" elapsed="0.414212"/>
</kw>
<msg time="2026-04-10T00:56:24.455414" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.038870" elapsed="0.416614"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:56:24.038323" elapsed="0.417322"/>
</kw>
<msg time="2026-04-10T00:56:24.455704" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.037812" elapsed="0.417955"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:24.461149" elapsed="0.000244"/>
</kw>
<msg time="2026-04-10T00:56:24.461469" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.460258" elapsed="0.001326"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:24.461814" elapsed="0.000031"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:24.462042" elapsed="0.000028"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:24.456346" elapsed="0.005808"/>
</kw>
<msg time="2026-04-10T00:56:24.462280" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:56:24.036963" elapsed="0.425352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:24.463036" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:24.462608" elapsed="0.000489"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:56:24.463159" elapsed="0.000042"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:56:24.035999" elapsed="0.427338"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:24.035808" elapsed="0.427581"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:24.465637" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:24.464969" elapsed="0.000731"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:24.467446" level="INFO">index=338
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:24.467131" elapsed="0.000626"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:24.475104" elapsed="0.000171"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:24.473513" elapsed="0.002088"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:24.473466" elapsed="0.002202"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:24.476360" level="INFO">index=338
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:24.476048" elapsed="0.000799"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:24.479381" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:24.477245" elapsed="0.002276"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:24.481525" level="INFO">${conn_id} = 342</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:24.479967" elapsed="0.001601"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:56:24.483297" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:56:24.483576" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:56:24.482760" elapsed="0.000940"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.483999" elapsed="0.000770"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:56:24.486066" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:56:24.799569" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:55:48 UTC 2026

  System load:  1.04               Processes:             122
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.169
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:55:49 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:56:24.485747" elapsed="0.313981"/>
</kw>
<msg time="2026-04-10T00:56:24.799890" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.485078" elapsed="0.314931"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:56:24.481843" elapsed="0.318349"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:56:24.800881" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:56:24.812966" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:56:24.813156" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:56:24.813219" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:56:24.800485" elapsed="0.012779"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:24.813791" elapsed="0.000481"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:24.815982" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:24.814759" elapsed="0.001368"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:24.816818" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:24.816343" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:24.816291" elapsed="0.000833"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:56:24.817628" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-04-10T00:56:24.817247" elapsed="0.000647"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:24.817212" elapsed="0.000742"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:24.818032" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:24.825568" elapsed="0.000156"/>
</kw>
<msg time="2026-04-10T00:56:24.825786" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.824523" elapsed="0.001375"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:24.826200" elapsed="0.000048"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:24.826534" elapsed="0.000093"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:24.818784" elapsed="0.008067"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:56:24.472073" elapsed="0.354876"/>
</kw>
<msg time="2026-04-10T00:56:24.827004" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.470613" elapsed="0.356444"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:56:24.469369" elapsed="0.357772"/>
</kw>
<msg time="2026-04-10T00:56:24.827185" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.468178" elapsed="0.359054"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:24.830918" elapsed="0.000170"/>
</kw>
<msg time="2026-04-10T00:56:24.831130" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.830330" elapsed="0.000862"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:24.831353" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:24.831517" elapsed="0.000020"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:24.827530" elapsed="0.004088"/>
</kw>
<msg time="2026-04-10T00:56:24.831710" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:56:24.466194" elapsed="0.365541"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:24.832218" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:24.831930" elapsed="0.000334"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:56:24.832314" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:56:24.463855" elapsed="0.368586"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:24.463593" elapsed="0.368887"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:24.833480" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:24.833211" elapsed="0.000295"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:24.834294" level="INFO">index=338
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:24.834146" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:24.837702" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:24.836991" elapsed="0.000877"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:24.836972" elapsed="0.000922"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:24.838182" level="INFO">index=338
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:24.838047" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:24.839490" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:24.838536" elapsed="0.001034"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:24.840575" level="INFO">${conn_id} = 343</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:24.839761" elapsed="0.000849"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:56:24.842256" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:56:24.842529" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:56:24.841711" elapsed="0.000939"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.842948" elapsed="0.000631"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:56:24.845069" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:56:25.153558" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:55:49 UTC 2026

  System load:  0.93               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:56:23 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:56:24.844601" elapsed="0.309094"/>
</kw>
<msg time="2026-04-10T00:56:25.153815" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.843916" elapsed="0.310007"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:56:24.840951" elapsed="0.313134"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:56:25.154753" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:56:25.167062" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:56:25.167258" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:56:25.167320" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:56:25.154359" elapsed="0.012994"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:25.167730" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:25.169096" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:25.168333" elapsed="0.000851"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:25.169617" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:25.169327" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.169291" elapsed="0.000517"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:56:25.170109" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:56:25.169885" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.169863" elapsed="0.000453"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:25.170365" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:25.175982" elapsed="0.000210"/>
</kw>
<msg time="2026-04-10T00:56:25.176276" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:25.174598" elapsed="0.001831"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.176881" elapsed="0.000063"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.177323" elapsed="0.000061"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:25.170836" elapsed="0.006770"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:56:24.836342" elapsed="0.341396"/>
</kw>
<msg time="2026-04-10T00:56:25.177812" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.835660" elapsed="0.342222"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:56:24.835110" elapsed="0.342882"/>
</kw>
<msg time="2026-04-10T00:56:25.178133" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:24.834604" elapsed="0.343599"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:25.182113" elapsed="0.000176"/>
</kw>
<msg time="2026-04-10T00:56:25.182340" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:25.181627" elapsed="0.000773"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.182573" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.182736" elapsed="0.000020"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:25.178635" elapsed="0.004181"/>
</kw>
<msg time="2026-04-10T00:56:25.182907" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:56:24.833739" elapsed="0.349193"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:25.183353" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:25.183109" elapsed="0.000286"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:56:25.183437" elapsed="0.000028"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:56:24.832801" elapsed="0.350775"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:24.832605" elapsed="0.351010"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:24.035670" elapsed="1.147980"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:56:24.031784" elapsed="1.151942"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-10T00:56:25.183768" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:56:25.183929" level="INFO">${updated_index_list} = [1, 2]</msg>
<var>${updated_index_list}</var>
<arg>${index_list}</arg>
<arg>${original_index_list}</arg>
<arg>${confirm}</arg>
<doc>If the list is empty, kill all ODL instances. Otherwise, kill members based on ${kill_index_list}
If ${confirm} is True, sleep 1 second and verify killed instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-04-10T00:56:22.214151" elapsed="2.969803"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-10T00:56:25.184005" elapsed="0.000025"/>
</return>
<arg>${Inventory_Leader}</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="PASS" start="2026-04-10T00:56:22.011512" elapsed="3.172616"/>
</kw>
<doc>Kill Leader Node.</doc>
<status status="PASS" start="2026-04-10T00:56:21.557234" elapsed="3.627012"/>
</test>
<test id="s1-s3-t22" name="Stop Mininet Connected To Leader Node" line="170">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:56:25.187803" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:56:25.187504" elapsed="0.000561"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:25.189065" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:25.188957" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.188939" elapsed="0.000196"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:25.194152" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:25.194046" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.194028" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:25.195218" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:25.194838" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:25.195810" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:25.195408" elapsed="0.000429"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:25.195882" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:56:25.196035" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:25.194444" elapsed="0.001615"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:25.201445" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:25.201329" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.201311" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:25.202736" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:25.202628" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.202610" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:25.203249" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:25.202950" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:25.203726" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:25.203433" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:25.244460" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:25.204256" elapsed="0.040331"/>
</kw>
<msg time="2026-04-10T00:56:25.244763" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:25.244810" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:25.203914" elapsed="0.040932"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:25.315967" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:25.245372" elapsed="0.070725"/>
</kw>
<msg time="2026-04-10T00:56:25.316257" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:25.316305" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:25.245024" elapsed="0.071319"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.316679" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:25.316424" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.316403" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:25.317208" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:25.316905" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.317603" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:25.317365" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.317347" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:25.317716" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:25.320261" elapsed="0.000170"/>
</kw>
<msg time="2026-04-10T00:56:25.320492" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:25.319161" elapsed="0.001484"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.320918" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.321249" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:25.318530" elapsed="0.002901"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:25.317999" elapsed="0.003495"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:25.202252" elapsed="0.119356"/>
</kw>
<msg time="2026-04-10T00:56:25.321701" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:25.321749" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:25.201683" elapsed="0.120112"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:25.322002" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:56:25.321890" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.321866" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.322525" elapsed="0.000058"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.322899" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:25.322971" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:25.200986" elapsed="0.122094"/>
</kw>
<msg time="2026-04-10T00:56:25.323173" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:25.323216" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:25.196432" elapsed="0.126822"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.323595" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:25.323329" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.323312" elapsed="0.000389"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:25.196287" elapsed="0.127438"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:25.329116" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:25.329010" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.328992" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:25.330317" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:25.330210" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.330193" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:25.330847" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:25.330529" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:25.331266" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:25.331031" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:25.363471" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:25.331834" elapsed="0.031782"/>
</kw>
<msg time="2026-04-10T00:56:25.363798" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:25.363845" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:25.331452" elapsed="0.032428"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:25.443095" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:25.364393" elapsed="0.079022"/>
</kw>
<msg time="2026-04-10T00:56:25.443949" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:25.444062" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:25.364052" elapsed="0.080096"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.444526" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:25.444286" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.444261" elapsed="0.000380"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:25.445106" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:25.444788" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.445564" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:25.445324" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.445304" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:25.445680" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:25.448248" elapsed="0.000171"/>
</kw>
<msg time="2026-04-10T00:56:25.448479" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:25.447149" elapsed="0.001489"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.448914" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.449243" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:25.446508" elapsed="0.002918"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:25.445959" elapsed="0.003531"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:25.329903" elapsed="0.119706"/>
</kw>
<msg time="2026-04-10T00:56:25.449702" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:25.449746" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:25.329333" elapsed="0.120451"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:25.449967" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:56:25.449861" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.449843" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.450445" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.450798" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:25.450870" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:25.328672" elapsed="0.122305"/>
</kw>
<msg time="2026-04-10T00:56:25.451069" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:25.451113" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:25.323992" elapsed="0.127158"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:25.451471" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:25.451224" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.451207" elapsed="0.000389"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:25.323850" elapsed="0.127771"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:25.457022" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:25.456915" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.456896" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:25.458263" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:25.458157" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:25.458139" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:25.458797" level="INFO">${karaf_connection_index} = 307</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:25.458474" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:25.459214" level="INFO">${current_connection_index} = 338</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:25.458982" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:25.460022" level="FAIL">OSError: Socket is closed</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:56:25.459765" elapsed="0.000985">OSError: Socket is closed</status>
</kw>
<msg time="2026-04-10T00:56:25.460975" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:56:25.461022" level="INFO">${message_write} = OSError: Socket is closed</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:25.459399" elapsed="0.001647"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:35.462249" level="FAIL">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:56:25.461569" elapsed="10.001581">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</status>
</kw>
<msg time="2026-04-10T00:56:35.463434" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:56:35.463486" level="INFO">${message_wait} = No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:25.461216" elapsed="10.002298"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:56:35.464749" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Leader Node"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:56:35.464018" elapsed="0.000798">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Leader Node"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:56:35.463687" elapsed="0.001201">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Leader Node"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:56:35.463646" elapsed="0.001276">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Leader Node"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:35.465093" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:35.465326" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:35.465182" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:35.465164" elapsed="0.000238"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:56:35.465445" elapsed="0.000019"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:35.468282" elapsed="0.000176"/>
</kw>
<msg time="2026-04-10T00:56:35.468531" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:35.467080" elapsed="0.001623"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:35.468979" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:35.469309" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:35.466377" elapsed="0.003118"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:35.465782" elapsed="0.003793"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:56:25.457856" elapsed="10.011809">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Leader Node"</status>
</kw>
<msg time="2026-04-10T00:56:35.469771" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:56:35.469815" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Leader Node"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:25.457241" elapsed="10.012599"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:35.470026" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:35.469917" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:35.469899" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:35.470947" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:35.470842" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:35.470824" elapsed="0.000191"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:35.471316" level="INFO">index=338
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:35.471168" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:35.471901" level="INFO">{1: 299, 2: 303, 3: 307}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:35.471628" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:35.472424" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:35.472176" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:35.473075" elapsed="0.000262"/>
</kw>
<msg time="2026-04-10T00:56:35.473438" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:35.473484" level="INFO">${old_connection_index} = 307</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:35.472708" elapsed="0.000800"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:35.474344" elapsed="0.000232"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:35.475699" level="FAIL">OSError: Socket is closed</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:56:35.475248" elapsed="0.001455">OSError: Socket is closed</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:35.474771" elapsed="0.002031"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:35.477437" elapsed="0.000365"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:35.476975" elapsed="0.000911"/>
</kw>
<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="PASS" start="2026-04-10T00:56:35.473830" elapsed="0.004102"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:35.473606" elapsed="0.004376"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:35.473588" elapsed="0.004419"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:35.478891" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:35.478560" elapsed="0.000358"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:56:35.478967" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:56:35.479122" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:35.478217" elapsed="0.000930"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:35.479306" elapsed="0.000462"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:35.480075" level="INFO">index=344
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:35.479940" 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-04-10T00:56:35.480354" elapsed="0.002274"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:56:35.483088" level="INFO">Logging into '10.30.171.151:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:56:35.485316" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</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="FAIL" start="2026-04-10T00:56:35.482827" elapsed="0.002890">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:35.498966" elapsed="0.000411"/>
</kw>
<msg time="2026-04-10T00:56:35.499466" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:35.497664" elapsed="0.002259"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:35.500090" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:35.500253" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:35.486514" elapsed="0.013822"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:35.485997" elapsed="0.014386"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:56:35.470491" elapsed="0.029973">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:35.500874" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:35.500949" 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="FAIL" start="2026-04-10T00:56:25.456572" elapsed="10.044484">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<msg time="2026-04-10T00:56:35.501163" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:56:35.501208" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:25.451890" elapsed="10.049342"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:35.501704" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:35.501312" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:35.501293" elapsed="0.000492"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:25.451747" elapsed="10.050062"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:25.196115" elapsed="10.305728"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:56:25.193685" elapsed="10.308218"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:56:25.188670" elapsed="10.313292"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:25.188221" elapsed="10.313789"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:56:25.185131" elapsed="10.316936"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:35.507138" elapsed="0.000162"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:35.506916" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:35.506899" elapsed="0.000462"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:35.510428" level="INFO">exit</msg>
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:35.507500" elapsed="0.002983"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:56:35.610758" level="INFO">*** Stopping 1 controllers
c0 
*** Stopping 2 links
..
*** Stopping 1 switches
s1 
*** Stopping 2 hosts
h1 h2 
*** Done
completed in 20.456 seconds
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:56:35.510661" elapsed="0.100189"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:35.611046" elapsed="0.000168"/>
</kw>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="PASS" start="2026-04-10T00:56:35.506617" elapsed="0.104661"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:35.614182" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:35.613881" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:35.613859" elapsed="0.000407"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:35.614584" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:35.614423" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:35.615299" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:35.614909" elapsed="0.000437"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:35.615895" level="INFO">${conn_id} = 345</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:35.615507" elapsed="0.000415"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:56:35.616838" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:56:35.616916" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:56:35.616559" elapsed="0.000381"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:35.617102" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:56:35.618357" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:56:35.953952" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:56:12 UTC 2026

  System load:  0.0                Processes:             107
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:56:15 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:56:35.618038" elapsed="0.336069"/>
</kw>
<msg time="2026-04-10T00:56:35.954190" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:35.617674" elapsed="0.336598"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:56:35.616144" elapsed="0.338246"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:56:35.954910" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:56:37.151085" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:56:37.151425" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:56:37.151526" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:56:35.954669" elapsed="1.196952"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:37.152068" elapsed="0.000504"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.153630" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:37.152989" 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-04-10T00:56:37.154230" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.153950" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.153872" elapsed="0.000515"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:56:37.154760" elapsed="0.000064"/>
</return>
<status status="PASS" start="2026-04-10T00:56:37.154500" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.154468" elapsed="0.000482"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.155024" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:37.160602" 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-04-10T00:56:37.161334" elapsed="0.000249"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:37.161812" 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-04-10T00:56:37.155748" elapsed="0.006308"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:56:35.613320" elapsed="1.548872"/>
</kw>
<msg time="2026-04-10T00:56:37.162273" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:35.612422" elapsed="1.549925"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:56:35.611912" elapsed="1.550553"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.165648" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:37.165225" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.165197" elapsed="0.000573"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.166210" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:37.166015" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.167317" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:37.166650" elapsed="0.000747"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.168199" level="INFO">${conn_id} = 347</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.167661" elapsed="0.000577"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.169595" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:56:37.169708" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:56:37.169175" elapsed="0.000568"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:37.170020" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.171367" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:56:37.489219" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:56:12 UTC 2026

  System load:  0.0                Processes:             107
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:56:35 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:56:37.171057" elapsed="0.318299"/>
</kw>
<msg time="2026-04-10T00:56:37.489435" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:37.170703" elapsed="0.318806"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:56:37.168592" elapsed="0.321042"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.490123" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:56:37.522150" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:56:37.522269" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:56:37.522313" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:56:37.489894" elapsed="0.032441"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:37.522510" elapsed="0.002116"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.525141" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:37.524841" elapsed="0.000343"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.525411" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.525268" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.525245" elapsed="0.000239"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:56:37.525658" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:56:37.525536" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.525521" elapsed="0.000241"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.525796" elapsed="0.000015"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:37.528529" elapsed="0.000339"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.529035" elapsed="0.000157"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:37.529342" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:37.526121" elapsed="0.003458"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:56:37.164336" elapsed="0.365339"/>
</kw>
<msg time="2026-04-10T00:56:37.529768" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:37.163493" elapsed="0.366326"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:56:37.162749" elapsed="0.367150"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:35.611511" elapsed="1.918442"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="PASS" start="2026-04-10T00:56:25.184527" elapsed="12.345528"/>
</test>
<test id="s1-s3-t23" name="Restart Leader from Cluster Node" line="175">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:56:37.533245" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:56:37.532980" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.534516" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.534406" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.534389" elapsed="0.000217"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.539632" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.539511" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.539493" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.540930" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:37.540521" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.541425" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:37.541120" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:37.541496" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:37.541670" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:37.540053" elapsed="0.001660"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.547360" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.547251" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.547233" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.548765" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.548660" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.548642" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:37.549280" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.548980" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.549741" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:37.549467" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.591994" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:37.550269" elapsed="0.041840"/>
</kw>
<msg time="2026-04-10T00:56:37.592298" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:37.592346" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.549931" elapsed="0.042453"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.673590" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "R "e "s "t "a "r "t "[C "[78CL "[A[78Ce
 "a "d "e "r "[C "f "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:37.592985" elapsed="0.080888"/>
</kw>
<msg time="2026-04-10T00:56:37.674044" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:37.674092" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.592605" elapsed="0.081526"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.674491" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:37.674227" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.674201" elapsed="0.000394"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.675066" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "R "e "s "t "a "r "t "[C "[78CL "[A[78Ce
 "a "d "e "r "[C "f "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:37.674744" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.675444" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:37.675223" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.675205" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:37.675582" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:37.677103" elapsed="0.000803"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.678186" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:37.678923" elapsed="0.000355"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:37.676449" elapsed="0.002929"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:37.675893" elapsed="0.003548"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:37.548332" elapsed="0.131231"/>
</kw>
<msg time="2026-04-10T00:56:37.679661" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:37.679707" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.547599" elapsed="0.132146"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:37.679931" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:56:37.679824" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.679806" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.680419" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.680777" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.680850" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:37.546907" elapsed="0.134053"/>
</kw>
<msg time="2026-04-10T00:56:37.681055" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:37.681101" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.542092" elapsed="0.139047"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.681470" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:37.681216" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.681199" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:37.541946" elapsed="0.139645"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.687220" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.687113" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.687094" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.688615" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.688483" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.688466" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:37.689128" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.688830" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.689538" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:37.689318" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.723416" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:37.690103" elapsed="0.033426"/>
</kw>
<msg time="2026-04-10T00:56:37.723736" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:37.723783" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.689761" elapsed="0.034059"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.818370" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "R "e "s "t "a "r "t "[C "[78CL "[A[78Ce
 "a "d "e "r "[C "f "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:37.724357" elapsed="0.094253"/>
</kw>
<msg time="2026-04-10T00:56:37.818823" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:37.818871" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.724002" elapsed="0.094907"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.819328" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:37.819020" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.818989" elapsed="0.000425"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.819939" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "R "e "s "t "a "r "t "[C "[78CL "[A[78Ce
 "a "d "e "r "[C "f "r "o "m "[C "C "l "u "s "t "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:37.819579" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.820320" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:37.820100" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.820082" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:37.820435" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:37.822078" elapsed="0.000844"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.823220" elapsed="0.000503"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:37.824000" elapsed="0.000373"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:37.821333" elapsed="0.003144"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:37.820767" elapsed="0.003792"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:37.688178" elapsed="0.136489"/>
</kw>
<msg time="2026-04-10T00:56:37.824768" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:37.824816" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.687485" elapsed="0.137369"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:37.825045" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:56:37.824936" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.824916" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.825647" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.825995" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.826067" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:37.686763" elapsed="0.139418"/>
</kw>
<msg time="2026-04-10T00:56:37.826279" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:37.826324" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.681880" elapsed="0.144483"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.826710" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:37.826440" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.826423" elapsed="0.000366"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:37.681734" elapsed="0.145079"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.832620" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.832493" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.832475" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.833855" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.833749" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.833731" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:37.834369" level="INFO">${karaf_connection_index} = 344</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.834069" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.834796" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:37.834573" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.835592" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:56:37.835321" elapsed="0.000927">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:56:37.836434" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:56:37.836480" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.834983" elapsed="0.001521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.837273" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:56:37.837031" elapsed="0.000911">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:56:37.838126" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:56:37.838172" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.836689" elapsed="0.001507"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.839124" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart Leader from Cluster Node"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:56:37.838495" elapsed="0.000693">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart Leader from Cluster Node"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:56:37.838272" elapsed="0.000984">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart Leader from Cluster Node"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:56:37.838253" elapsed="0.001037">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart Leader from Cluster Node"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.839453" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.839698" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:37.839538" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:37.839522" elapsed="0.000286"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.839845" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:37.841282" elapsed="0.000816"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.842375" elapsed="0.000467"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:37.843106" elapsed="0.000353"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:37.840661" elapsed="0.002915"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:37.840109" elapsed="0.003536"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:56:37.833407" elapsed="0.010325">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart Leader from Cluster Node"</status>
</kw>
<msg time="2026-04-10T00:56:37.843835" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:56:37.843880" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart Leader from Cluster Node"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.832844" elapsed="0.011061"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.844093" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.843985" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.843966" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.844968" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.844864" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.844847" elapsed="0.000188"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.845494" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:37.845187" elapsed="0.000477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.846084" level="INFO">{1: 299, 2: 303, 3: 344}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:37.845820" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.846531" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:37.846286" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.847176" elapsed="0.000259"/>
</kw>
<msg time="2026-04-10T00:56:37.847535" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:37.847599" level="INFO">${old_connection_index} = 344</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.846814" elapsed="0.000809"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:37.848432" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.849763" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:56:37.849312" elapsed="0.001416">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.848818" elapsed="0.002011"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:37.851467" elapsed="0.000296"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.851003" elapsed="0.000843"/>
</kw>
<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="PASS" start="2026-04-10T00:56:37.847922" elapsed="0.003970"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:37.847700" elapsed="0.004240"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.847682" elapsed="0.004284"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:37.852821" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.852499" elapsed="0.000350"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:56:37.852898" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:56:37.853093" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:37.852173" elapsed="0.000945"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.853278" elapsed="0.000460"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.854045" level="INFO">index=352
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:37.853911" elapsed="0.000262"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.854325" elapsed="0.002307"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.857066" level="INFO">Logging into '10.30.171.151:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:56:37.858152" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</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="FAIL" start="2026-04-10T00:56:37.856802" elapsed="0.001728">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:37.871283" elapsed="0.000520"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.871974" elapsed="0.000155"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:37.872283" elapsed="0.000100"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:37.859400" elapsed="0.013039"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:37.858885" elapsed="0.013602"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:56:37.844568" elapsed="0.028020">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.872935" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.873012" 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="FAIL" start="2026-04-10T00:56:37.832141" elapsed="0.040979">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<msg time="2026-04-10T00:56:37.873229" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:56:37.873274" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.827093" elapsed="0.046206"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.873684" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:37.873377" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.873360" elapsed="0.000405"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:37.826947" elapsed="0.046842"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:37.541770" elapsed="0.332049"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:56:37.539150" elapsed="0.334728"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:56:37.534118" elapsed="0.339816"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.533673" elapsed="0.340321"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:56:37.530866" elapsed="0.343185"/>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<kw name="ClusterManagement__Build_List" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.879083" level="INFO">${member_int} = 3</msg>
<var>${member_int}</var>
<arg>${member}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:56:37.878277" elapsed="0.000846"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.879817" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>${member_int}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:37.879365" elapsed="0.000562"/>
</kw>
<return>
<value>${index_list}</value>
<status status="PASS" start="2026-04-10T00:56:37.879999" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:56:37.880248" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>${member}</arg>
<status status="PASS" start="2026-04-10T00:56:37.877713" elapsed="0.002574"/>
</kw>
<kw name="Return_Member_IP" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.881603" level="INFO">${member_int} = 3</msg>
<var>${member_int}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:56:37.881083" elapsed="0.000557"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:37.882223" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_int}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.881856" elapsed="0.000404"/>
</kw>
<return>
<value>${member_ip}</value>
<status status="PASS" start="2026-04-10T00:56:37.882328" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:56:37.882614" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>${member}</arg>
<doc>Return the IP address of the member given the member_index.</doc>
<status status="PASS" start="2026-04-10T00:56:37.880595" elapsed="0.002061"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.885425" level="INFO">${msg} = Starting ODL3 10.30.171.151</msg>
<var>${msg}</var>
<arg>"${msg}" == "${EMPTY}"</arg>
<arg>Starting ODL${member} ${member_ip}</arg>
<arg>Starting ODL${member} ${member_ip}, ${msg}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:37.882909" elapsed="0.002544"/>
</kw>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.892524" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.892375" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.892351" elapsed="0.000265"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.893776" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:37.893312" elapsed="0.000492"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.894276" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:37.893968" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:37.894347" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:37.894513" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:37.892889" elapsed="0.001652"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.900290" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.900183" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.900164" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.901469" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.901363" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.901345" elapsed="0.000281"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:37.902007" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.901783" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.902371" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:37.902194" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.938852" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "1 ". "1 "5 "1 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:37.902907" elapsed="0.036027"/>
</kw>
<msg time="2026-04-10T00:56:37.939038" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:37.939084" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.902571" elapsed="0.036549"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.942372" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:37.939665" elapsed="0.002769"/>
</kw>
<msg time="2026-04-10T00:56:37.942530" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:37.942588" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.939296" elapsed="0.003319"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.942917" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:37.942694" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.942675" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.943455" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:37.943200" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.943805" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:37.943587" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.943569" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:37.943917" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:37.945078" 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-04-10T00:56:37.945666" elapsed="0.000164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:37.945981" elapsed="0.000103"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:37.944715" elapsed="0.001420"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:37.944192" elapsed="0.001989"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:37.901062" elapsed="0.045216"/>
</kw>
<msg time="2026-04-10T00:56:37.946370" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:37.946413" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.900514" elapsed="0.045926"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:37.946639" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:56:37.946516" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.946498" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.947124" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.947467" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.947539" elapsed="0.000039"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:37.899844" elapsed="0.047833"/>
</kw>
<msg time="2026-04-10T00:56:37.947772" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:37.947817" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.894953" elapsed="0.052892"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.948172" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:37.947921" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.947904" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:56:37.894803" elapsed="0.053470"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.953846" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.953739" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.953721" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:37.955005" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:37.954900" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.954883" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:37.955434" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:37.955217" elapsed="0.000244"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.955810" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:37.955634" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.994466" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "1 ". "1 "5 "1 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:56:37.956375" elapsed="0.038186"/>
</kw>
<msg time="2026-04-10T00:56:37.994668" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:56:37.994714" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.956037" elapsed="0.038884"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:37.998747" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:56:37.995442" elapsed="0.003364"/>
</kw>
<msg time="2026-04-10T00:56:37.998902" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:56:37.998945" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.995098" elapsed="0.003873"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:37.999271" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:37.999050" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.999030" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:37.999757" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:37.999491" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.000083" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:37.999871" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:37.999853" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:56:38.000192" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:38.001334" elapsed="0.000464"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:38.001967" elapsed="0.000154"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:38.002270" elapsed="0.000099"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:38.000973" elapsed="0.001448"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:38.000456" elapsed="0.002010"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:56:37.954600" elapsed="0.047985"/>
</kw>
<msg time="2026-04-10T00:56:38.002678" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:38.002722" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.954068" elapsed="0.048680"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:56:38.002929" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:56:38.002824" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:38.002806" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.003407" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.003763" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:38.003836" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:56:37.953364" elapsed="0.050581"/>
</kw>
<msg time="2026-04-10T00:56:38.004038" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:38.004081" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:37.948556" elapsed="0.055552"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.004476" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:38.004222" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:38.004204" elapsed="0.000365"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:56:37.948399" elapsed="0.056196"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:38.010204" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:38.010092" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:38.010072" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:38.011406" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:38.011301" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:38.011283" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:38.011867" level="INFO">${karaf_connection_index} = 352</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:38.011639" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:38.012229" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:38.012054" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:38.012999" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:56:38.012764" elapsed="0.000767">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:56:38.013659" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:56:38.013704" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:38.012412" elapsed="0.001315"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:56:38.014410" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:56:38.014227" elapsed="0.000687">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:56:38.015023" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:56:38.015068" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:38.013894" elapsed="0.001199"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.015723" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:56:38.015389" elapsed="0.000396">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:56:38.015169" elapsed="0.000682">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:56:38.015151" elapsed="0.000732">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.016044" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.016274" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:38.016131" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:38.016114" elapsed="0.000236"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:56:38.016383" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:38.017597" elapsed="0.000375"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:38.018138" elapsed="0.000158"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:38.018446" elapsed="0.000120"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:38.017177" elapsed="0.001455"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:38.016669" elapsed="0.002034"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:56:38.010998" elapsed="0.007792">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</status>
</kw>
<msg time="2026-04-10T00:56:38.018894" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:56:38.018940" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:38.010442" elapsed="0.008521"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:38.019203" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:38.019094" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:38.019075" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:56:38.020227" elapsed="0.000175"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:38.020120" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:38.020103" elapsed="0.000358"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:38.020852" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:38.020696" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.021427" level="INFO">{1: 299, 2: 303, 3: 352}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:38.021156" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.021978" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:38.021715" elapsed="0.000310"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:38.022594" elapsed="0.000220"/>
</kw>
<msg time="2026-04-10T00:56:38.022915" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:56:38.022963" level="INFO">${old_connection_index} = 352</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:38.022192" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:56:38.023868" elapsed="0.000149"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:56:38.024713" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:56:38.024520" elapsed="0.000650">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:38.024186" elapsed="0.001048"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:38.025848" elapsed="0.000107"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:38.025408" elapsed="0.000595"/>
</kw>
<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="PASS" start="2026-04-10T00:56:38.023292" elapsed="0.002758"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:38.023065" elapsed="0.003036"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:38.023045" elapsed="0.003083"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:38.027001" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:38.026702" elapsed="0.000327"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:56:38.027078" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:56:38.027235" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:38.026338" elapsed="0.000921"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:38.027417" elapsed="0.000475"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:38.028221" level="INFO">index=357
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:38.028084" elapsed="0.000266"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:56:38.028501" elapsed="0.002479"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:56:38.031413" level="INFO">Logging into '10.30.171.151:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:56:38.032469" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</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="FAIL" start="2026-04-10T00:56:38.031152" elapsed="0.001773">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:38.036472" 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-04-10T00:56:38.037015" elapsed="0.000157"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:38.037325" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:38.033921" elapsed="0.003584"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:56:38.033261" elapsed="0.004312"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:56:38.019822" elapsed="0.017839">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.038050" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:56:38.038132" 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="FAIL" start="2026-04-10T00:56:38.009719" elapsed="0.028520">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<msg time="2026-04-10T00:56:38.038348" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:56:38.038392" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:56:38.004862" elapsed="0.033554"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.038768" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:38.038495" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:38.038477" elapsed="0.000391"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:38.004720" elapsed="0.034174"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:37.894619" elapsed="0.144310"/>
</for>
<arg>${msg}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:56:37.890202" elapsed="0.148812"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.045947" level="INFO">${base_command} = /tmp/karaf-0.23.1/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:38.045529" elapsed="0.000451"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.046599" level="INFO">${command} = /tmp/karaf-0.23.1/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:38.046169" elapsed="0.000459"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-10T00:56:38.047097" level="INFO">${epoch} = 1775782598.047004</msg>
<var>${epoch}</var>
<arg>time_zone=UTC</arg>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-10T00:56:38.046795" elapsed="0.000337"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.047729" level="INFO">${gc_filepath} = /tmp/karaf-0.23.1/data/log/gc_1775782598.047004.log</msg>
<var>${gc_filepath}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/data/log/gc_${epoch}.log</arg>
<arg>${GC_LOG_PATH}/gc_${epoch}.log</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:38.047303" elapsed="0.000453"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.048341" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782598.047004.log</msg>
<var>${gc_options}</var>
<arg>"docker" not in """${node_start_command}"""</arg>
<arg>-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${gc_filepath}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:38.047925" elapsed="0.000444"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.049968" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:38.049589" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.050503" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:38.050197" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:38.050591" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:56:38.050752" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:38.049157" elapsed="0.001620"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:38.051946" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:38.051676" elapsed="0.000297"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:38.052807" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:38.052672" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.056617" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:38.055858" elapsed="0.000931"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:38.055837" elapsed="0.000982"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:38.057116" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:56:38.056976" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.058604" level="INFO">Attempting to execute command "/tmp/karaf-0.23.1/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782598.047004.log" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:38.057577" elapsed="0.001095"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:56:38.059658" level="INFO">${conn_id} = 359</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:38.058852" elapsed="0.000835"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.061336" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:56:38.061657" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:56:38.060759" elapsed="0.000999"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:38.062056" elapsed="0.000695"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:56:38.064123" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:56:38.465157" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:55:49 UTC 2026

  System load:  0.93               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:56:25 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:56:38.063801" elapsed="0.401542"/>
</kw>
<msg time="2026-04-10T00:56:38.465488" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:38.063062" elapsed="0.402561"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:56:38.059962" elapsed="0.405824"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:56:38.466395" level="INFO">Executing command '/tmp/karaf-0.23.1/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782598.047004.log'.</msg>
<msg time="2026-04-10T00:56:38.489332" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:56:38.489472" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:56:38.489516" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:56:38.466054" elapsed="0.023485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:38.489781" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.490767" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:38.490221" elapsed="0.000655"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:38.491177" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:38.490983" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:38.490958" elapsed="0.000359"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:56:38.491532" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-10T00:56:38.491372" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:38.491356" elapsed="0.000347"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:56:38.491737" elapsed="0.000015"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:38.496180" elapsed="0.000699"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:38.497183" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:38.497935" 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-04-10T00:56:38.492063" elapsed="0.006268"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:56:38.054991" elapsed="0.443436"/>
</kw>
<msg time="2026-04-10T00:56:38.498483" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:38.054304" elapsed="0.444230"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:56:38.053714" elapsed="0.444916"/>
</kw>
<msg time="2026-04-10T00:56:38.498671" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:38.053125" elapsed="0.445591"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:38.501533" elapsed="0.000325"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:56:38.502023" elapsed="0.000145"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:56:38.502319" elapsed="0.000097"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:56:38.499008" elapsed="0.003460"/>
</kw>
<msg time="2026-04-10T00:56:38.502573" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:56:38.052236" elapsed="0.450364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.503032" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:38.502783" elapsed="0.000290"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:56:38.503117" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:56:38.051244" elapsed="0.451999"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:38.051030" elapsed="0.452250"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:38.050871" elapsed="0.452442"/>
</for>
<arg>command=${command} ${gc_options}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:56:38.048604" elapsed="0.454762"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.515031" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:38.514652" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.515513" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:38.515219" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:38.515601" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:38.515756" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:38.514265" elapsed="0.001515"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.517359" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:38.517030" elapsed="0.000356"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:38.517432" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:38.517597" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:38.516684" elapsed="0.000938"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.525482" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:38.524992" elapsed="0.000546"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:38.526193" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:38.525727" elapsed="0.000512"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:38.531969" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-10T00:56:38.528573" elapsed="0.005366">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-10T00:56:38.526309" elapsed="0.007942">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.534447" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:38.534289" elapsed="0.000472"/>
</branch>
<status status="FAIL" start="2026-04-10T00:56:38.526290" elapsed="0.008500">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.535261" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:38.535398" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:38.535360" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:38.535343" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.535632" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:38.535704" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-10T00:56:38.520667" elapsed="0.015148">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:38.535889" elapsed="0.000016"/>
</return>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-04-10T00:56:38.517835" elapsed="0.018155">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.536212" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:56:38.536341" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:38.536304" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:38.536288" elapsed="0.000116"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.536626" elapsed="0.000024"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.536890" elapsed="0.000025"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-04-10T00:56:38.536958" elapsed="0.000016"/>
</return>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="FAIL" start="2026-04-10T00:56:38.516292" elapsed="0.020771">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-10T00:56:38.537194" elapsed="0.000043"/>
</continue>
<status status="NOT RUN" start="2026-04-10T00:56:38.537146" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:38.537129" elapsed="0.000156"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.537431" elapsed="0.000022"/>
</kw>
<var name="${index}">3</var>
<status status="FAIL" start="2026-04-10T00:56:38.516064" elapsed="0.021439">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:56:38.515835" elapsed="0.021746">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="FAIL" start="2026-04-10T00:56:38.513871" elapsed="0.023812">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-10T00:56:38.513558" elapsed="0.024187">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-04-10T00:56:38.513526" elapsed="0.024252">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<arg>${member_index_list}</arg>
<status status="NOT RUN" start="2026-04-10T00:56:38.538049" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:38.537848" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:38.537832" elapsed="0.000295"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:56:38.538391" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:38.538181" elapsed="0.000266"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:38.538165" elapsed="0.000305"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="FAIL" start="2026-04-10T00:56:38.513109" elapsed="0.025457">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:48.558056" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:48.557566" elapsed="0.000523"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:48.558796" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:48.558454" elapsed="0.000370"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:48.558873" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:56:48.559048" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:48.557117" elapsed="0.001957"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:48.560653" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:48.560303" elapsed="0.000377"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:48.560874" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:56:48.561035" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:48.559951" elapsed="0.001111"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:48.569083" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:48.568570" elapsed="0.000565"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:48.569800" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:48.569296" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:48.655269" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:48.655642" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 status=401, reason=Unauthorized 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '524'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 401 Unauthorized&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 401 Unauthorized&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;401&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Unauthorized&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;org.jolokia.osgi.servlet.JolokiaServlet&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-04-10T00:56:48.656119" level="FAIL">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-10T00:56:48.572087" elapsed="0.085262">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-04-10T00:56:48.569917" elapsed="0.088185">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:48.658658" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:48.658210" elapsed="0.001154"/>
</branch>
<status status="FAIL" start="2026-04-10T00:56:48.569898" elapsed="0.089529">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:48.660679" elapsed="0.000064"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:48.660997" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:48.660909" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:48.660869" elapsed="0.000292"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:48.661503" elapsed="0.000084"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:56:48.661714" elapsed="0.000046"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-10T00:56:48.563930" elapsed="0.098108">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:48.662419" elapsed="0.000050"/>
</return>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-04-10T00:56:48.561281" elapsed="0.101499">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:48.663074" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:56:48.663220" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:48.663181" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:48.663161" elapsed="0.000257"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:48.663654" elapsed="0.000026"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:48.663879" elapsed="0.000024"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-04-10T00:56:48.663947" elapsed="0.000016"/>
</return>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="FAIL" start="2026-04-10T00:56:48.559567" elapsed="0.104487">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-10T00:56:48.664195" elapsed="0.000017"/>
</continue>
<status status="NOT RUN" start="2026-04-10T00:56:48.664147" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:48.664127" elapsed="0.000132"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:48.664447" elapsed="0.000023"/>
</kw>
<var name="${index}">3</var>
<status status="FAIL" start="2026-04-10T00:56:48.559322" elapsed="0.105202">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:56:48.559133" elapsed="0.105500">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="FAIL" start="2026-04-10T00:56:48.556418" elapsed="0.108322">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-04-10T00:56:48.555900" elapsed="0.108900">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</branch>
<status status="FAIL" start="2026-04-10T00:56:48.555863" elapsed="0.108970">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<arg>${member_index_list}</arg>
<status status="NOT RUN" start="2026-04-10T00:56:48.665127" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:48.664909" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:48.664891" elapsed="0.000317"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:56:48.665476" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:48.665263" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:48.665248" elapsed="0.000324"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="FAIL" start="2026-04-10T00:56:48.555133" elapsed="0.110525">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:58.683276" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:58.682797" elapsed="0.000512"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:58.683843" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:58.683519" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:58.683918" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:56:58.684088" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:58.682361" elapsed="0.001753"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:58.685932" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:58.685627" elapsed="0.000333"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:58.686007" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:58.686208" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:58.685243" elapsed="0.001020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:58.695869" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:58.695237" elapsed="0.000807"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:58.696735" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:58.696214" 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-04-10T00:56:59.016839" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:59.017174" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:59 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:59 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-config","member-3-shard-topology-config","member-3-shard-inventory-config","member-3-shard-toaster-config"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782619,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:59.017649" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:58.699062" elapsed="0.318772"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:58.696865" elapsed="0.321487"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.018883" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:59.018431" elapsed="0.001160"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:58.696841" elapsed="0.322805"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.027504" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-config","member-3-shard-topology-config","member-3-shard-inventory-config","member-3-shard-toaster-config"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782619,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:59.024509" elapsed="0.003129"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:59.022343" elapsed="0.005352"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.022300" elapsed="0.005436"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.031611" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:59.028970" elapsed="0.002745"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:59.027824" elapsed="0.003944"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.027804" elapsed="0.004005"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.033299" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:59.032356" elapsed="0.000986"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.034059" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:59.033486" elapsed="0.000664"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.035010" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:59.034476" elapsed="0.000580"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:59.034188" elapsed="0.000919"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.033465" elapsed="0.001677"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.036539" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:59.035682" elapsed="0.000916"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.037172" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:59.036740" elapsed="0.000518"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.038229" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:59.037726" elapsed="0.000548"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:59.037296" elapsed="0.001029"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.036719" elapsed="0.001640"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:59.038596" elapsed="0.000804"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:59.040315" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:59.039700" elapsed="0.000656"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:59.040631" elapsed="0.002831"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:59.020699" elapsed="0.022995"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:59.043925" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:59.043784" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.043760" elapsed="0.000238"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:59.047560" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782619,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:59.044159" elapsed="0.003434"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:59.047649" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:56:59.047824" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782619,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:58.690486" elapsed="0.357365"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:59.047912" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:56:59.048064" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782619,...</msg>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:56:58.686761" elapsed="0.361330"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.049043" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782619,
 "value": {
  "LocalShards": [
   "member-3-shard-default-config",
   "member-3-shard-inventory-config",
   "member-3-shard-toaster-config",
   "member-3-shard-topology-config"
  ],
  "MemberName": "member-3",
  "SyncStatus": true
 }
}
</msg>
<arg>${shard_manager_text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:59.048751" elapsed="0.000341"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.050501" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782619, 'value': {...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:59.049731" elapsed="0.000800"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:59.050721" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:56:59.050891" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782619, 'value': {...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:59.049307" elapsed="0.001611"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:59.051336" level="INFO">${value_object} = {'LocalShards': ['member-3-shard-default-config', 'member-3-shard-inventory-config', 'member-3-shard-toaster-config', 'member-3-shard-topology-config'], 'MemberName': 'member-3', 'SyncStatus': True}</msg>
<var>${value_object}</var>
<arg>dictionary=${manager_object}</arg>
<arg>key=value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:59.051079" elapsed="0.000285"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:59.051756" level="INFO">${sync_status} = True</msg>
<var>${sync_status}</var>
<arg>dictionary=${value_object}</arg>
<arg>key=SyncStatus</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:59.051521" elapsed="0.000261"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-04-10T00:56:59.051829" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:59.051983" level="INFO">${conf_status} = True</msg>
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="PASS" start="2026-04-10T00:56:59.048348" elapsed="0.003661"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:56:59.052203" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:59.052088" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.052068" elapsed="0.000200"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.060505" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:59.059954" elapsed="0.000629"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.061231" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:59.060753" elapsed="0.000525"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:56:59.071840" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:56:59.072086" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:56:59 GMT', 'Expires': 'Thu, 09 Apr 2026 23:56:59 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-operational","member-3-shard-topology-operational","member-3-shard-inventory-operational","member-3-shard-toaster-operational"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782619,"status":200} 
 </msg>
<msg time="2026-04-10T00:56:59.072318" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:59.063645" elapsed="0.008758"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:59.061358" elapsed="0.011310"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.072930" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:59.072708" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.061334" elapsed="0.011914"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.078456" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-operational","member-3-shard-topology-operational","member-3-shard-inventory-operational","member-3-shard-toaster-operational"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782619,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:59.075738" elapsed="0.002854"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:59.074516" elapsed="0.004138"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.074496" elapsed="0.004203"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.084272" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:59.080043" elapsed="0.004391"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:59.078799" elapsed="0.005721"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.078777" elapsed="0.005828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.086780" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:59.085415" elapsed="0.001439"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.088039" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:59.087085" elapsed="0.001071"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.089038" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:59.088484" elapsed="0.000600"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:59.088196" elapsed="0.000939"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.087052" elapsed="0.002118"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.090592" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:59.089722" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.091226" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:59.090786" elapsed="0.001500"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.093176" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:59.092643" elapsed="0.000578"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:59.092327" elapsed="0.000943"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.090764" elapsed="0.002541"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:59.093527" elapsed="0.000814"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:56:59.095477" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:59.094818" elapsed="0.000702"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:56:59.095968" elapsed="0.002931"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:56:59.073773" elapsed="0.025275"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:59.099332" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:56:59.099143" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.099117" elapsed="0.000293"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:56:59.103062" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:56:59.099611" elapsed="0.003560"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:56:59.103243" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:56:59.103456" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:59.055400" elapsed="0.048083"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:56:59.103559" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:59.103715" level="INFO">${oper_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:56:59.052478" elapsed="0.051263"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.104755" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782619,
 "value": {
  "LocalShards": [
   "member-3-shard-default-operational",
   "member-3-shard-inventory-operational",
   "member-3-shard-toaster-operational",
   "member-3-shard-topology-operational"
  ],
  "MemberName": "member-3",
  "SyncStatus": true
 }
}
</msg>
<arg>${shard_manager_text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:59.104435" elapsed="0.000370"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.106206" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782619, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:59.105384" elapsed="0.000851"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:56:59.106287" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:56:59.106456" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782619, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:56:59.105019" elapsed="0.001464"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:59.106894" level="INFO">${value_object} = {'LocalShards': ['member-3-shard-default-operational', 'member-3-shard-inventory-operational', 'member-3-shard-toaster-operational', 'member-3-shard-topology-operational'], 'MemberName': 'member-3', '...</msg>
<var>${value_object}</var>
<arg>dictionary=${manager_object}</arg>
<arg>key=value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:59.106662" elapsed="0.000259"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:56:59.107321" level="INFO">${sync_status} = True</msg>
<var>${sync_status}</var>
<arg>dictionary=${value_object}</arg>
<arg>key=SyncStatus</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:56:59.107081" elapsed="0.000266"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-04-10T00:56:59.107395" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:56:59.107567" level="INFO">${oper_status} = True</msg>
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="PASS" start="2026-04-10T00:56:59.104025" elapsed="0.003569"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-04-10T00:56:59.107640" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:56:59.107793" level="INFO">${status} = True</msg>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="PASS" start="2026-04-10T00:56:58.684861" elapsed="0.422958"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-04-10T00:56:59.108021" elapsed="0.000032"/>
</continue>
<status status="PASS" start="2026-04-10T00:56:59.107901" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.107880" elapsed="0.000227"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.108261" elapsed="0.000022"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:58.684629" elapsed="0.423688"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:58.684173" elapsed="0.424181"/>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="PASS" start="2026-04-10T00:56:58.681909" elapsed="0.426506"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:58.681564" elapsed="0.426886"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:58.681525" elapsed="0.426949"/>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.110260" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:59.109836" elapsed="0.000452"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.110770" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:56:59.110451" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:56:59.110842" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:56:59.111002" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:56:59.109335" elapsed="0.001691"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.112235" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:59.111931" elapsed="0.000331"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:56:59.112308" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:56:59.112457" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:56:59.111571" elapsed="0.000911"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.166825" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:59.166331" elapsed="0.000550"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:56:59.167901" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:56:59.167594" elapsed="0.000385">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:56:59.168097" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:56:59.167151" elapsed="0.000995"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.168879" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:59.168405" elapsed="0.000525"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:56:59.169361" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:56:59.169566" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:56:59.169182" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.170157" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:59.169870" 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-04-10T00:56:59.171492" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:59.171204" elapsed="0.000333"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.171991" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:56:59.171719" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.172349" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.172600" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.172781" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:56:59.172211" elapsed="0.000627"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:56:59.172071" elapsed="0.000798"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:56:59.172916" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:56:59.173084" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:56:59.170864" elapsed="0.002245"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:59.170392" elapsed="0.002768"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.173410" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:59.173203" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.170336" elapsed="0.003185"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.174303" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:56:59.173807" elapsed="0.000547"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:56:59.174432" elapsed="0.000062"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:56:59.165028" elapsed="0.009659"/>
</kw>
<msg time="2026-04-10T00:56:59.174823" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:56:59.150679" elapsed="0.024215"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.196442" elapsed="0.000047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.218652" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.240942" elapsed="0.000065"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.241259" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.241448" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.242724" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:59.241772" elapsed="0.001082"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:56:59.241755" elapsed="0.001150"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.243110" elapsed="0.000069"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.243455" elapsed="0.000067"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.243779" elapsed="0.000068"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:56:59.241715" elapsed="0.002240"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:56:59.241539" elapsed="0.002447"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.244150" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:56:59.244249" elapsed="0.000024"/>
</return>
<msg time="2026-04-10T00:56:59.244418" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:56:59.146116" elapsed="0.098330"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:56:59.246675" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:56:59.246154" elapsed="0.000719">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:56:59.247064" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:56:59.245524" elapsed="0.001566"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.247495" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:56:59.247171" elapsed="0.000516"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.248474" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:56:59.247903" elapsed="0.000702"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:59.247714" elapsed="0.001042"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.247148" elapsed="0.001632"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.261373" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:56:59.248939" elapsed="0.012481"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:56:59.261503" elapsed="0.000070"/>
</return>
<msg time="2026-04-10T00:56:59.261732" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:56:59.245154" elapsed="0.016604"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:56:59.263798" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:56:59.263276" elapsed="0.000721">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:56:59.264123" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:56:59.262627" elapsed="0.001522"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:56:59.264420" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:56:59.264231" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.264209" elapsed="0.000300"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.264722" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:56:59.264900" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:56:59.264966" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:56:59.267464" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:56:59.262204" elapsed="0.005290"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.269780" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:59.269240" elapsed="0.000594"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:56:59.270467" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:56:59.269993" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:00.221147" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:00.222888" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:56:59 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:57:00.223570" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:56:59.272973" elapsed="0.950720"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:59.270604" elapsed="0.953436"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:00.224411" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:00.224100" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.270582" elapsed="0.954305"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:00.232728" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:00.228352" elapsed="0.004941"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:00.226677" elapsed="0.006692"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:00.226647" elapsed="0.006781"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:00.238199" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:00.235352" elapsed="0.002955"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:00.233715" elapsed="0.004646"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:00.233528" elapsed="0.004874"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:00.240052" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:00.239142" elapsed="0.000952"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:00.240727" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:00.240242" elapsed="0.000573"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:00.241682" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:00.241142" elapsed="0.000586"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:00.240853" elapsed="0.000927"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:00.240220" elapsed="0.001596"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:00.243190" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:00.242324" elapsed="0.000908"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:00.243828" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:00.243375" elapsed="0.000541"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:00.244908" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:00.244239" elapsed="0.000714"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:00.243955" elapsed="0.001047"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:00.243355" elapsed="0.001682"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:00.245254" elapsed="0.000798"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:00.247022" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:00.246348" elapsed="0.000715"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:00.247335" elapsed="0.002993"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:00.225626" elapsed="0.024843"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:00.250727" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:00.250570" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:00.250532" elapsed="0.000270"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:00.260072" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:00.250957" elapsed="0.009162"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:00.260198" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:57:00.260409" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:56:59.267986" elapsed="0.992450"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:00.260504" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:00.260710" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:56:59.123295" elapsed="1.137443"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:00.261168" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:00.260837" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:00.260817" elapsed="0.000542"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:00.261393" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:56:59.117022" elapsed="1.144503"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:56:59.111373" elapsed="1.150213"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:56:59.111172" elapsed="1.150451"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-10T00:56:59.108932" elapsed="1.152749"/>
</kw>
<status status="PASS" start="2026-04-10T00:56:59.108531" elapsed="1.153180"/>
</branch>
<status status="PASS" start="2026-04-10T00:56:59.108515" elapsed="1.153221"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:57:00.262155" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:00.261793" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:00.261777" elapsed="0.000464"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="PASS" start="2026-04-10T00:56:58.680984" elapsed="1.581306"/>
</kw>
<arg>${timeout}</arg>
<arg>10s</arg>
<arg>Verify_Members_Are_Ready</arg>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:56:38.503530" elapsed="21.758825"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement" type="TEARDOWN">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:00.266000" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:00.265466" elapsed="0.000563"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:00.266512" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:00.266200" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:00.266627" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:57:00.266817" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:00.265031" elapsed="0.001810"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:00.267938" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:00.267671" elapsed="0.000293"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:00.268816" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:00.268646" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:00.272233" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:00.271590" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:00.271567" elapsed="0.000843"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:00.274426" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:00.272576" elapsed="0.002062"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:00.275657" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:00.274826" elapsed="0.000879"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:00.276712" level="INFO">${conn_id} = 362</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:00.275883" elapsed="0.000861"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:00.278196" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:00.278429" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:00.277590" elapsed="0.000937"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:00.278884" elapsed="0.000730"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:00.281159" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:00.891234" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:57:00 UTC 2026

  System load:  0.63               Processes:             126
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:56:24 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:00.280803" elapsed="0.610674"/>
</kw>
<msg time="2026-04-10T00:57:00.891626" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:00.279941" elapsed="0.611870"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:00.276970" elapsed="0.615047"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:00.892603" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:57:00.905345" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:57:00.905707" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:00.905773" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:00.892267" elapsed="0.013540"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:00.906085" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:00.907411" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:00.906843" elapsed="0.000634"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:00.907855" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:00.907622" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:00.907584" elapsed="0.000378"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:00.908235" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:57:00.908037" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:00.908016" elapsed="0.000365"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:00.908433" elapsed="0.000041"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:00.913914" elapsed="0.000951"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:00.915182" elapsed="0.000472"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:00.915937" 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-04-10T00:57:00.909016" elapsed="0.007266"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:00.270932" elapsed="0.645453"/>
</kw>
<msg time="2026-04-10T00:57:00.916444" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:00.270195" elapsed="0.646320"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:57:00.269629" elapsed="0.646985"/>
</kw>
<msg time="2026-04-10T00:57:00.916656" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:00.269101" elapsed="0.647615"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:00.919745" elapsed="0.000391"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:00.920310" elapsed="0.000151"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:00.920632" 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-04-10T00:57:00.917024" elapsed="0.003764"/>
</kw>
<msg time="2026-04-10T00:57:00.920906" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:57:00.268181" elapsed="0.652756"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:00.921497" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:00.921179" elapsed="0.000421"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:57:00.921659" 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-04-10T00:57:00.267219" elapsed="0.654604"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:00.267036" elapsed="0.654851"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:00.923200" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:00.922855" elapsed="0.000380"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:00.924294" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:00.924115" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:00.928671" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:00.927878" elapsed="0.000976"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:00.927852" elapsed="0.001037"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:00.929271" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:00.929100" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:00.930815" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:00.929751" elapsed="0.001130"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:00.931980" 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-04-10T00:57:00.931105" elapsed="0.000911"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:00.933913" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:00.934205" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:00.933094" elapsed="0.001211"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:00.934650" elapsed="0.000844"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:00.937721" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:01.518211" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:57:01 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:56:24 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:00.937201" elapsed="0.581260"/>
</kw>
<msg time="2026-04-10T00:57:01.518728" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:00.935911" elapsed="0.582996"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:00.932299" elapsed="0.586810"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:01.519697" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:57:01.533797" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:57:01.534422" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:01.534540" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:01.519355" elapsed="0.015297"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:01.535152" elapsed="0.000714"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:01.537459" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:01.536393" elapsed="0.001215"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:01.538208" elapsed="0.000067"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:01.537792" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:01.537741" elapsed="0.000687"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:01.538941" elapsed="0.000085"/>
</return>
<status status="PASS" start="2026-04-10T00:57:01.538603" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:01.538530" elapsed="0.000640"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:01.539250" elapsed="0.000035"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:01.544876" elapsed="0.001203"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:01.546589" elapsed="0.000706"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:01.547732" elapsed="0.000302"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:01.540109" elapsed="0.008171"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:00.927047" elapsed="0.621393"/>
</kw>
<msg time="2026-04-10T00:57:01.548571" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:00.926190" elapsed="0.622504"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:57:00.925337" elapsed="0.623479"/>
</kw>
<msg time="2026-04-10T00:57:01.548880" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:00.924680" elapsed="0.624290"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:01.554651" elapsed="0.000531"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:01.555432" elapsed="0.000259"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:01.555895" elapsed="0.000171"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:01.549540" elapsed="0.006604"/>
</kw>
<msg time="2026-04-10T00:57:01.556279" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:57:00.923526" elapsed="0.632788"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:01.557123" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:01.556753" elapsed="0.000425"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:57:01.557238" elapsed="0.000053"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:57:00.922266" elapsed="0.635158"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:00.922022" elapsed="0.635450"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:01.558895" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:01.558519" elapsed="0.000413"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:01.560245" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:01.559980" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:01.565378" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:01.564519" elapsed="0.001063"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:01.564486" elapsed="0.001130"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:01.565990" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:01.565793" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:01.567262" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:01.566359" elapsed="0.000956"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:01.568223" level="INFO">${conn_id} = 368</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:01.567487" elapsed="0.000765"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:01.569768" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:01.570004" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:01.569136" elapsed="0.000969"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:01.570442" elapsed="0.000747"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:01.572823" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:02.218930" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:57:01 UTC 2026

  System load:  1.02               Processes:             124
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:56:38 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:01.572374" elapsed="0.646841"/>
</kw>
<msg time="2026-04-10T00:57:02.219374" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:01.571524" elapsed="0.648114"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:01.568492" elapsed="0.651419"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:02.220652" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:57:02.233254" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:57:02.233570" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:02.233640" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:02.220223" elapsed="0.013450"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:02.233914" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:02.235118" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:02.234564" elapsed="0.000621"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:02.235529" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:02.235306" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.235273" elapsed="0.000389"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:02.236002" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-10T00:57:02.235738" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.235716" elapsed="0.000414"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:02.236179" elapsed="0.000021"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:02.241968" elapsed="0.001523"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:02.243827" elapsed="0.000479"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:02.244589" 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-04-10T00:57:02.236664" elapsed="0.008265"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:01.563620" elapsed="0.681410"/>
</kw>
<msg time="2026-04-10T00:57:02.245092" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:01.562649" elapsed="0.682521"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:57:01.561389" elapsed="0.683864"/>
</kw>
<msg time="2026-04-10T00:57:02.245296" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:01.560653" elapsed="0.684702"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:02.248312" elapsed="0.000358"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:02.248843" elapsed="0.000157"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:02.249152" elapsed="0.000100"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:02.245694" elapsed="0.003610"/>
</kw>
<msg time="2026-04-10T00:57:02.249401" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:57:01.559339" elapsed="0.690087"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:02.249936" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:02.249657" elapsed="0.000322"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:57:02.250028" 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-04-10T00:57:01.557904" elapsed="0.692266"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:01.557630" elapsed="0.692577"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:00.266901" elapsed="1.983346"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:57:00.262647" elapsed="1.987662"/>
</kw>
<arg>${index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${timeout}</arg>
<arg>check_system_status=${check_system_status}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>service_list=${service_list}</arg>
<doc>If the list is empty, start all cluster members. Otherwise, start members based on present indices.
If True, wait for cluster sync on listed members.
Optionally karaf_home can be overriden. Optionally specific JAVA_HOME is used for starting.
Garbage collection is unconditionally logged to files. TODO: Make that reasonable conditional?</doc>
<status status="PASS" start="2026-04-10T00:56:38.039284" elapsed="24.211077"/>
</kw>
<arg>${Inventory_Leader}</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="PASS" start="2026-04-10T00:56:37.874287" elapsed="24.376142"/>
</kw>
<doc>Start Leader Node Up.</doc>
<status status="PASS" start="2026-04-10T00:56:37.530367" elapsed="24.720271"/>
</test>
<test id="s1-s3-t24" name="Verify Data Recovery After Leader Restart" line="179">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:57:02.254115" elapsed="0.000229"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:57:02.253793" elapsed="0.000609"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:02.255595" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:02.255447" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.255424" elapsed="0.000246"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:02.260812" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:02.260687" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.260666" elapsed="0.000222"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:02.262135" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:02.261678" elapsed="0.000487"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:02.262671" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:02.262332" elapsed="0.000366"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:02.262744" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:57:02.262910" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:02.261261" elapsed="0.001675"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:02.268862" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:02.268733" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.268711" elapsed="0.000231"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:02.270227" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:02.270117" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.270098" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:02.270799" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:02.270450" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:02.271222" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:02.270995" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:02.306317" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:02.271769" elapsed="0.034665"/>
</kw>
<msg time="2026-04-10T00:57:02.306625" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:02.306673" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.271409" elapsed="0.035300"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:02.393176" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:02.307255" elapsed="0.086192"/>
</kw>
<msg time="2026-04-10T00:57:02.393705" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:02.393753" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.306892" elapsed="0.086900"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:02.394248" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:02.393914" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.393877" elapsed="0.000459"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:02.394877" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:02.394484" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:02.395267" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:02.395041" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.395023" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:02.395384" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:02.397009" elapsed="0.000790"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:02.398156" elapsed="0.000503"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:02.398929" 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-04-10T00:57:02.396337" elapsed="0.003054"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:02.395726" elapsed="0.003730"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:02.269802" elapsed="0.129774"/>
</kw>
<msg time="2026-04-10T00:57:02.399678" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:02.399724" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.269114" elapsed="0.130649"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:02.399995" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:57:02.399843" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.399825" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:02.400507" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:02.400873" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:02.400945" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:02.268312" elapsed="0.132746"/>
</kw>
<msg time="2026-04-10T00:57:02.401156" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:02.401201" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.263329" elapsed="0.137913"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:02.401591" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:02.401321" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.401303" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:02.263179" elapsed="0.138514"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:02.407522" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:02.407412" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.407393" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:02.408816" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:02.408707" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.408689" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:02.409346" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:02.409037" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:02.409783" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:02.409539" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:02.448232" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:02.410314" elapsed="0.038176"/>
</kw>
<msg time="2026-04-10T00:57:02.448790" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:02.448851" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.409973" elapsed="0.038927"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:02.529708" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:02.449792" elapsed="0.080182"/>
</kw>
<msg time="2026-04-10T00:57:02.530309" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:02.530362" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.449213" elapsed="0.081188"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:02.530886" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:02.530519" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.530486" elapsed="0.000488"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:02.531498" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:02.531124" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:02.531900" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:02.531678" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.531659" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:02.532017" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:02.533584" elapsed="0.000779"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:02.534663" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:02.535396" 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-04-10T00:57:02.532927" elapsed="0.002944"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:02.532332" elapsed="0.003603"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:02.408370" elapsed="0.127668"/>
</kw>
<msg time="2026-04-10T00:57:02.536137" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:02.536182" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.407778" elapsed="0.128442"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:02.536409" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:57:02.536301" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.536282" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:02.536930" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:02.537273" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:02.537346" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:02.407047" elapsed="0.130414"/>
</kw>
<msg time="2026-04-10T00:57:02.537575" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:02.537622" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.401974" elapsed="0.135689"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:02.538027" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:02.537741" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.537723" elapsed="0.000383"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:02.401829" elapsed="0.136302"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:02.543952" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:02.543841" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.543821" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:02.545245" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:02.545136" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.545119" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:02.545793" level="INFO">${karaf_connection_index} = 357</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:02.545462" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:02.546228" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:02.545999" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:02.547046" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:57:02.546787" elapsed="0.000974">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:57:02.547948" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:57:02.547994" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.546416" elapsed="0.001602"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:02.548794" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:57:02.548534" elapsed="0.000896">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:57:02.549650" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:57:02.549709" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.548187" elapsed="0.001552"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:57:02.550723" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Leader Restart"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:57:02.550089" elapsed="0.000698">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Leader Restart"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:57:02.549861" elapsed="0.000998">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Leader Restart"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:57:02.549840" elapsed="0.001051">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Leader Restart"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:02.551053" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:02.551280" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:02.551139" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:57:02.551123" elapsed="0.000231"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:57:02.551386" elapsed="0.000015"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:02.552895" elapsed="0.000766"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:02.553956" elapsed="0.000454"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:02.554694" elapsed="0.000352"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:02.552218" elapsed="0.002926"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:02.551679" elapsed="0.003527"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:57:02.544830" elapsed="0.010464">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Leader Restart"</status>
</kw>
<msg time="2026-04-10T00:57:02.555398" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:57:02.555442" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Leader Restart"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.544238" elapsed="0.011228"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:02.555667" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:02.555557" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.555525" elapsed="0.000256"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:02.556662" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:02.556486" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.556469" elapsed="0.000261"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:02.557217" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:02.556885" elapsed="0.000467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:02.557875" level="INFO">{1: 299, 2: 303, 3: 357}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:02.557507" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:02.558330" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:02.558081" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:02.558930" elapsed="0.000265"/>
</kw>
<msg time="2026-04-10T00:57:02.559296" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:02.559342" level="INFO">${old_connection_index} = 357</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.558554" elapsed="0.000810"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:02.560189" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:02.561514" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:57:02.561110" elapsed="0.001336">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.560633" elapsed="0.001926"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:02.563202" elapsed="0.000270"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.562735" elapsed="0.000835"/>
</kw>
<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="PASS" start="2026-04-10T00:57:02.559683" elapsed="0.003935"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:02.559441" elapsed="0.004227"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:02.559423" elapsed="0.004271"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:02.564643" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:02.564240" elapsed="0.000433"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:57:02.564722" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:57:02.564881" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:02.563908" elapsed="0.000998"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:02.565064" elapsed="0.000417"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:02.565871" level="INFO">index=374
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:57:02.568611" elapsed="0.611008"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:03.192671" elapsed="0.000537"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:03.193385" elapsed="0.000208"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:03.193750" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:03.180804" elapsed="0.013107"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:03.180073" elapsed="0.013887"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:57:02.556185" elapsed="0.637829"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:03.195087" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:03.194968" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.194945" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:03.195557" level="INFO">${karaf_connection_index} = 374</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:03.195310" elapsed="0.000277"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:03.195928" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:03.195748" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:03.295893" 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 "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:03.196456" elapsed="0.099726"/>
</kw>
<msg time="2026-04-10T00:57:03.296687" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:03.296806" 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 "t "e "s "t "[C "o "p "e "n "f "l "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:03.196115" elapsed="0.100776"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:03.465615" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:03.297867" elapsed="0.168100"/>
</kw>
<msg time="2026-04-10T00:57:03.466273" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:03.466441" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:03.297315" elapsed="0.169210"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:03.467434" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:03.466811" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.466745" elapsed="0.000843"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.468287" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.467810" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:03.468886" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:03.468530" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.468504" elapsed="0.000501"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:03.469059" elapsed="0.000050"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:03.471194" elapsed="0.000787"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:03.472363" elapsed="0.000286"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:03.472880" elapsed="0.000155"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:03.470463" elapsed="0.002651"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:03.469519" elapsed="0.003664"/>
</kw>
<msg time="2026-04-10T00:57:03.473377" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:03.194382" elapsed="0.279054"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:03.473508" elapsed="0.000073"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:02.543342" elapsed="0.930390"/>
</kw>
<msg time="2026-04-10T00:57:03.473881" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:03.473947" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.538411" elapsed="0.935595"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:03.474533" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:03.474127" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.474099" elapsed="0.000574"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:02.538263" elapsed="0.936445"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:02.262995" elapsed="1.211763"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:02.260253" elapsed="1.214594"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:57:02.255136" elapsed="1.219800"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:02.254668" elapsed="1.220352"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:57:02.251637" elapsed="1.223498"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.489489" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:03.489008" elapsed="0.000513"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.490070" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:03.489713" elapsed="0.000384"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:03.490145" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:57:03.490325" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:03.488562" elapsed="0.001795"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.501968" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:03.501519" elapsed="0.000483"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:03.502065" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:57:03.502240" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:03.501126" elapsed="0.001140"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.516081" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.515796" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.516536" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.516293" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.517007" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.516757" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.517537" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.517204" elapsed="0.000396"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:03.518461" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:57:03.518251" elapsed="0.000238"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:57:03.518846" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:57:03.518667" elapsed="0.000205"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:57:03.519028" elapsed="0.000208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.519670" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.519397" elapsed="0.000319"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:57:03.519761" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:57:03.519929" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:57:03.517833" elapsed="0.002122"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:03.533315" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:57:03.533434" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:03.533775" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:03.522305" elapsed="0.011539"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.520035" elapsed="0.013926"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:03.534417" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:03.534031" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.520014" elapsed="0.014658"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.542844" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.537234" elapsed="0.005656"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.536693" elapsed="0.006232"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.536649" elapsed="0.006300"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.545683" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.543233" elapsed="0.002498"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.543006" elapsed="0.002760"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.542989" elapsed="0.002801"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.546380" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:03.545975" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:03.546743" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:03.546478" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.547297" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:03.546988" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.546824" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.546460" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.547961" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:03.547584" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:03.548296" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:03.548059" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.548886" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:03.548570" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.548377" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.548041" elapsed="0.000928"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:03.549124" elapsed="0.000371"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:03.550032" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:03.549738" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:03.550220" elapsed="0.002397"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:03.535581" elapsed="0.017101"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:03.552864" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:03.552756" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.552737" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:03.555513" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:03.553078" elapsed="0.002477"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:03.555607" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:57:03.555765" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:03.513048" elapsed="0.042742"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:03.555856" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:03.556005" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:57:03.510394" elapsed="0.045636"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:03.556080" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:57:03.556226" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:03.500459" elapsed="0.055792"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:57:03.495569" elapsed="0.060743"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:03.490593" elapsed="0.065754"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.566658" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:03.566340" elapsed="0.000345"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:03.566731" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:03.566877" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:03.565996" elapsed="0.000905"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.582585" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.582232" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.583185" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.582865" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.583669" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.583396" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.584116" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.583871" elapsed="0.000289"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:03.585033" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:57:03.584793" elapsed="0.000267"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:57:03.585399" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:57:03.585219" elapsed="0.000207"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:57:03.585605" elapsed="0.000215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.586233" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.585983" elapsed="0.000350"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:57:03.586383" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:57:03.586570" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:57:03.584364" elapsed="0.002233"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:03.598127" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:57:03.598195" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:03.598338" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:03.588947" elapsed="0.009434"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.586685" elapsed="0.011762"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:03.598741" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:03.598486" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.586666" elapsed="0.012202"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.604082" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.600341" elapsed="0.003805"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.600026" elapsed="0.004171"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.599999" elapsed="0.004233"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.608155" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.604693" elapsed="0.003561"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.604314" elapsed="0.004002"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.604289" elapsed="0.004063"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.609267" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:03.608717" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:03.609709" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:03.609445" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.610271" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:03.609959" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.609794" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.609425" elapsed="0.000932"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.610902" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:03.610520" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:03.611235" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:03.610999" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.611789" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:03.611476" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.611316" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.610981" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:03.612028" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:03.612864" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:03.612581" elapsed="0.000309"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:03.613047" elapsed="0.002343"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:03.599382" elapsed="0.016072"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:03.615701" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:03.615590" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.615569" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:03.618360" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:03.615918" elapsed="0.002470"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:03.618436" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:03.618608" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:03.579216" elapsed="0.039417"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:03.618701" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:03.618850" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:57:03.576610" elapsed="0.042265"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:03.618925" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:57:03.619068" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:03.565533" elapsed="0.053560"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:57:03.560963" elapsed="0.058191"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:03.556441" elapsed="0.062746"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.629443" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:03.629129" elapsed="0.000342"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:03.629519" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:57:03.629688" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:03.628777" elapsed="0.000936"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.644331" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.643975" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.644871" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.644584" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.645384" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.645110" elapsed="0.000551"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.646081" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.645828" elapsed="0.000298"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:03.647116" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:57:03.646876" elapsed="0.000269"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:57:03.647487" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:57:03.647308" elapsed="0.000204"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:57:03.647704" elapsed="0.000215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.648383" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.648115" elapsed="0.000314"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:57:03.648476" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:57:03.648703" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:57:03.646386" elapsed="0.002347"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:03.681865" level="INFO">POST Request : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:57:03.682147" level="INFO">POST Response : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:03.682516" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:03.651135" elapsed="0.031519"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.648823" elapsed="0.033994"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:03.683383" elapsed="0.000095"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:03.682907" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.648801" elapsed="0.034925"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.690967" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.686580" elapsed="0.004471"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.685973" elapsed="0.005151"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.685926" elapsed="0.005246"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.694967" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.691635" elapsed="0.003399"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.691259" elapsed="0.003835"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.691234" elapsed="0.003897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.696008" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:03.695386" elapsed="0.000663"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:03.696488" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:03.696149" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.697290" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:03.696864" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.696631" elapsed="0.000747"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.696123" elapsed="0.001284"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.698169" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:03.697655" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:03.698663" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:03.698304" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.699452" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:03.699003" elapsed="0.000560"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.698778" elapsed="0.000842"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.698279" elapsed="0.001371"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:03.699870" elapsed="0.000466"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:03.700825" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:03.700506" elapsed="0.000345"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:03.701009" elapsed="0.002867"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:03.684716" elapsed="0.019238"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:03.704161" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:03.704043" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.704020" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:03.706806" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:03.704389" elapsed="0.002446"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:03.706883" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:57:03.707050" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:03.640610" elapsed="0.066473"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:03.707227" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:03.707402" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:57:03.637789" elapsed="0.069639"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:03.707482" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:03.707662" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:03.628273" elapsed="0.079414"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:57:03.623828" elapsed="0.083926"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:03.619281" elapsed="0.088509"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:03.490426" elapsed="0.217399"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.720022" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:03.719678" elapsed="0.000376"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:03.720107" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:57:03.720267" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:03.719226" elapsed="0.001066"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.727172" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.726817" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.727711" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.727421" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:03.735291" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:03.735354" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:03 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:03 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782623,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:03.735485" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:03.730139" elapsed="0.005376"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.727836" elapsed="0.007756"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:03.735791" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:03.735625" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.727813" elapsed="0.008064"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.740001" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782623,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.737244" elapsed="0.002808"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.736993" elapsed="0.003094"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.736962" elapsed="0.003150"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.743498" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:03.740398" elapsed="0.003260"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.740168" elapsed="0.003549"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.740151" elapsed="0.003602"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.744641" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:03.744019" elapsed="0.000665"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:03.745152" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:03.744790" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.746411" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:03.745746" elapsed="0.000708"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.745277" elapsed="0.001380"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.744762" elapsed="0.001959"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.747748" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:03.747063" elapsed="0.000728"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:03.748252" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:03.747898" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.749268" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:03.748640" elapsed="0.000675"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:03.748376" elapsed="0.000993"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.747871" elapsed="0.001528"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:03.749638" elapsed="0.000759"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:03.751373" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:03.750673" elapsed="0.000727"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:03.751588" elapsed="0.008555"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:03.736491" elapsed="0.023725"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:03.760434" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:57:03.760295" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:03.760274" 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-04-10T00:57:03.760720" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:03.760792" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:57:03.763203" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782623,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:03.720727" elapsed="0.042507"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:03.763289" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:03.763444" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782623,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:03.718620" elapsed="0.044850"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.764836" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782623, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:03.764376" elapsed="0.000488"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:03.764913" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:03.765068" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782623, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:03.764006" elapsed="0.001088"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:03.765463" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:03.765277" elapsed="0.000212"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.765990" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:03.765683" elapsed="0.000333"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.766445" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:03.766187" elapsed="0.000282"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:57:03.767052" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:57:03.766684" elapsed="0.000442">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:57:03.713683" elapsed="0.053556">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:04.778877" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:04.778496" elapsed="0.000413"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:04.778967" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:57:04.779134" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:04.778135" elapsed="0.001024"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:04.785776" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:04.785500" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:04.786227" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:04.785982" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:04.792788" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:04.792847" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:04 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:04 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782624,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:04.792941" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:04.788437" elapsed="0.004531"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:04.786346" elapsed="0.006666"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:04.793194" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:04.793039" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:04.786326" elapsed="0.006958"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:04.797032" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782624,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:04.794466" elapsed="0.002615"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:04.794242" elapsed="0.002875"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:04.794224" elapsed="0.002918"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:04.799968" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:04.797421" elapsed="0.002595"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:04.797198" elapsed="0.002854"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:04.797181" elapsed="0.002896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:04.800845" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:04.800256" elapsed="0.000629"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:04.801343" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:04.800991" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:04.802334" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:04.801729" elapsed="0.000645"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:04.801466" elapsed="0.000963"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:04.800964" elapsed="0.001498"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:04.803288" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:04.802752" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:04.803813" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:04.803430" elapsed="0.000469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:04.804789" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:04.804172" elapsed="0.000657"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:04.803934" elapsed="0.000948"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:04.803404" elapsed="0.001509"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:04.805139" elapsed="0.000731"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:04.806833" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:04.806169" elapsed="0.000704"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:04.807105" elapsed="0.010175"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:04.793817" elapsed="0.023530"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:04.817527" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-10T00:57:04.817419" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:04.817401" 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-04-10T00:57:04.817786" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:04.817857" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:57:04.820284" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782624,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:04.779515" elapsed="0.040802"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:04.820370" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:04.820520" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782624,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:04.777575" elapsed="0.042985"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:04.821682" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782624, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:04.821126" elapsed="0.000584"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:04.821841" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:04.821998" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782624, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:04.820784" elapsed="0.001239"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:04.822379" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:04.822202" elapsed="0.000202"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:04.823077" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:04.822775" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:04.823579" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:04.823277" elapsed="0.000329"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:57:04.824122" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:57:04.823775" elapsed="0.000421">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:57:04.768094" elapsed="0.056213">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:05.836890" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:05.836331" elapsed="0.000604"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:05.837017" elapsed="0.000059"/>
</return>
<msg time="2026-04-10T00:57:05.837250" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:05.835817" elapsed="0.001468"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:05.846775" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:05.846488" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:05.847229" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:05.846983" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:05.854387" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:05.854537" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:05 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:05 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782625,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:05.854661" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:05.849408" elapsed="0.005281"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:05.847349" elapsed="0.007385"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:05.854922" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:05.854763" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:05.847327" elapsed="0.007684"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:05.859227" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782625,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:05.856259" elapsed="0.003041"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:05.856032" elapsed="0.003320"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:05.856013" elapsed="0.003374"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:05.863440" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:05.859863" elapsed="0.003644"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:05.859468" elapsed="0.004111"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:05.859445" elapsed="0.004170"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:05.864409" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:05.863866" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:05.864932" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:05.864594" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:05.865940" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:05.865274" elapsed="0.000705"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:05.865049" elapsed="0.000981"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:05.864564" elapsed="0.001497"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:05.867029" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:05.866286" elapsed="0.000782"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:05.867654" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:05.867168" elapsed="0.000569"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:05.868592" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:05.867995" elapsed="0.000637"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:05.867771" elapsed="0.000912"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:05.867143" elapsed="0.001569"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:05.868925" elapsed="0.000758"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:05.870472" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:05.869923" elapsed="0.000577"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:05.870678" elapsed="0.008310"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:05.855586" elapsed="0.023470"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:05.879238" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:57:05.879128" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:05.879110" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:05.879481" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:05.879574" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:57:05.882356" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782625,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:05.837789" elapsed="0.044663"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:05.882512" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:57:05.882697" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782625,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:05.835133" elapsed="0.047593"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:05.883943" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782625, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:05.883450" elapsed="0.000523"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:05.884024" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:05.884182" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782625, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:05.883005" elapsed="0.001204"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:05.884606" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:05.884390" elapsed="0.000254"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:05.885146" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:05.884835" elapsed="0.000339"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:05.885702" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:05.885345" elapsed="0.000383"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:57:05.886257" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:57:05.885901" elapsed="0.000430">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:57:05.825240" elapsed="0.061203">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:06.897019" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:06.896511" elapsed="0.000551"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:06.897137" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:57:06.897388" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:06.896008" elapsed="0.001418"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:06.905692" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:06.905412" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:06.906144" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:06.905898" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:06.914139" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:06.914231" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:06 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782626,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:06.914383" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:06.908308" elapsed="0.006118"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:06.906261" elapsed="0.008232"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:06.914803" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:06.914536" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:06.906240" elapsed="0.008687"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:06.920846" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782626,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:06.916748" elapsed="0.004175"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:06.916381" elapsed="0.004675"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:06.916350" elapsed="0.004748"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:06.925648" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:06.921612" elapsed="0.004109"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:06.921217" elapsed="0.004555"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:06.921187" elapsed="0.004624"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:06.926700" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:06.926089" elapsed="0.000654"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:06.927216" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:06.926852" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:06.928231" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:06.927618" elapsed="0.000653"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:06.927343" elapsed="0.000981"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:06.926824" elapsed="0.001533"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:06.929121" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:06.928616" elapsed="0.000543"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:06.929601" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:06.929254" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:06.930613" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:06.929984" elapsed="0.000670"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:06.929732" elapsed="0.000975"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:06.929229" elapsed="0.001512"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:06.931082" elapsed="0.000754"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:06.932771" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:06.932091" elapsed="0.000721"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:06.933083" elapsed="0.012497"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:06.915724" elapsed="0.029967"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:06.945983" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-10T00:57:06.945814" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:06.945781" elapsed="0.000345"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:06.946381" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:06.946492" elapsed="0.000024"/>
</return>
<msg time="2026-04-10T00:57:06.950337" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782626,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:06.897932" elapsed="0.052452"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:06.950464" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:57:06.950717" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782626,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:06.895320" elapsed="0.055438"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:06.952313" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782626, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:06.951704" elapsed="0.000651"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:06.952429" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:57:06.952774" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782626, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:06.951116" elapsed="0.001845"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:06.953527" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:06.953246" elapsed="0.000345"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:06.954335" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:06.953868" elapsed="0.000506"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:06.955074" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:06.954664" elapsed="0.000450"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:57:06.955943" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:57:06.955385" elapsed="0.000662">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:57:06.887270" elapsed="0.068945">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:07.967774" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:07.967237" elapsed="0.000595"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:07.967916" elapsed="0.000059"/>
</return>
<msg time="2026-04-10T00:57:07.968157" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:07.966705" elapsed="0.001487"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:07.977140" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:07.976874" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:07.977713" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:07.977347" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:07.986121" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:07.986181" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:08 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:08 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782628,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:07.986277" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:07.979883" elapsed="0.006420"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:07.977836" elapsed="0.008510"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:07.986531" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:07.986374" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:07.977815" elapsed="0.008822"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:07.990613" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782628,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:07.987833" elapsed="0.002832"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:07.987606" elapsed="0.003094"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:07.987588" elapsed="0.003137"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:07.993650" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:07.991008" elapsed="0.002691"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:07.990782" elapsed="0.002952"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:07.990765" elapsed="0.002994"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:07.994337" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:07.993940" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:07.994696" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:07.994440" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:07.995358" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:07.994943" elapsed="0.000443"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:07.994779" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:07.994422" elapsed="0.001080"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:07.996052" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:07.995681" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:07.996384" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:07.996149" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:07.997058" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:07.996643" elapsed="0.000442"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:07.996466" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:07.996131" elapsed="0.001012"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:07.997298" elapsed="0.000561"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:07.998462" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:07.998027" elapsed="0.000462"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:07.998662" elapsed="0.008275"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:07.987158" elapsed="0.019845"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:08.007182" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:57:08.007074" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.007055" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.007425" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.007496" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:57:08.010233" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782628,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:07.968714" elapsed="0.041549"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:08.010316" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:08.010475" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782628,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:07.965959" elapsed="0.044543"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.011502" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782628, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.011100" elapsed="0.000431"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:08.011596" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:08.011754" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782628, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:08.010740" elapsed="0.001041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:08.012142" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.011959" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.012662" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:08.012343" elapsed="0.000345"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.013123" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:08.012861" elapsed="0.000287"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.013319" elapsed="0.000536"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:57:07.957220" elapsed="0.056697"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:03.713048" elapsed="4.300921"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:03.712628" elapsed="4.301406"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:03.708027" elapsed="4.306081"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.025640" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:08.025280" elapsed="0.000387"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:08.025712" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:08.025861" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:08.024931" elapsed="0.000955"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.032451" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.032196" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.032917" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.032671" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:08.041412" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:08.041477" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:08 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:08 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782628,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:08.041591" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:08.035088" elapsed="0.006530"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.033030" elapsed="0.008632"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.041842" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.041688" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.033012" elapsed="0.008915"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.047849" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782628,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.043094" elapsed="0.004827"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.042871" elapsed="0.005099"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.042853" elapsed="0.005152"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.051971" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.048398" elapsed="0.003641"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.048085" elapsed="0.004003"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.048061" elapsed="0.004062"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.052927" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.052353" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.053440" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.053066" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.054382" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:08.053803" elapsed="0.000617"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.053576" elapsed="0.000894"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.053041" elapsed="0.001460"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.055257" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.054747" elapsed="0.000547"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.055741" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.055392" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.056682" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:08.056076" elapsed="0.000645"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.055854" elapsed="0.000917"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.055367" elapsed="0.001434"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:08.057235" elapsed="0.000575"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:08.058396" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.057977" elapsed="0.000446"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.058599" elapsed="0.008287"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:08.042434" elapsed="0.024521"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:08.067138" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:57:08.067027" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.067009" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.067396" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.067479" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:57:08.070047" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782628,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:08.026220" elapsed="0.043857"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:08.070130" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:08.070281" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782628,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:08.024459" elapsed="0.045848"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.071399" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782628, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.070973" elapsed="0.000458"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:08.071481" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:08.071657" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782628, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:08.070579" elapsed="0.001104"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:08.072073" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.071882" elapsed="0.000217"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.072829" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:08.072275" elapsed="0.000584"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.073337" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:08.073066" elapsed="0.000297"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.073576" elapsed="0.000356"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:57:08.020001" elapsed="0.054001"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:08.019407" elapsed="0.054644"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:08.018996" elapsed="0.055114"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:08.014211" elapsed="0.059932"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.085940" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:08.085635" elapsed="0.000333"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:08.086016" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:57:08.086177" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:08.085235" elapsed="0.000967"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.093358" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.093053" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.093921" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.093669" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:08.102139" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:08.102199" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:08 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:08 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782628,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:08.102320" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:08.096240" elapsed="0.006106"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.094034" elapsed="0.008361"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.102609" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.102424" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.094016" elapsed="0.008680"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.106518" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782628,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.103893" elapsed="0.002699"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.103667" elapsed="0.002962"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.103649" elapsed="0.003005"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.109634" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.106939" elapsed="0.002762"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.106712" elapsed="0.003039"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.106695" elapsed="0.003090"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.110583" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.110018" elapsed="0.000606"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.111058" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.110725" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.112029" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:08.111420" elapsed="0.000648"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.111175" elapsed="0.000943"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.110699" elapsed="0.001449"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.113001" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.112380" elapsed="0.000660"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.113511" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.113140" elapsed="0.000498"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.114601" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:08.113912" elapsed="0.000731"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.113671" elapsed="0.001023"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.113115" elapsed="0.001609"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:08.114942" elapsed="0.000746"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:08.116540" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.115928" elapsed="0.000680"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.116852" elapsed="0.009827"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:08.103202" elapsed="0.023549"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:08.126977" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:57:08.126865" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.126844" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.127220" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.127293" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:57:08.130011" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782628,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:08.086539" elapsed="0.043501"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:08.130092" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:08.130246" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782628,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:08.084494" elapsed="0.045778"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.131280" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782628, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.130878" elapsed="0.000432"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:08.131358" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:08.131689" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782628, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:08.130495" elapsed="0.001222"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:08.132091" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.131907" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.132642" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:08.132292" elapsed="0.000382"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.133128" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:08.132858" elapsed="0.000296"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.133326" elapsed="0.000460"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:57:08.079838" elapsed="0.054025"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:08.079251" elapsed="0.054663"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:08.078817" elapsed="0.055158"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:08.074237" elapsed="0.059770"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:03.707879" elapsed="4.426161"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.145239" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:08.144882" elapsed="0.000384"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:08.145313" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:08.145463" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:08.144493" elapsed="0.000995"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.152661" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.152301" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.153129" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.152873" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:08.160454" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:08.160514" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:08 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:08 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782628,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:08.160677" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:08.155290" elapsed="0.005414"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.153245" elapsed="0.007502"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.160927" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.160773" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.153226" elapsed="0.007787"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.164474" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782628,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.162033" elapsed="0.002490"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.161810" elapsed="0.002776"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.161791" elapsed="0.002820"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.167292" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.164894" elapsed="0.002446"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.164668" elapsed="0.002708"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.164651" elapsed="0.002751"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.168017" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.167606" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.168430" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.168117" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.169010" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:08.168704" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.168514" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.168099" elapsed="0.000993"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.169635" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.169255" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.169966" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.169732" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.170502" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:08.170208" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.170046" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.169714" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:08.170761" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:08.171581" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.171277" elapsed="0.000331"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.171764" elapsed="0.002404"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:08.161371" elapsed="0.012865"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:08.174420" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:57:08.174307" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.174288" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.174681" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.174753" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:57:08.177085" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782628,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:08.145860" elapsed="0.031254"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:08.177167" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:08.177318" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782628,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:08.144030" elapsed="0.033362"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:57:08.177443" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:08.177610" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782628,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 1. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:57:08.139384" elapsed="0.038253"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.178634" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782628, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.178221" elapsed="0.000441"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:08.178712" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:08.178868" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782628, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:08.177870" elapsed="0.001024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:08.179254" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.179074" elapsed="0.000205"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.179762" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:57:08.179460" elapsed="0.000359"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:57:08.138906" elapsed="0.040972"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:08.134240" elapsed="0.045672"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.190851" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:08.190533" elapsed="0.000344"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:08.190923" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:08.191071" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:08.190179" elapsed="0.000916"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.197951" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.197699" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.198395" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.198154" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:08.206184" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:08.206241" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:08 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:08 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782628,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:08.206337" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:08.200608" elapsed="0.005764"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.198507" elapsed="0.007915"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.206626" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.206449" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.198489" elapsed="0.008224"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.210335" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782628,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.207723" elapsed="0.002662"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.207485" elapsed="0.002935"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.207468" elapsed="0.002976"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.213502" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.210743" elapsed="0.002849"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.210500" elapsed="0.003193"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.210483" elapsed="0.003248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.214493" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.213966" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.214997" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.214661" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.215823" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:08.215345" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.215113" elapsed="0.000801"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.214635" elapsed="0.001309"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.216753" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.216197" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.217218" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.216890" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.217994" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:08.217580" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.217331" elapsed="0.000749"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.216865" elapsed="0.001245"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:08.218320" elapsed="0.000508"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:08.219458" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.219057" elapsed="0.000438"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.219737" elapsed="0.003378"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:08.207063" elapsed="0.016144"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:08.223458" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:57:08.223308" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.223281" elapsed="0.000322"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.223815" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.223913" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:57:08.226378" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782628,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:08.191445" elapsed="0.034962"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:08.226460" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:08.226628" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782628,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:08.189724" elapsed="0.036931"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:57:08.226702" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:57:08.226846" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782628,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:57:08.185292" elapsed="0.041581"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.227876" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782628, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.227454" elapsed="0.000450"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:08.227952" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:08.228134" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782628, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:08.227099" elapsed="0.001061"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:08.228663" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.228456" elapsed="0.000233"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.229197" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:57:08.228896" elapsed="0.000382"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:57:08.184850" elapsed="0.044512"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:08.180011" elapsed="0.049389"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.240332" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:08.240014" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:08.240412" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:08.240582" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:08.239623" elapsed="0.000985"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.247970" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.247662" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.248433" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.248177" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:08.255426" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:08.255486" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:08 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:08 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782628,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:08.255605" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:08.250679" elapsed="0.004954"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.248569" elapsed="0.007108"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.255909" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.255705" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.248531" elapsed="0.007469"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.260871" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782628,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.257329" elapsed="0.003613"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.257011" elapsed="0.003980"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.256985" elapsed="0.004040"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.265128" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.261417" elapsed="0.003799"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.261104" elapsed="0.004171"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.261080" elapsed="0.004233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.266320" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.265638" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.266897" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.266491" elapsed="0.000489"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.267893" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:08.267257" elapsed="0.000676"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.267013" elapsed="0.000971"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.266460" elapsed="0.001554"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.268739" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.268262" elapsed="0.000506"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.269160" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.268918" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.269762" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:08.269405" elapsed="0.000385"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:08.269243" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.268898" elapsed="0.000949"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:08.270020" elapsed="0.000385"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:08.270915" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.270593" elapsed="0.000350"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.271112" elapsed="0.002522"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:08.256378" elapsed="0.017336"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:08.273907" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:57:08.273792" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.273773" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.274158" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.274229" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:57:08.276660" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782628,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:08.240971" elapsed="0.035719"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:08.276749" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:57:08.276911" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782628,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:08.239117" elapsed="0.037820"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:57:08.276985" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:08.277134" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782628,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 3. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:57:08.234667" elapsed="0.042493"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.278190" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782628, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:08.277786" elapsed="0.000432"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:08.278267" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:08.278429" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782628, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:08.277396" elapsed="0.001058"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:08.278840" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.278648" elapsed="0.000218"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.279330" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:57:08.279045" elapsed="0.000341"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:57:08.234196" elapsed="0.045249"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:08.229499" elapsed="0.049981"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:08.134098" elapsed="0.145420"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:57:03.485839" elapsed="4.793755"/>
</kw>
<arg>${restart_timeout}</arg>
<arg>2s</arg>
<arg>BulkomaticKeywords.Get Bulk Flow And Verify Count In Cluster</arg>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:03.475475" elapsed="4.804177"/>
</kw>
<doc>1000 Flows preserved in all controller instances.</doc>
<status status="PASS" start="2026-04-10T00:57:02.251049" elapsed="6.028833"/>
</test>
<test id="s1-s3-t25" name="Start Mininet Again Connect To Leader" line="194">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:57:08.283649" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:57:08.283338" elapsed="0.000597"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.284969" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:08.284847" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.284828" elapsed="0.000212"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.290103" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:08.289994" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.289974" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.291196" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:08.290797" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.291791" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:08.291385" elapsed="0.000435"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:08.291866" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:57:08.292034" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:08.290401" elapsed="0.001658"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.297509" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:08.297396" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.297377" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.298775" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:08.298667" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.298649" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:08.299284" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.298989" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:08.299748" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:08.299472" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:08.351897" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:08.300276" elapsed="0.051825"/>
</kw>
<msg time="2026-04-10T00:57:08.352318" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:08.352366" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:08.299936" elapsed="0.052468"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:08.450937" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:08.353106" elapsed="0.098223"/>
</kw>
<msg time="2026-04-10T00:57:08.451665" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:08.451740" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:08.352677" elapsed="0.099121"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.452368" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.451948" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.451908" elapsed="0.000588"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.453261" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.452743" elapsed="0.000737"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.453943" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.453607" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.453578" elapsed="0.000484"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:08.454116" elapsed="0.000051"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:08.456459" elapsed="0.001224"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.458100" elapsed="0.000738"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:08.459235" elapsed="0.000539"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:08.455500" elapsed="0.004424"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:08.454607" elapsed="0.005412"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:08.298341" elapsed="0.161829"/>
</kw>
<msg time="2026-04-10T00:57:08.460309" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:08.460377" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:08.297746" elapsed="0.162688"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:08.460739" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:57:08.460576" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.460523" elapsed="0.000343"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.461460" elapsed="0.000039"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.461986" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.462095" elapsed="0.000025"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:08.297056" elapsed="0.165201"/>
</kw>
<msg time="2026-04-10T00:57:08.462398" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:08.462466" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:08.292441" elapsed="0.170190"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.463165" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.462770" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.462742" elapsed="0.000537"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:08.292293" elapsed="0.171021"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.469134" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:08.469023" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.469003" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.470358" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:08.470250" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.470233" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:08.470933" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.470628" elapsed="0.000332"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:08.471339" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:08.471121" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:08.506210" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:08.471884" elapsed="0.034614"/>
</kw>
<msg time="2026-04-10T00:57:08.507041" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:08.507117" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:08.471525" elapsed="0.035651"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:08.579567" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:08.507948" elapsed="0.071855"/>
</kw>
<msg time="2026-04-10T00:57:08.580023" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:08.580071" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:08.507471" elapsed="0.072639"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.580770" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.580234" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.580196" elapsed="0.000668"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.581411" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.581015" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.581845" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.581592" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.581573" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:08.581964" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:08.583893" elapsed="0.000838"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.585013" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:08.585796" elapsed="0.000365"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:08.583221" elapsed="0.003042"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:08.582296" elapsed="0.004031"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:08.469948" elapsed="0.116514"/>
</kw>
<msg time="2026-04-10T00:57:08.586569" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:08.586616" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:08.469360" elapsed="0.117294"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:08.586844" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:57:08.586734" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.586715" elapsed="0.000230"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.587352" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.587713" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.587787" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:08.468660" elapsed="0.119234"/>
</kw>
<msg time="2026-04-10T00:57:08.587990" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:08.588033" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:08.463630" elapsed="0.124440"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.588462" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.588206" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.588188" elapsed="0.000376"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:08.463468" elapsed="0.125132"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.594264" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:08.594155" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.594137" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.595494" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:08.595385" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.595367" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:08.596038" level="INFO">${karaf_connection_index} = 374</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.595729" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:08.596446" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:08.596224" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:08.652921" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:08.597039" elapsed="0.056006"/>
</kw>
<msg time="2026-04-10T00:57:08.653216" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:08.653263" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:08.596697" elapsed="0.056647"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:08.773391" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:08.654031" elapsed="0.119614"/>
</kw>
<msg time="2026-04-10T00:57:08.773875" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:08.773923" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:08.653636" elapsed="0.120326"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.774428" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.774083" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.774048" elapsed="0.000471"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.775081" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "L "e "a "d "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.774691" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.775461" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.775242" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.775224" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:08.775595" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:08.777210" elapsed="0.000792"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:08.778281" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:08.779029" elapsed="0.000365"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:08.776558" elapsed="0.002938"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:08.775920" elapsed="0.003661"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:08.595081" elapsed="0.184680"/>
</kw>
<msg time="2026-04-10T00:57:08.779859" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:08.779905" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:08.594490" elapsed="0.185454"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:08.780130" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:57:08.780022" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.780004" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.780665" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.781277" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:08.781352" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:08.593806" elapsed="0.187658"/>
</kw>
<msg time="2026-04-10T00:57:08.781575" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:08.781622" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:08.588924" elapsed="0.192736"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.781990" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.781736" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.781719" elapsed="0.000351"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:08.588779" elapsed="0.193315"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:08.292117" elapsed="0.490011"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:08.289623" elapsed="0.492563"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:57:08.284534" elapsed="0.497712"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:08.284095" elapsed="0.498200"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:57:08.280893" elapsed="0.501459"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.785421" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.785198" elapsed="0.000271"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:08.788018" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:08.787751" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:08.787733" elapsed="0.000367"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:08.788385" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:08.788249" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.789104" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:08.788722" elapsed="0.000430"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:08.789695" 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-04-10T00:57:08.789308" elapsed="0.000413"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:08.790628" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:08.790706" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:08.790336" elapsed="0.000395"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:08.790933" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:08.792131" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:09.198074" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:56:12 UTC 2026

  System load:  0.0                Processes:             107
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:56:37 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:08.791812" elapsed="0.406492"/>
</kw>
<msg time="2026-04-10T00:57:09.198422" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:08.791429" elapsed="0.407107"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:08.789938" elapsed="0.408807"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:09.199431" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:57:10.413324" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:57:10.413533" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:10.413607" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:09.199096" elapsed="1.214539"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:10.413889" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:10.414693" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:10.414358" 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-04-10T00:57:10.414986" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:10.414837" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:10.414812" elapsed="0.000249"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:10.415251" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T00:57:10.415114" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:10.415098" elapsed="0.000266"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:10.415401" elapsed="0.000015"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:10.418361" elapsed="0.000366"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:10.418899" elapsed="0.000166"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:10.419216" elapsed="0.000100"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:10.415841" elapsed="0.003529"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:08.787105" elapsed="1.632359"/>
</kw>
<msg time="2026-04-10T00:57:10.419523" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:08.786556" elapsed="1.633039"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:57:08.786046" elapsed="1.633651"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:10.421934" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:10.421632" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:10.421605" elapsed="0.000414"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:10.422313" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:10.422173" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:10.423041" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:10.422645" elapsed="0.000446"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:10.423688" level="INFO">${conn_id} = 382</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:10.423253" elapsed="0.000462"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:10.424671" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:10.424751" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:10.424366" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:10.424938" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:10.426199" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:10.799363" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:56:12 UTC 2026

  System load:  0.0                Processes:             107
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:09 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:10.425883" elapsed="0.373636"/>
</kw>
<msg time="2026-04-10T00:57:10.799635" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:10.425493" elapsed="0.374231"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:10.423937" elapsed="0.375908"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:10.800383" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:57:10.832623" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:57:10.832881" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:10.832977" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:10.800114" elapsed="0.032913"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:10.833410" elapsed="0.000548"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:10.835072" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:10.834391" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:10.835682" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:10.835345" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:10.835294" elapsed="0.000552"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:10.836204" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-10T00:57:10.835965" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:10.835931" elapsed="0.000460"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:10.836468" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:10.842782" elapsed="0.000332"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:10.843284" elapsed="0.000166"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:10.843704" elapsed="0.000101"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:10.837211" elapsed="0.006647"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:10.421059" elapsed="0.422892"/>
</kw>
<msg time="2026-04-10T00:57:10.844005" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:10.420469" elapsed="0.423586"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:57:10.419962" elapsed="0.424174"/>
</kw>
<arg>${mininet}</arg>
<status status="PASS" start="2026-04-10T00:57:08.785691" elapsed="2.058502"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:10.849307" level="INFO">${tools_connection} = 384</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:10.848927" elapsed="0.000407"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:10.851333" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:10.851412" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:10.851049" elapsed="0.000387"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:10.851614" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:10.852827" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:11.249583" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:56:12 UTC 2026

  System load:  0.0                Processes:             107
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:10 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:10.852472" elapsed="0.397385"/>
</kw>
<msg time="2026-04-10T00:57:11.250017" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:10.852112" elapsed="0.398056"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:10.850558" elapsed="0.399830"/>
</kw>
<msg time="2026-04-10T00:57:11.250498" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:10.850142" elapsed="0.400486"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:57:10.849576" elapsed="0.401220"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-10T00:57:11.250896" elapsed="0.000080"/>
</return>
<msg time="2026-04-10T00:57:11.251312" level="INFO">${mininet_conn_id} = 384</msg>
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-10T00:57:10.848423" elapsed="0.402944"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:11.252850" level="INFO">${mininet_conn_id} = 384</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:57:11.251962" elapsed="0.000981"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.257294" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:11.253114" elapsed="0.004247"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.253070" elapsed="0.004318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:11.257958" level="INFO">Start mininet --topo tree,1 to 10.30.171.151</msg>
<arg>Start mininet ${options} to ${controller}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:11.257572" elapsed="0.000438"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:11.260877" level="INFO">sudo mn --controller 'remote,ip=10.30.171.151,port=6633' --topo tree,1 --switch ovsk,protocols=OpenFlow13</msg>
<arg>sudo mn --controller 'remote,ip=${controller},port=${ofport}' ${options} --switch ovsk,protocols=OpenFlow${ofversion}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:11.258181" elapsed="0.002755"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:57:11.462190" level="INFO">[?2004l*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2 
*** Adding switches:
s1 
*** Adding links:
(s1, h1) (s1, h2) 
*** Configuring hosts
h1 h2 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:57:11.261238" elapsed="0.201159"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:11.463216" level="INFO">Check OVS configuratiom</msg>
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:11.462812" elapsed="0.000449"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:11.465076" level="INFO">sh ovs-vsctl show</msg>
<arg>sh ovs-vsctl show</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:11.463440" elapsed="0.001694"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:57:11.472632" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Bridge s1
        Controller "tcp:10.30.171.151:6633"
        Controller "ptcp:6654"
        fail_mode: secure
        Port s1-eth2
            Interface s1-eth2
        Port s1
            Interface s1
                type: internal
        Port s1-eth1
            Interface s1-eth1
    ovs_version: "2.17.11"
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:57:11.465295" elapsed="0.007400"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="PASS" start="2026-04-10T00:57:11.472748" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:57:11.472991" level="INFO">${mininet_conn_id} = 384</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${Inventory_Leader}_IP}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="PASS" start="2026-04-10T00:57:08.782681" elapsed="2.690336"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:11.473572" level="INFO">${mininet_conn_id} = 384</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:57:11.473222" elapsed="0.000394"/>
</kw>
<doc>Start mininet with connection to Leader Node.</doc>
<status status="PASS" start="2026-04-10T00:57:08.280323" elapsed="3.193412"/>
</test>
<test id="s1-s3-t26" name="Verify Flows In Switch After Leader Restart" line="201">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:57:11.477939" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:57:11.477669" elapsed="0.000539"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:11.479317" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:11.479181" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.479160" elapsed="0.000228"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:11.484589" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:11.484467" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.484448" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:11.485673" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:11.485272" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:11.486163" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:11.485861" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:11.486232" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:11.486387" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:11.484893" elapsed="0.001518"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:11.492042" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:11.491935" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.491916" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:11.493298" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:11.493193" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.493176" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:11.493844" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:11.493514" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:11.494280" level="INFO">${current_connection_index} = 384</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:11.494033" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:11.535024" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:11.494845" elapsed="0.040445"/>
</kw>
<msg time="2026-04-10T00:57:11.535528" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:11.535803" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:11.494466" elapsed="0.041380"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:11.615242" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:11.536582" elapsed="0.078955"/>
</kw>
<msg time="2026-04-10T00:57:11.615816" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:11.615867" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:11.536107" elapsed="0.079799"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.616406" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:11.616044" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.616005" elapsed="0.000492"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:11.617089" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:11.616671" elapsed="0.000516"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.617478" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:11.617256" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.617237" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:11.617614" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:11.620476" elapsed="0.000387"/>
</kw>
<msg time="2026-04-10T00:57:11.620927" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:11.619216" elapsed="0.001844"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.621338" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.621888" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:11.618560" elapsed="0.003516"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:11.617947" elapsed="0.004213"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:11.492892" elapsed="0.129366"/>
</kw>
<msg time="2026-04-10T00:57:11.622351" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:11.622394" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:11.492265" elapsed="0.130167"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:11.622634" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:57:11.622509" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.622491" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.623122" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.623461" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:11.623533" elapsed="0.000034"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:11.491437" elapsed="0.132225"/>
</kw>
<msg time="2026-04-10T00:57:11.623757" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:11.623803" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:11.486827" elapsed="0.137076"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.624242" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:11.623990" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.623972" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:11.486664" elapsed="0.137680"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:11.630689" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:11.630577" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.630537" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:11.631905" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:11.631798" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.631780" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:11.632425" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:11.632122" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:11.632912" level="INFO">${current_connection_index} = 384</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:11.632668" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:11.669285" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:11.633445" elapsed="0.035948"/>
</kw>
<msg time="2026-04-10T00:57:11.669581" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:11.669630" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:11.633101" elapsed="0.036567"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:11.780171" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:11.670217" elapsed="0.110319"/>
</kw>
<msg time="2026-04-10T00:57:11.780899" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:11.780978" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:11.669848" elapsed="0.111194"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.782090" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:11.781233" elapsed="0.000957"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.781179" elapsed="0.001055"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:11.783086" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:11.782474" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.783689" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:11.783339" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.783312" elapsed="0.000491"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:11.783868" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:11.788091" elapsed="0.000592"/>
</kw>
<msg time="2026-04-10T00:57:11.788774" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:11.786294" elapsed="0.002674"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.789487" elapsed="0.000142"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.790135" elapsed="0.000109"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:11.785256" elapsed="0.005155"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:11.784364" 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-04-10T00:57:11.631477" elapsed="0.159369"/>
</kw>
<msg time="2026-04-10T00:57:11.790989" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:11.791055" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:11.630913" elapsed="0.160201"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:11.791383" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:57:11.791229" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.791202" elapsed="0.000313"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.792147" elapsed="0.000038"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.792686" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:11.792791" elapsed="0.000025"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:11.630159" elapsed="0.162797"/>
</kw>
<msg time="2026-04-10T00:57:11.793102" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:11.793170" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:11.624648" elapsed="0.168582"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.793860" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:11.793375" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.793320" elapsed="0.000662"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:11.624476" elapsed="0.169543"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:11.803092" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:11.802928" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.802899" elapsed="0.000303"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:11.804934" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:11.804778" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.804752" elapsed="0.000284"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:11.805745" level="INFO">${karaf_connection_index} = 374</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:11.805255" elapsed="0.000533"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:11.806391" level="INFO">${current_connection_index} = 384</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:11.806039" elapsed="0.000392"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:11.860814" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:11.807215" elapsed="0.053951"/>
</kw>
<msg time="2026-04-10T00:57:11.861475" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:11.861538" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:11.806704" elapsed="0.054933"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:11.957099" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:11.862680" elapsed="0.094709"/>
</kw>
<msg time="2026-04-10T00:57:11.957664" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:11.957813" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:11.861999" elapsed="0.095857"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.958335" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:11.957983" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.957943" elapsed="0.000480"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:11.958994" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:11.958589" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.959378" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:11.959158" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.959139" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:11.959496" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:11.962130" elapsed="0.000177"/>
</kw>
<msg time="2026-04-10T00:57:11.962369" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:11.961100" elapsed="0.001405"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.962809" elapsed="0.000326"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.963404" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:11.960419" elapsed="0.003192"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:11.959839" elapsed="0.003840"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:11.804311" elapsed="0.159466"/>
</kw>
<msg time="2026-04-10T00:57:11.963871" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:11.963916" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:11.803443" elapsed="0.160512"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:11.964141" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:57:11.964033" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.964014" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.964675" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.965024" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:11.965097" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:11.802387" elapsed="0.162818"/>
</kw>
<msg time="2026-04-10T00:57:11.965301" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:11.965344" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:11.794430" elapsed="0.170952"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:11.965732" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:11.965457" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.965440" elapsed="0.000369"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:11.794212" elapsed="0.171621"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:11.486469" elapsed="0.479397"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:11.484101" elapsed="0.481826"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:57:11.478875" elapsed="0.487150"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:11.478363" elapsed="0.487708"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:57:11.475034" elapsed="0.491092"/>
</kw>
<kw name="Verify Aggregate Flow From Mininet Session" owner="MininetKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:11.968062" elapsed="0.000164"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:11.967842" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.967824" elapsed="0.000462"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:11.968750" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:11.968451" elapsed="0.000326"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:11.969644" elapsed="0.000164"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:11.969411" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:11.969394" elapsed="0.000473"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:11.972721" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:11.970006" elapsed="0.002776"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:57:11.996492" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<msg time="2026-04-10T00:57:11.996653" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:57:11.972946" elapsed="0.023736"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:57:11.996731" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:57:11.996887" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 384 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:57:11.969096" elapsed="0.027818"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:57:11.997404" level="INFO">${flows} = ['0']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:57:11.997150" elapsed="0.000280"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:11.998008" level="INFO">${total_flows} = 0</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:11.997627" elapsed="0.000410"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:57:11.998506" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-04-10T00:57:11.998626" level="FAIL">0.0 != 1000.0</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-04-10T00:57:11.998222" elapsed="0.000481">0.0 != 1000.0</status>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="FAIL" start="2026-04-10T00:57:11.967503" elapsed="0.031314">0.0 != 1000.0</status>
</kw>
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:14.001322" elapsed="0.000428"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:14.000747" elapsed="0.001101"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.000702" elapsed="0.001202"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:14.002944" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:14.002298" elapsed="0.000708"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:14.005702" elapsed="0.000378"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:14.005092" elapsed="0.001069"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.004384" elapsed="0.001832"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.009460" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:14.006529" elapsed="0.002993"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.037165" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<msg time="2026-04-10T00:57:14.037372" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:57:14.009715" elapsed="0.027691"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:57:14.037486" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:57:14.037722" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 384 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:57:14.003752" elapsed="0.034081"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:57:14.038350" level="INFO">${flows} = ['1000']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:57:14.038063" elapsed="0.000314"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:14.038999" level="INFO">${total_flows} = 1000</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:14.038561" elapsed="0.000466"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:57:14.039528" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-04-10T00:57:14.039242" elapsed="0.000364"/>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="PASS" start="2026-04-10T00:57:13.999898" elapsed="0.039768"/>
</kw>
<arg>${time_out}</arg>
<arg>2s</arg>
<arg>MininetKeywords.Check Flows In Mininet</arg>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:11.966878" elapsed="2.072841"/>
</kw>
<arg>${mininet_conn_id}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${operation_timeout}</arg>
<doc>Verify flow count per switch</doc>
<status status="PASS" start="2026-04-10T00:57:11.966373" elapsed="2.073413"/>
</kw>
<doc>Verify flows are installed in switch after leader restart.</doc>
<status status="PASS" start="2026-04-10T00:57:11.474322" elapsed="2.565587"/>
</test>
<test id="s1-s3-t27" name="Stop Mininet Connected To Leader Node After Leader Restart" line="208">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:57:14.043312" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:57:14.043043" elapsed="0.000551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:14.044630" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:14.044494" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.044473" elapsed="0.000228"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:14.049733" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:14.049627" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.049609" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:14.050809" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:14.050411" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:14.051310" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:14.050998" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:14.051379" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:14.051532" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:14.050026" elapsed="0.001545"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:14.057205" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:14.057072" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.057052" elapsed="0.000223"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:14.058463" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:14.058357" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.058340" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:14.059008" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:14.058707" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.059441" level="INFO">${current_connection_index} = 384</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:14.059195" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.103019" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:14.059987" elapsed="0.043144"/>
</kw>
<msg time="2026-04-10T00:57:14.103294" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:14.103341" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:14.059646" elapsed="0.043732"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.196614" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[C "N "o "d "e "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:14.104015" elapsed="0.092929"/>
</kw>
<msg time="2026-04-10T00:57:14.197195" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:14.197246" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:14.103665" elapsed="0.093620"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.197803" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:14.197418" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.197380" elapsed="0.000517"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:14.198460" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[C "N "o "d "e "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:14.198056" elapsed="0.000527"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.198884" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:14.198656" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.198637" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:14.199006" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:14.202420" elapsed="0.000213"/>
</kw>
<msg time="2026-04-10T00:57:14.202702" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:14.201111" elapsed="0.001764"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.203161" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.203503" 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-04-10T00:57:14.200302" elapsed="0.003419"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:14.199350" elapsed="0.004453"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:14.058054" elapsed="0.146025"/>
</kw>
<msg time="2026-04-10T00:57:14.204201" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:14.204247" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:14.057429" elapsed="0.146859"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:14.204535" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-10T00:57:14.204392" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.204360" elapsed="0.000307"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.205104" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.205458" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:14.205532" elapsed="0.000045"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:14.056734" elapsed="0.148947"/>
</kw>
<msg time="2026-04-10T00:57:14.205788" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:14.205834" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:14.051953" elapsed="0.153922"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.206273" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:14.206013" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.205994" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:14.051809" elapsed="0.154567"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:14.212779" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:14.212652" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.212600" 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-04-10T00:57:14.214013" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:14.213907" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.213889" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:14.214538" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:14.214229" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.214983" level="INFO">${current_connection_index} = 384</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:14.214743" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.251095" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:14.215533" elapsed="0.035861"/>
</kw>
<msg time="2026-04-10T00:57:14.251936" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:14.252077" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:14.215170" elapsed="0.037013"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.335511" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[C "N "o "d "e "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:14.253828" elapsed="0.082000"/>
</kw>
<msg time="2026-04-10T00:57:14.336074" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:14.336124" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:14.252793" elapsed="0.083371"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.336702" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:14.336312" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.336270" elapsed="0.000528"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:14.337390" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[C "N "o "d "e "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:14.336954" elapsed="0.000539"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.337810" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:14.337583" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.337562" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:14.337932" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:14.340902" elapsed="0.000182"/>
</kw>
<msg time="2026-04-10T00:57:14.341146" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:14.339668" elapsed="0.001616"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.341593" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.341929" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:14.338953" elapsed="0.003231"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:14.338303" elapsed="0.003950"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:14.213604" elapsed="0.128748"/>
</kw>
<msg time="2026-04-10T00:57:14.342451" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:14.342495" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:14.213012" elapsed="0.129522"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:14.342742" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:57:14.342632" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.342613" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.343248" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.343620" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:14.343694" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:14.212208" elapsed="0.131601"/>
</kw>
<msg time="2026-04-10T00:57:14.343911" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:14.343957" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:14.206728" elapsed="0.137267"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.344355" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:14.344074" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.344057" elapsed="0.000376"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:14.206517" elapsed="0.137942"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:14.350350" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:14.350241" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.350222" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:14.351585" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:14.351451" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.351433" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:14.352107" level="INFO">${karaf_connection_index} = 374</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:14.351803" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.352606" level="INFO">${current_connection_index} = 384</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:14.352338" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.394999" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:14.353139" elapsed="0.041960"/>
</kw>
<msg time="2026-04-10T00:57:14.395258" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:14.395324" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:14.352801" elapsed="0.042561"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.518115" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[C "N "o "d "e "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:14.395907" elapsed="0.122452"/>
</kw>
<msg time="2026-04-10T00:57:14.518607" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:14.518658" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:14.395536" elapsed="0.123243"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.519240" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:14.518907" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.518868" elapsed="0.000462"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:14.519914" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "L "e "a "d "e "r "[C "N "o "d "e "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:14.519476" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.520303" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:14.520082" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.520063" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:14.520421" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:14.523175" elapsed="0.000180"/>
</kw>
<msg time="2026-04-10T00:57:14.523416" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:14.522062" elapsed="0.001511"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.523884" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.524219" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:14.521387" elapsed="0.003019"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:14.520792" elapsed="0.003680"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:14.351149" elapsed="0.173438"/>
</kw>
<msg time="2026-04-10T00:57:14.524685" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:14.524729" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:14.350587" elapsed="0.174180"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:14.524954" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:57:14.524845" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.524827" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.525454" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.525820" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:14.525894" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:14.349882" elapsed="0.176123"/>
</kw>
<msg time="2026-04-10T00:57:14.526103" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:14.526147" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:14.344775" elapsed="0.181411"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.526513" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:14.526264" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.526247" elapsed="0.000359"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:14.344624" elapsed="0.182006"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:14.051629" elapsed="0.475040"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:14.049250" elapsed="0.477485"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:57:14.044196" elapsed="0.482602"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:14.043750" elapsed="0.483138"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:57:14.040811" elapsed="0.486140"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:14.532257" elapsed="0.000165"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:14.532035" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.532018" elapsed="0.000465"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.534970" level="INFO">exit</msg>
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:14.532639" elapsed="0.002391"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.643587" level="INFO">*** Stopping 1 controllers
c0 
*** Stopping 2 links
..
*** Stopping 1 switches
s1 
*** Stopping 2 hosts
h1 h2 
*** Done
completed in 3.323 seconds
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:57:14.535194" elapsed="0.108501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:14.643914" elapsed="0.000199"/>
</kw>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="PASS" start="2026-04-10T00:57:14.531757" elapsed="0.112421"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:14.646870" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:14.646539" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:14.646515" elapsed="0.000441"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.647295" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:14.647114" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:14.647990" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:14.647605" elapsed="0.000431"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.648592" level="INFO">${conn_id} = 385</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:14.648196" elapsed="0.000424"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:14.649532" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:14.649628" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:14.649232" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:14.649812" elapsed="0.000322"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:14.651001" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:15.241058" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:57:14 UTC 2026

  System load:  0.0                Processes:             112
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:11 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:14.650685" elapsed="0.590578"/>
</kw>
<msg time="2026-04-10T00:57:15.241382" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:14.650304" elapsed="0.591194"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:14.648838" elapsed="0.592880"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:15.242449" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:57:16.438520" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:57:16.438941" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:16.439070" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:15.242095" elapsed="1.197193"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:16.439820" elapsed="0.000533"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:16.441578" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:16.440842" elapsed="0.000875"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:16.442210" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:16.441902" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:16.441851" 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-04-10T00:57:16.442846" elapsed="0.000070"/>
</return>
<status status="PASS" start="2026-04-10T00:57:16.442582" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:16.442514" elapsed="0.000533"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:16.443125" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:16.449467" elapsed="0.000792"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:16.450734" elapsed="0.000278"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:16.451166" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:16.443879" elapsed="0.007438"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:14.645983" elapsed="1.805426"/>
</kw>
<msg time="2026-04-10T00:57:16.451465" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:14.645346" elapsed="1.806170"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:57:14.644839" elapsed="1.806775"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:16.453706" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:16.453413" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:16.453395" elapsed="0.000395"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:16.454081" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:16.453945" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:16.454816" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:16.454404" elapsed="0.000462"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:16.455409" level="INFO">${conn_id} = 387</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:16.455027" elapsed="0.000408"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:16.456342" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:16.456418" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:16.456069" elapsed="0.000373"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:16.456664" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:16.457856" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:16.814764" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:57:14 UTC 2026

  System load:  0.0                Processes:             112
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:15 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:16.457525" elapsed="0.357572"/>
</kw>
<msg time="2026-04-10T00:57:16.815269" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:16.457159" elapsed="0.358276"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:16.455670" elapsed="0.360036"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:16.816802" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:57:16.850309" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:57:16.850640" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:16.850752" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:16.816207" elapsed="0.034597"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:16.851204" elapsed="0.000558"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:16.852955" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:16.852260" 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-04-10T00:57:16.853635" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:16.853242" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:16.853187" elapsed="0.000622"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:16.854183" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-04-10T00:57:16.853933" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:16.853899" elapsed="0.000564"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:16.854584" elapsed="0.000039"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:16.859328" elapsed="0.000352"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:16.859853" elapsed="0.000183"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:16.860189" elapsed="0.000099"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:16.855346" elapsed="0.004994"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:16.452867" elapsed="0.407566"/>
</kw>
<msg time="2026-04-10T00:57:16.860488" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:16.452293" elapsed="0.408247"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:57:16.451793" elapsed="0.408850"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:14.644423" elapsed="2.216280"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="PASS" start="2026-04-10T00:57:14.040163" elapsed="2.820660"/>
</test>
<test id="s1-s3-t28" name="Delete All Flows From Leader Node" line="213">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:57:16.864221" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:57:16.863953" elapsed="0.000563"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:16.865648" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:16.865514" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:16.865495" elapsed="0.000383"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:16.870942" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:16.870833" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:16.870816" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:16.872022" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:16.871632" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:16.872516" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:16.872212" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:16.872603" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:16.872759" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:16.871238" elapsed="0.001546"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:16.880471" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:16.880361" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:16.880341" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:16.881869" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:16.881737" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:16.881708" elapsed="0.000231"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:16.882404" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:16.882088" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:16.882840" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:16.882611" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:16.918577" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:16.883375" elapsed="0.035426"/>
</kw>
<msg time="2026-04-10T00:57:16.919026" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:16.919075" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:16.883033" elapsed="0.036080"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:16.989983" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:16.919827" elapsed="0.070399"/>
</kw>
<msg time="2026-04-10T00:57:16.990450" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:16.990498" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:16.919355" elapsed="0.071182"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:16.991023" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:16.990694" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:16.990654" elapsed="0.000458"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:16.991667" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:16.991262" elapsed="0.000497"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:16.992219" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:16.991828" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:16.991809" elapsed="0.000488"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:16.992335" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:16.994266" elapsed="0.000812"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:16.995362" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:16.996122" elapsed="0.000356"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:16.993424" elapsed="0.003170"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:16.992764" elapsed="0.003895"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:16.881319" elapsed="0.115439"/>
</kw>
<msg time="2026-04-10T00:57:16.996856" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:16.996900" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:16.880714" elapsed="0.116224"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:16.997152" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:57:16.997016" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:16.996998" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:16.997696" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:16.998052" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:16.998126" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:16.880012" elapsed="0.118226"/>
</kw>
<msg time="2026-04-10T00:57:16.998337" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:16.998382" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:16.873175" elapsed="0.125245"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:16.998776" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:16.998499" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:16.998481" elapsed="0.000376"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:16.873030" elapsed="0.125851"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.004733" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.004621" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.004602" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.006008" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.005899" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.005882" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:17.006565" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.006239" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:17.006986" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:17.006760" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:17.041523" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:17.007537" elapsed="0.034145"/>
</kw>
<msg time="2026-04-10T00:57:17.041879" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:17.041928" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.007188" elapsed="0.034778"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:17.111377" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:17.042591" elapsed="0.069065"/>
</kw>
<msg time="2026-04-10T00:57:17.111840" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:17.111887" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.042171" elapsed="0.069754"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.112330" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.112034" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.111999" elapsed="0.000422"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.113122" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.112731" elapsed="0.000513"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.113603" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.113327" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.113306" elapsed="0.000387"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:17.113733" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:17.115404" elapsed="0.000863"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.116580" elapsed="0.000561"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:17.117443" elapsed="0.000420"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:17.114724" elapsed="0.003246"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:17.114065" elapsed="0.003971"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:17.005595" elapsed="0.112544"/>
</kw>
<msg time="2026-04-10T00:57:17.118238" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:17.118301" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.004960" elapsed="0.113388"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:17.118560" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:57:17.118432" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.118412" 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-04-10T00:57:17.119109" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.119481" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.119578" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:17.004249" elapsed="0.115468"/>
</kw>
<msg time="2026-04-10T00:57:17.119823" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:17.119872" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:16.999179" elapsed="0.120733"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.120249" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.119993" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.119974" elapsed="0.000378"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:16.999030" elapsed="0.121351"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.126384" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.126274" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.126255" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.127768" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.127658" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.127639" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:17.128324" level="INFO">${karaf_connection_index} = 374</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.128014" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:17.128842" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:17.128532" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:17.164251" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:17.129389" elapsed="0.035038"/>
</kw>
<msg time="2026-04-10T00:57:17.164652" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:17.164701" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.129045" elapsed="0.035730"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:17.240400" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:17.165461" elapsed="0.075138"/>
</kw>
<msg time="2026-04-10T00:57:17.240780" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:17.240828" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.164996" elapsed="0.075871"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.241240" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.240969" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.240939" elapsed="0.000386"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.241834" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "L "e "a "d "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.241473" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.242218" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.241996" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.241978" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:17.242335" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:17.243918" elapsed="0.000828"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.245034" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:17.245808" elapsed="0.000361"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:17.243252" elapsed="0.003017"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:17.242668" elapsed="0.003664"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:17.127303" elapsed="0.119129"/>
</kw>
<msg time="2026-04-10T00:57:17.246539" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:17.246610" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.126706" elapsed="0.119944"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:17.246853" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:57:17.246728" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.246709" elapsed="0.000230"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.247407" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.247802" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.247880" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:17.125921" elapsed="0.122073"/>
</kw>
<msg time="2026-04-10T00:57:17.248092" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:17.248136" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.120708" elapsed="0.127465"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.248503" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.248249" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.248232" elapsed="0.000391"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:17.120526" elapsed="0.128121"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:16.872844" elapsed="0.375840"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:16.870455" elapsed="0.378288"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:57:16.865147" elapsed="0.383655"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:16.864699" elapsed="0.384150"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:57:16.861841" elapsed="0.387062"/>
</kw>
<kw name="Delete Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Delete Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.260045" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.259733" elapsed="0.000339"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:17.260119" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:17.260268" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:17.259364" elapsed="0.000928"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.273650" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.273380" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.274095" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.273855" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.274537" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.274295" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.274993" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.274754" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:17.275859" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:57:17.275658" elapsed="0.000227"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:57:17.276210" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:57:17.276040" elapsed="0.000195"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.276385" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.277029" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.276783" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:57:17.277113" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:17.277266" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:57:17.275235" elapsed="0.002056"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:17.301725" level="INFO">POST Request : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Content-Length': '402', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:57:17.301833" level="INFO">POST Response : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:17.302063" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:17.279687" elapsed="0.022434"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.277409" elapsed="0.024814"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.302649" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.302282" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.277389" elapsed="0.025459"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.310668" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.305275" elapsed="0.005491"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.304789" elapsed="0.006055"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.304749" elapsed="0.006149"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.316888" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.311504" elapsed="0.005434"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.311020" elapsed="0.005953"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.310982" elapsed="0.006015"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.317595" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.317175" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.317937" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.317694" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.318480" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.318181" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.318018" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.317676" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.319098" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.318740" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.319424" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.319193" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.320110" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.319803" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.319504" elapsed="0.000670"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.319176" elapsed="0.001019"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:17.320350" elapsed="0.000388"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:17.321207" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.320909" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.321389" elapsed="0.002398"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:17.303728" elapsed="0.020126"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.324047" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.323937" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.323918" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:17.326700" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:17.324263" elapsed="0.002521"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:17.326835" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:57:17.327004" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:17.270705" elapsed="0.056324"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:17.327096" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:17.327249" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.268120" elapsed="0.059154"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:17.327326" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:57:17.327473" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.258856" elapsed="0.068641"/>
</kw>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Delete Bulk Flow in member 3 according to ${json_body_del}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.254274" elapsed="0.073306"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.334610" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.334294" elapsed="0.000344"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:17.334684" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:17.334833" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:17.333944" elapsed="0.000913"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.341456" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.341202" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.341917" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.341674" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:17.348911" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:17.348970" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:17 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782637,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:17.349069" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:17.344076" elapsed="0.005019"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.342026" elapsed="0.007112"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.349320" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.349165" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.342008" elapsed="0.007398"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.352840" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782637,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.350424" elapsed="0.002485"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.350200" elapsed="0.002760"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.350182" elapsed="0.002814"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.356944" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.353404" elapsed="0.003607"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.353077" elapsed="0.003985"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.353053" elapsed="0.004045"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.357916" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.357340" elapsed="0.000615"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.358471" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.358118" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.359311" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.358861" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.358617" elapsed="0.000786"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.358090" elapsed="0.001345"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.360317" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.359694" elapsed="0.000663"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.360834" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.360462" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.361650" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.361192" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.360955" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.360436" elapsed="0.001337"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:17.361998" elapsed="0.000503"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:17.363166" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.362769" elapsed="0.000435"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.363430" elapsed="0.003013"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:17.349777" elapsed="0.016729"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:17.366699" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:57:17.366591" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.366572" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.366934" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.367006" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:57:17.369309" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782637,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:17.335193" elapsed="0.034144"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:17.369389" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:17.369537" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782637,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.333465" elapsed="0.036114"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.370563" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782637, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.370142" elapsed="0.000451"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:17.370642" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:17.370796" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782637, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:17.369801" elapsed="0.001021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:17.371183" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.371004" elapsed="0.000204"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.371701" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:17.371385" elapsed="0.000342"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.372161" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:17.371900" elapsed="0.000286"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.372416" elapsed="0.000348"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:57:17.328848" elapsed="0.043977"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:17.328218" elapsed="0.044655"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 3.</doc>
<status status="PASS" start="2026-04-10T00:57:17.327816" elapsed="0.045115"/>
</kw>
<arg>${temp_json_config_del}</arg>
<arg>${Inventory_Leader}</arg>
<arg>${operation_timeout}</arg>
<doc>Delete Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:57:17.253779" elapsed="0.119206"/>
</kw>
<doc>1000 Flows deleted via Leader Node and verify it gets applied in all instances.</doc>
<status status="PASS" start="2026-04-10T00:57:16.861209" elapsed="0.511897"/>
</test>
<test id="s1-s3-t29" name="Verify No Flows In Cluster After Leader Restart" line="220">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:57:17.376482" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:57:17.376187" elapsed="0.000575"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.377748" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.377640" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.377622" elapsed="0.000194"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.382876" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.382766" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.382747" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.383945" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:17.383565" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.384462" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:17.384133" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:17.384532" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:57:17.384704" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.383170" elapsed="0.001559"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.390391" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.390281" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.390261" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.391687" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.391578" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.391529" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:17.392224" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.391900" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:17.392670" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:17.392425" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:17.428632" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:17.393194" elapsed="0.035571"/>
</kw>
<msg time="2026-04-10T00:57:17.428937" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:17.428985" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.392857" elapsed="0.036165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:17.508136" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:17.429577" elapsed="0.078710"/>
</kw>
<msg time="2026-04-10T00:57:17.508525" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:17.508604" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.429201" elapsed="0.079444"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.508988" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.508738" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.508712" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.509535" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.509218" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.509946" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.509727" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.509709" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:17.510057" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:17.511538" 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-04-10T00:57:17.512666" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:17.513404" elapsed="0.000373"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:17.510913" elapsed="0.002964"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:17.510352" elapsed="0.003590"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:17.391246" elapsed="0.122793"/>
</kw>
<msg time="2026-04-10T00:57:17.514136" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:17.514180" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.390633" elapsed="0.123586"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:17.514405" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:57:17.514298" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.514280" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.514918" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.515264" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.515336" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:17.389926" elapsed="0.125522"/>
</kw>
<msg time="2026-04-10T00:57:17.515555" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:17.515604" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.385108" elapsed="0.130533"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.516005" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.515719" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.515702" elapsed="0.000381"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:17.384963" elapsed="0.131144"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.521971" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.521862" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.521843" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.523229" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.523120" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.523102" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:17.523775" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.523445" elapsed="0.000357"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:17.524202" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:17.523978" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:17.557893" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:17.524745" elapsed="0.033289"/>
</kw>
<msg time="2026-04-10T00:57:17.558219" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:17.558268" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.524389" elapsed="0.033917"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:17.615962" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:17.558935" elapsed="0.057170"/>
</kw>
<msg time="2026-04-10T00:57:17.616268" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:17.616313" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.558515" elapsed="0.057836"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.616711" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.616444" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.616418" elapsed="0.000376"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.617252" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.616944" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.617651" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.617414" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.617396" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:17.617765" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:17.619289" 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-04-10T00:57:17.620391" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:17.621147" 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-04-10T00:57:17.618649" elapsed="0.002977"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:17.618073" elapsed="0.003619"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:17.522775" elapsed="0.099020"/>
</kw>
<msg time="2026-04-10T00:57:17.621891" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:17.621937" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.522195" elapsed="0.099781"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:17.622162" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:57:17.622054" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.622036" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.622685" elapsed="0.000094"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.623101" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.623174" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:17.521434" elapsed="0.101852"/>
</kw>
<msg time="2026-04-10T00:57:17.623383" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:17.623427" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.516388" elapsed="0.107077"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.623893" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.623556" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.623524" elapsed="0.000491"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:17.516243" elapsed="0.107805"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.632134" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.631983" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.631956" elapsed="0.000275"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.633867" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.633719" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.633694" elapsed="0.000274"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:17.634610" level="INFO">${karaf_connection_index} = 374</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.634170" elapsed="0.000479"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:17.635179" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:17.634872" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:17.670941" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:17.635957" elapsed="0.035119"/>
</kw>
<msg time="2026-04-10T00:57:17.671268" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:17.671315" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.635438" elapsed="0.035913"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:17.755276" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:17.671987" elapsed="0.083505"/>
</kw>
<msg time="2026-04-10T00:57:17.755699" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:17.755746" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.671597" elapsed="0.084187"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.756188" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.755898" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.755861" elapsed="0.000413"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.756784" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "L "e "a "d "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.756421" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.757166" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.756948" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.756930" elapsed="0.000387"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:17.757354" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:17.758954" elapsed="0.000824"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.760061" elapsed="0.000472"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:17.760884" elapsed="0.000392"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:17.758282" elapsed="0.003108"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:17.757702" elapsed="0.003753"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:17.633270" elapsed="0.128305"/>
</kw>
<msg time="2026-04-10T00:57:17.761675" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:17.761721" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.632444" elapsed="0.129315"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:17.761946" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:57:17.761839" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.761821" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.762437" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.762797" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.762870" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:17.631437" elapsed="0.131544"/>
</kw>
<msg time="2026-04-10T00:57:17.763078" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:17.763123" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.624441" elapsed="0.138720"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.763517" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.763239" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.763221" elapsed="0.000391"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:17.624236" elapsed="0.139400"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:17.384786" elapsed="0.378887"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:17.382356" elapsed="0.381379"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:57:17.377338" elapsed="0.386457"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:17.376917" elapsed="0.386926"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:57:17.374031" elapsed="0.389871"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.775670" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:17.775250" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.776170" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:17.775862" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:17.776240" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:17.776395" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.774863" elapsed="0.001556"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.786736" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.786417" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:17.786809" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:17.786957" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:17.786071" elapsed="0.000911"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.800348" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.800098" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.800802" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.800563" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.801242" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.800999" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.801691" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.801437" elapsed="0.000297"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:17.802556" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:57:17.802339" elapsed="0.000246"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:57:17.802915" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:57:17.802741" elapsed="0.000200"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.803091" elapsed="0.000224"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.803742" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.803473" elapsed="0.000313"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:57:17.803828" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:17.803983" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:57:17.801934" elapsed="0.002073"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:17.815400" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:57:17.815449" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:17.815536" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:17.806275" elapsed="0.009307"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.804224" elapsed="0.011404"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.815809" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.815655" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.804060" elapsed="0.011836"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.819336" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.816929" elapsed="0.002452"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.816704" elapsed="0.002712"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.816687" elapsed="0.002753"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.822975" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.819735" elapsed="0.003305"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.819494" elapsed="0.003595"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.819478" elapsed="0.003643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.823949" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.823379" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.824415" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.824084" elapsed="0.000481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.825256" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.824836" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.824603" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.824059" elapsed="0.001311"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.826119" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.825612" elapsed="0.000544"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.826598" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.826251" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.827371" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.826935" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.826713" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.826227" elapsed="0.001259"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:17.827716" elapsed="0.000475"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:17.828837" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.828424" elapsed="0.000449"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.829091" elapsed="0.003206"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:17.816255" elapsed="0.016105"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.832536" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.832432" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.832413" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:17.835154" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:17.832766" elapsed="0.002414"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:17.835254" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:17.835409" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:17.797417" elapsed="0.038016"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:17.835498" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:57:17.835660" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.794838" elapsed="0.040846"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:17.835734" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:57:17.835875" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.785625" elapsed="0.050274"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.781176" elapsed="0.054783"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:17.776675" elapsed="0.059316"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.846098" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.845799" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:17.846170" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:17.846316" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:17.845441" elapsed="0.000899"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.861382" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.861130" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.861894" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.861648" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.862342" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.862096" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.862803" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.862558" elapsed="0.000288"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:17.863681" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:57:17.863475" elapsed="0.000234"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:57:17.864107" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:57:17.863925" elapsed="0.000208"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.864291" elapsed="0.000197"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.864946" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.864697" elapsed="0.000293"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:57:17.865032" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:17.865186" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:57:17.863046" elapsed="0.002165"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:17.876473" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:57:17.876520" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:17.876635" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:17.867359" elapsed="0.009303"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.865282" elapsed="0.011426"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.876890" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.876735" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.865264" elapsed="0.011819"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.885094" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.879414" elapsed="0.005777"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.878889" elapsed="0.006382"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.878848" elapsed="0.006478"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.889439" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.885986" elapsed="0.003499"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.885451" elapsed="0.004069"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.885414" elapsed="0.004145"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.890097" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.889725" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.890430" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.890195" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.890989" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.890688" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.890512" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.890177" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.891638" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.891259" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.891974" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.891733" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.892576" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.892260" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.892094" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.891716" elapsed="0.000946"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:17.892815" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:17.893615" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.893326" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.893798" elapsed="0.002366"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:17.877889" elapsed="0.018339"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.896405" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.896300" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.896282" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:17.899027" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:17.896631" elapsed="0.002423"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:17.899134" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:17.899292" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:17.858404" elapsed="0.040913"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:17.899382" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:57:17.899529" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.855856" elapsed="0.043714"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:17.899621" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:17.899768" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.845003" elapsed="0.054789"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.840589" elapsed="0.059262"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:17.836074" elapsed="0.063809"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.910054" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.909755" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:17.910126" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:17.910273" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:17.909391" elapsed="0.000906"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.923961" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.923707" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.924402" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.924165" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.924859" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.924616" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.925292" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.925056" elapsed="0.000278"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:17.926243" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:57:17.926051" elapsed="0.000218"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:57:17.926615" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:57:17.926424" elapsed="0.000217"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.926793" elapsed="0.000185"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.927405" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.927159" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:57:17.927490" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:17.927664" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:57:17.925532" elapsed="0.002158"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:17.937496" level="INFO">POST Request : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:57:17.937559" level="INFO">POST Response : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:17.937649" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:17.929823" elapsed="0.007851"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.927762" elapsed="0.009956"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.937898" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.937744" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.927744" elapsed="0.010244"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.941385" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.939007" elapsed="0.002422"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.938788" elapsed="0.002676"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.938770" elapsed="0.002719"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.944461" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.941785" elapsed="0.002746"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.941561" elapsed="0.003045"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.941527" elapsed="0.003116"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.945432" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.944893" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.945928" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.945594" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.946705" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.946264" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.946041" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.945566" elapsed="0.001256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.947593" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.947068" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.948065" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.947733" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.948836" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.948400" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.948178" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.947708" elapsed="0.001243"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:17.949167" elapsed="0.000495"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:17.950343" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.949895" elapsed="0.000485"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.950623" elapsed="0.003553"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:17.938340" elapsed="0.015926"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:17.954515" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:17.954368" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.954343" elapsed="0.000294"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:17.957573" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:17.954845" elapsed="0.002757"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:17.957652" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:57:17.957814" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:17.920843" elapsed="0.036995"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:17.957906" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:17.958057" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.918270" elapsed="0.039811"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:17.958132" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:57:17.958277" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.908947" elapsed="0.049354"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.904500" elapsed="0.053864"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:17.899968" elapsed="0.058430"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:17.776519" elapsed="0.181914"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.969810" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.969490" elapsed="0.000347"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:17.969884" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:17.970032" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:17.969141" elapsed="0.000916"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.976694" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.976426" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.977144" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.976899" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:17.984467" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:17.984523" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:17 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782637,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:17.984637" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:17.979364" elapsed="0.005299"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.977253" elapsed="0.007452"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.984885" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.984732" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.977235" elapsed="0.007832"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.990188" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782637,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.986487" elapsed="0.003769"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.986177" elapsed="0.004127"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.986152" elapsed="0.004187"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.994127" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:17.990758" elapsed="0.003435"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.990419" elapsed="0.003823"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.990395" elapsed="0.003881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.995094" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.994507" elapsed="0.000779"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.995739" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.995386" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.996343" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.996041" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.995856" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.995361" elapsed="0.001067"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.996969" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.996604" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:17.997296" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:17.997066" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:17.997847" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:17.997535" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:17.997377" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:17.997048" elapsed="0.000882"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:17.998081" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:17.998875" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:17.998605" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:17.999079" elapsed="0.002356"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:17.985579" elapsed="0.015920"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:18.001690" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:57:18.001584" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:18.001564" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:18.001928" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:18.002000" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:57:18.004300" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782637,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:17.970393" elapsed="0.033936"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:18.004380" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:18.004529" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782637,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.968694" elapsed="0.035878"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:18.005524" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782637, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:18.005131" elapsed="0.000474"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:18.005658" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:18.005817" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782637, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:18.004792" elapsed="0.001051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:18.006203" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:18.006021" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:18.006726" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:18.006404" elapsed="0.000348"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:18.007221" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:18.006954" elapsed="0.000293"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:57:18.007796" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:57:18.007420" elapsed="0.000452">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:57:17.964181" elapsed="0.043808">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:19.018638" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:19.018226" elapsed="0.000447"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:19.018735" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:57:19.018914" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:19.017788" elapsed="0.001151"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:19.025671" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:19.025393" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:19.026125" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:19.025876" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:19.033068" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:19.033129" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782639,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:19.033226" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:19.028320" elapsed="0.004932"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:19.026243" elapsed="0.007053"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:19.033480" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:19.033324" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:19.026222" elapsed="0.007367"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:19.037147" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782639,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:19.034624" elapsed="0.002573"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:19.034381" elapsed="0.002851"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:19.034363" elapsed="0.002893"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:19.039920" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:19.037534" elapsed="0.002433"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:19.037311" elapsed="0.002690"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:19.037294" elapsed="0.002733"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:19.040621" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:19.040208" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:19.040976" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:19.040718" elapsed="0.000376"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:19.041615" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:19.041289" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:19.041120" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:19.040700" elapsed="0.001001"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:19.042230" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:19.041864" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:19.042581" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:19.042328" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:19.043137" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:19.042834" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:19.042671" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:19.042310" elapsed="0.000912"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:19.043377" elapsed="0.000385"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:19.044223" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:19.043932" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:19.044406" elapsed="0.002595"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:19.033955" elapsed="0.013112"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:19.047245" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:57:19.047138" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:19.047120" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:19.047484" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:19.047570" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:57:19.049915" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782639,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:19.019291" elapsed="0.030653"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:19.049995" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:19.050146" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782639,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:19.017038" elapsed="0.033133"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:19.051147" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782639, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:19.050750" elapsed="0.000426"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:19.051225" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:19.051378" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782639, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:19.050390" elapsed="0.001015"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:19.051778" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:19.051597" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:19.052277" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:19.051978" elapsed="0.000325"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:19.052751" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:19.052472" elapsed="0.000304"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:57:19.053314" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:57:19.052965" elapsed="0.000420">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:57:19.008959" elapsed="0.044575">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:20.062322" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:20.061845" elapsed="0.000520"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:20.062439" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:57:20.062674" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:20.061356" elapsed="0.001352"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:20.070456" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:20.070179" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:20.070939" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:20.070692" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:20.077501" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:20.077582" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782640,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:20.077686" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:20.073196" elapsed="0.004517"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:20.071107" elapsed="0.006651"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:20.077948" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:20.077788" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:20.071081" elapsed="0.006960"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:20.081670" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782640,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:20.079126" elapsed="0.002594"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:20.078881" elapsed="0.002874"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:20.078863" elapsed="0.002918"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:20.084749" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:20.082060" elapsed="0.002755"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:20.081838" elapsed="0.003024"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:20.081821" elapsed="0.003075"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:20.085733" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:20.085150" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:20.086199" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:20.085868" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:20.087016" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:20.086565" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:20.086313" elapsed="0.000791"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:20.085843" elapsed="0.001290"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:20.087886" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:20.087359" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:20.088344" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:20.088021" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:20.089113" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:20.088705" elapsed="0.000446"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:20.088454" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:20.087996" elapsed="0.001309"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:20.089530" elapsed="0.000523"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:20.090814" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:20.090335" elapsed="0.000517"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:20.091103" elapsed="0.003581"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:20.078428" elapsed="0.016354"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:20.095131" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-04-10T00:57:20.094887" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:20.094860" elapsed="0.000424"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:20.095505" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:20.095633" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:57:20.098104" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782640,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:20.063204" elapsed="0.034930"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:20.098190" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:20.098346" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782640,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:20.060735" elapsed="0.037637"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:20.099503" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782640, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:20.099068" elapsed="0.000464"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:20.099598" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:20.099754" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782640, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:20.098638" elapsed="0.001142"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:20.100145" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:20.099963" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:20.100673" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:20.100350" elapsed="0.000349"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:20.101132" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:20.100871" elapsed="0.000286"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:57:20.101695" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:57:20.101328" elapsed="0.000441">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:57:20.054277" elapsed="0.047607">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:21.115149" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:21.114627" elapsed="0.000569"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:21.115278" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T00:57:21.115518" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:21.114053" elapsed="0.001523"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:21.124617" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:21.124245" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:21.125093" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:21.124848" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:21.133445" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:21.133524" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:21 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782641,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:21.133675" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:21.127879" elapsed="0.005829"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:21.125222" elapsed="0.008544"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:21.134020" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:21.133806" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:21.125197" elapsed="0.008936"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:21.139208" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782641,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:21.135576" elapsed="0.003695"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:21.135257" elapsed="0.004058"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:21.135233" elapsed="0.004113"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:21.142958" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:21.139730" elapsed="0.003286"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:21.139418" elapsed="0.003642"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:21.139396" elapsed="0.003694"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:21.143839" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:21.143326" elapsed="0.000547"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:21.144269" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:21.143962" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:21.144999" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:21.144619" elapsed="0.000413"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:21.144374" elapsed="0.000703"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:21.143940" elapsed="0.001164"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:21.145811" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:21.145336" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:21.146234" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:21.145932" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:21.146936" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:21.146565" elapsed="0.000404"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:21.146336" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:21.145910" elapsed="0.001130"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:21.147242" elapsed="0.000514"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:21.148348" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:21.147976" elapsed="0.000405"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:21.148603" elapsed="0.003229"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:21.134688" elapsed="0.017228"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:21.152143" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-10T00:57:21.152008" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:21.151985" 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-04-10T00:57:21.152467" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:21.152641" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:57:21.155783" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782641,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:21.116083" elapsed="0.039736"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:21.155886" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:57:21.156076" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782641,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:21.113178" elapsed="0.042931"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:21.157424" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782641, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:21.156887" elapsed="0.000574"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:21.157522" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:57:21.157740" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782641, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:21.156415" elapsed="0.001358"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:21.158235" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:21.158011" elapsed="0.000257"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:21.158890" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:21.158499" elapsed="0.000425"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:21.159473" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:21.159150" elapsed="0.000354"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:57:21.160186" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:57:21.159751" elapsed="0.000525">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:57:21.103071" elapsed="0.057352">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.173955" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:22.173536" elapsed="0.000452"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:22.174052" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:57:22.174236" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:22.173170" elapsed="0.001091"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.180962" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:22.180698" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.181416" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:22.181168" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:22.189150" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:22.189210" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:22 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:22 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782642,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:22.189305" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:22.183722" elapsed="0.005610"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:22.181538" elapsed="0.007838"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:22.189580" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:22.189404" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.181515" elapsed="0.008235"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.193443" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782642,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:22.190888" elapsed="0.002606"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:22.190614" elapsed="0.002916"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.190589" elapsed="0.002982"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.196653" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:22.193856" elapsed="0.002868"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:22.193630" elapsed="0.003145"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.193613" elapsed="0.003197"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.197657" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:22.197066" elapsed="0.000630"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:22.198138" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:22.197798" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.198931" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:22.198482" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:22.198254" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.197771" elapsed="0.001278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.199833" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:22.199277" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:22.200310" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:22.199972" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.201095" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:22.200675" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:22.200425" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.199946" elapsed="0.001270"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:22.201431" elapsed="0.000516"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:22.202607" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:22.202186" elapsed="0.000459"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:22.202867" elapsed="0.003312"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:22.190132" elapsed="0.016137"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:22.206517" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-04-10T00:57:22.206369" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.206343" elapsed="0.000321"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:22.206875" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:22.206975" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:57:22.210170" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782642,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:22.174638" elapsed="0.035573"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:22.210285" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:57:22.210496" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782642,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:22.172676" elapsed="0.037856"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.211941" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782642, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:22.211348" elapsed="0.000632"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:22.212108" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:57:22.212345" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782642, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:22.210865" elapsed="0.001519"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:22.212934" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:22.212669" elapsed="0.000303"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.213699" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:22.213234" elapsed="0.000503"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.214382" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:22.213997" elapsed="0.000423"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:57:22.214696" elapsed="0.000472"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:57:22.161646" elapsed="0.053612"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:17.963596" elapsed="4.251739"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.963175" elapsed="4.252252"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:17.958645" elapsed="4.256832"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.238926" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:22.238567" elapsed="0.000392"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:22.239021" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:57:22.239195" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:22.238178" elapsed="0.001043"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.246205" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:22.245896" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.246750" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:22.246479" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:22.256341" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:22.256449" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:22 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:22 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782642,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:22.256650" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:22.249165" elapsed="0.007518"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:22.246879" elapsed="0.009867"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:22.257029" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:22.256786" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.246855" elapsed="0.010271"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.261266" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782642,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:22.258475" elapsed="0.002847"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:22.258196" elapsed="0.003166"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.258172" elapsed="0.003216"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.264134" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:22.261703" elapsed="0.002481"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:22.261447" elapsed="0.002774"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.261429" elapsed="0.002817"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.265030" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:22.264457" elapsed="0.000602"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:22.265383" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:22.265135" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.265967" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:22.265652" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:22.265465" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.265114" elapsed="0.000938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.266605" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:22.266219" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:22.266938" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:22.266704" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.267488" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:22.267185" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:22.267021" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.266686" elapsed="0.000904"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:22.267777" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:22.268615" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:22.268305" elapsed="0.000337"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:22.268799" elapsed="0.002697"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:22.257643" elapsed="0.013942"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:22.271830" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:57:22.271669" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.271647" elapsed="0.000282"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:22.272092" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:22.272165" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:57:22.274496" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782642,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:22.239584" elapsed="0.034944"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:22.274599" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:22.274756" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782642,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:22.237620" elapsed="0.037162"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.276330" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782642, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:22.275473" elapsed="0.000894"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:22.276422" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:57:22.276610" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782642, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:22.275037" elapsed="0.001600"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:22.277027" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:22.276837" elapsed="0.000216"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.277572" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:22.277239" elapsed="0.000361"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.278131" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:22.277777" elapsed="0.000382"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:57:22.278335" elapsed="0.000339"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:57:22.229863" elapsed="0.048875"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:22.228391" elapsed="0.050399"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:22.227113" elapsed="0.051739"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:22.215636" elapsed="0.063251"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.290627" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:22.290260" elapsed="0.000401"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:22.290721" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:57:22.290893" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:22.289887" elapsed="0.001032"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.298067" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:22.297724" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.298539" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:22.298292" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:22.306691" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:22.306772" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:22 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:22 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782642,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:22.306900" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:22.300822" elapsed="0.006107"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:22.298688" elapsed="0.008299"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:22.307235" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:22.307023" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.298664" elapsed="0.008660"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.311141" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782642,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:22.308557" elapsed="0.002635"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:22.308295" elapsed="0.002933"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.308274" elapsed="0.002978"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.315093" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:22.311532" elapsed="0.003637"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:22.311309" elapsed="0.003912"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.311292" elapsed="0.003967"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.316167" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:22.315535" elapsed="0.000676"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:22.316693" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:22.316316" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.317513" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:22.317061" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:22.316818" elapsed="0.000810"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.316289" elapsed="0.001371"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.318431" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:22.317898" elapsed="0.000678"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:22.319042" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:22.318686" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.319900" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:22.319407" elapsed="0.000533"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:22.319162" elapsed="0.000831"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.318659" elapsed="0.001366"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:22.320259" elapsed="0.000542"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:22.321471" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:22.321052" elapsed="0.000458"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:22.321764" elapsed="0.003238"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:22.307796" elapsed="0.017276"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:22.325255" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:57:22.325145" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:22.325127" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:22.325500" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:22.325588" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:57:22.327885" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782642,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:22.291273" elapsed="0.036641"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:22.327968" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:22.328120" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782642,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:22.289240" elapsed="0.038906"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.329158" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782642, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:22.328763" elapsed="0.000423"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:22.329235" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:22.329390" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782642, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:22.328389" elapsed="0.001027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:22.329792" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:22.329611" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.330302" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:22.329995" elapsed="0.000334"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.330792" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:22.330505" elapsed="0.000313"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:57:22.331351" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:57:22.330995" elapsed="0.000429">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:57:22.284749" elapsed="0.046787">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.340921" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:23.340406" elapsed="0.000559"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:23.341138" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T00:57:23.341388" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:23.339894" elapsed="0.001530"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.349885" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.349612" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.350369" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.350096" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:23.357671" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:23.357732" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:23 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:23 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782643,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:23.357833" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:23.352777" elapsed="0.005083"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.350489" elapsed="0.007420"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.358098" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.357938" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.350468" elapsed="0.007719"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.361816" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782643,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.359313" elapsed="0.002553"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.359083" elapsed="0.002819"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.359064" elapsed="0.002864"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.364648" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.362216" elapsed="0.002480"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.361985" elapsed="0.002747"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.361969" elapsed="0.002787"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.365338" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.364939" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.365693" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.365437" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.366282" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:23.365941" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.365776" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.365419" elapsed="0.000949"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.366920" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.366532" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.367272" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.367019" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.368046" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:23.367631" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.367385" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.367001" elapsed="0.001161"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:23.368382" elapsed="0.000510"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:23.369530" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.369128" elapsed="0.000459"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:23.369882" elapsed="0.003592"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:23.358632" elapsed="0.014957"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:23.373859" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T00:57:23.373697" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.373670" elapsed="0.000323"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.374219" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:23.374346" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:57:23.377805" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782643,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:23.341931" elapsed="0.035916"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:23.377925" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:57:23.378149" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782643,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:23.339195" elapsed="0.038992"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.379734" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782643, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.379296" elapsed="0.000467"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:23.379813" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:23.379969" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782643, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:23.378784" elapsed="0.001212"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:23.380357" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:23.380175" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.380878" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:23.380575" elapsed="0.000330"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.381343" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:23.381078" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:57:23.381540" elapsed="0.000326"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:57:23.332235" elapsed="0.049691"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:22.284116" elapsed="1.097862"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:22.283633" elapsed="1.098408"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:22.278988" elapsed="1.103088"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:17.958490" elapsed="5.423621"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.392961" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:23.392639" elapsed="0.000351"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:23.393038" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:57:23.393192" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:23.392271" elapsed="0.000947"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.400247" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.399946" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.400719" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.400458" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:23.407439" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:23.407606" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:23 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:23 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782643,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:23.407707" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:23.402927" elapsed="0.004807"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.400839" elapsed="0.006940"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.407963" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.407807" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.400818" elapsed="0.007233"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.411682" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782643,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.409107" elapsed="0.002644"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.408879" elapsed="0.002922"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.408862" elapsed="0.002973"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.415520" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.412227" elapsed="0.003380"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.411914" elapsed="0.003743"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.411890" elapsed="0.003802"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.416490" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.415943" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.416996" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.416656" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.417793" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:23.417341" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.417112" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.416630" elapsed="0.001282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.418698" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.418139" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.419163" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.418836" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.419929" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:23.419498" elapsed="0.000467"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.419275" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.418811" elapsed="0.001232"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:23.420268" elapsed="0.000511"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:23.421414" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.421014" elapsed="0.000437"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:23.421695" elapsed="0.002874"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:23.408431" elapsed="0.016213"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:23.424832" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:57:23.424720" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.424701" elapsed="0.000229"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.425085" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:23.425233" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:57:23.427571" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782643,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:23.393574" elapsed="0.034027"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:23.427655" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:23.427813" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782643,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:23.391807" elapsed="0.036032"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:57:23.427887" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:23.428033" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782643,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 1. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:57:23.387378" elapsed="0.040681"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.429109" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782643, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.428695" elapsed="0.000442"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:23.429185" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:23.429340" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782643, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:23.428305" elapsed="0.001062"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:23.429748" level="INFO">${value} = 0</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:23.429563" elapsed="0.000210"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.430259" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:57:23.429956" elapsed="0.000359"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 0.</doc>
<status status="PASS" start="2026-04-10T00:57:23.386926" elapsed="0.043450"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:23.382331" elapsed="0.048078"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.441625" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:23.441300" elapsed="0.000353"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:23.441700" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:23.441849" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:23.440940" elapsed="0.000934"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.448507" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.448255" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.448969" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.448727" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:23.456098" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:23.456158" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:23 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:23 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782643,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:23.456254" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:23.451146" elapsed="0.005134"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.449082" elapsed="0.007243"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.456509" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.456353" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.449063" elapsed="0.007616"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.460274" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782643,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.457724" elapsed="0.002599"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.457482" elapsed="0.002877"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.457463" elapsed="0.002921"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.463047" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.460680" elapsed="0.002414"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.460440" elapsed="0.002689"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.460423" elapsed="0.002730"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.463972" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.463394" elapsed="0.000615"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.464442" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.464110" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.465245" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:23.464814" elapsed="0.000468"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.464582" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.464084" elapsed="0.001278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.466144" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.465608" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.466634" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.466283" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.467392" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:23.466978" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.466750" elapsed="0.000727"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.466257" elapsed="0.001248"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:23.467745" elapsed="0.000483"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:23.468891" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.468465" elapsed="0.000462"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:23.469146" elapsed="0.003329"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:23.457047" elapsed="0.015544"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:23.472846" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-10T00:57:23.472695" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.472669" 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-04-10T00:57:23.473180" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:23.473280" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:57:23.476154" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782643,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:23.442251" elapsed="0.033932"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:23.476236" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:23.476390" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782643,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:23.440475" elapsed="0.035941"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:57:23.476462" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:57:23.476622" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782643,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:57:23.436023" elapsed="0.040625"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.477722" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782643, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.477301" elapsed="0.000450"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:23.477800" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:23.477958" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782643, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:23.476943" elapsed="0.001042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:23.478369" level="INFO">${value} = 0</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:23.478187" elapsed="0.000208"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.478876" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:57:23.478591" elapsed="0.000341"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 0.</doc>
<status status="PASS" start="2026-04-10T00:57:23.435572" elapsed="0.043420"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:23.430509" elapsed="0.048519"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.489683" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:23.489358" elapsed="0.000354"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:23.489761" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:57:23.489915" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:23.489005" elapsed="0.000935"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.496891" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.496633" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.497345" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.497097" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:23.504375" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:23.504439" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:23 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:23 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782643,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:23.504579" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:23.499570" elapsed="0.005039"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.497463" elapsed="0.007192"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.504848" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.504684" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.497443" elapsed="0.007492"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.509222" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782643,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.506003" elapsed="0.003293"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.505774" elapsed="0.003576"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.505755" elapsed="0.003667"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.513767" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.509911" elapsed="0.003926"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.509521" elapsed="0.004367"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.509496" elapsed="0.004428"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.514991" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.514229" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.515485" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.515135" elapsed="0.000540"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.516413" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:23.515964" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.515714" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.515109" elapsed="0.001427"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.517343" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.516801" elapsed="0.000781"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.518036" elapsed="0.000090"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.517689" elapsed="0.000499"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.519081" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:23.518643" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.518224" elapsed="0.000948"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.517662" elapsed="0.001535"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:23.519357" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:23.520222" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.519888" elapsed="0.000363"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:23.520587" elapsed="0.002609"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:23.505321" elapsed="0.017950"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:23.523657" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:57:23.523345" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.523326" elapsed="0.000427"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.523906" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:23.523976" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:57:23.526270" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782643,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:23.490394" elapsed="0.035905"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:23.526352" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:23.526504" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782643,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:23.488539" elapsed="0.037992"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:57:23.526594" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:23.526741" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782643,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 3. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:57:23.484145" elapsed="0.042622"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.527764" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782643, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:23.527351" elapsed="0.000442"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:23.527841" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:23.527995" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782643, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:23.526998" elapsed="0.001025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:23.528385" level="INFO">${value} = 0</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:23.528203" elapsed="0.000208"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.528893" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:57:23.528608" elapsed="0.000340"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 0.</doc>
<status status="PASS" start="2026-04-10T00:57:23.483706" elapsed="0.045355"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:23.479125" elapsed="0.049972"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:23.382168" elapsed="0.146964"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_del}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:57:17.772541" elapsed="5.756652"/>
</kw>
<doc>Verify flow count is 0 across cluster nodes.</doc>
<status status="PASS" start="2026-04-10T00:57:17.373490" elapsed="6.155827"/>
</test>
<test id="s1-s3-t30" name="Get Inventory Follower Before follower Restart" line="227">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:57:23.532946" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:57:23.532677" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:23.534271" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:23.534155" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.534136" elapsed="0.000205"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:23.539323" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:23.539217" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.539199" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.540396" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:23.540009" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.540911" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:23.540603" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:23.540979" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:57:23.541139" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:23.539634" elapsed="0.001529"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:23.546608" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:23.546484" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.546465" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:23.547858" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:23.547752" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.547734" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:23.548372" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:23.548072" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:23.548809" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:23.548581" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:23.586030" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:23.549334" elapsed="0.036908"/>
</kw>
<msg time="2026-04-10T00:57:23.586459" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:23.586510" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:23.548997" elapsed="0.037574"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:23.664125" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "f "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:23.587243" elapsed="0.077165"/>
</kw>
<msg time="2026-04-10T00:57:23.664669" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:23.664719" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:23.586815" elapsed="0.077942"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.665295" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.664966" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.664932" elapsed="0.000449"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.665979" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "f "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.665529" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.666367" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.666144" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.666126" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:23.666482" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:23.668060" elapsed="0.000825"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:23.669176" elapsed="0.000528"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:23.670087" elapsed="0.000369"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:23.667393" elapsed="0.003183"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:23.666824" elapsed="0.003820"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:23.547427" elapsed="0.123319"/>
</kw>
<msg time="2026-04-10T00:57:23.670843" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:23.670888" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:23.546829" elapsed="0.124096"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:23.671112" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:57:23.671003" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.670985" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.671625" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.671965" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:23.672036" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:23.546148" elapsed="0.126025"/>
</kw>
<msg time="2026-04-10T00:57:23.672276" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:23.672321" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:23.541555" elapsed="0.130805"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.672711" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.672437" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.672420" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:23.541395" elapsed="0.131416"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:23.678495" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:23.678384" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.678361" elapsed="0.000220"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:23.679889" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:23.679779" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.679762" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:23.680411" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:23.680104" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:23.680889" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:23.680662" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:23.718690" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:23.681421" elapsed="0.037399"/>
</kw>
<msg time="2026-04-10T00:57:23.718997" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:23.719044" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:23.681078" elapsed="0.038002"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:23.802929" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "f "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:23.719679" elapsed="0.083508"/>
</kw>
<msg time="2026-04-10T00:57:23.803427" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:23.803477" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:23.719281" elapsed="0.084234"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.804002" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.803664" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.803625" elapsed="0.000468"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.804636" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "f "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.804244" elapsed="0.000489"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.805026" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.804802" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.804784" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:23.805143" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:23.806999" elapsed="0.000875"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:23.808159" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:23.808923" elapsed="0.000361"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:23.806339" elapsed="0.003046"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:23.805476" elapsed="0.003974"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:23.679340" elapsed="0.130226"/>
</kw>
<msg time="2026-04-10T00:57:23.809662" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:23.810479" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:23.678736" elapsed="0.131785"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:23.810728" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:57:23.810617" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.810598" 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 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.811219" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.811578" elapsed="0.000080"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:23.811709" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:23.678023" elapsed="0.133798"/>
</kw>
<msg time="2026-04-10T00:57:23.811917" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:23.811961" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:23.673090" elapsed="0.138909"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.812329" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.812075" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.812058" elapsed="0.000349"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:23.672944" elapsed="0.139487"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:23.817941" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:23.817835" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.817815" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:23.819148" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:23.819042" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.819025" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:23.819689" level="INFO">${karaf_connection_index} = 374</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:23.819368" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:23.820093" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:23.819874" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:23.858648" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:23.820633" elapsed="0.038121"/>
</kw>
<msg time="2026-04-10T00:57:23.858915" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:23.858961" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:23.820278" elapsed="0.038719"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:23.945069" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "f "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:23.859513" elapsed="0.085894"/>
</kw>
<msg time="2026-04-10T00:57:23.945905" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:23.946017" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:23.859171" elapsed="0.086936"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.946524" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.946263" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.946237" elapsed="0.000392"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.947109" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "I "n "v "e "[78Cn "[A[78Ct
 "o "r "y "[C "F "o "l "l "o "w "e "r "[C "B "e "f "o "r "e "[C "f "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:23.946778" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.947484" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.947268" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.947250" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:23.947618" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:23.949175" elapsed="0.000803"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:23.950257" elapsed="0.000472"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:23.950998" elapsed="0.002255"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:23.948529" elapsed="0.004854"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:23.947914" elapsed="0.005552"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:23.818740" elapsed="0.134900"/>
</kw>
<msg time="2026-04-10T00:57:23.953752" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:23.953804" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:23.818163" elapsed="0.135684"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:23.954060" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:57:23.953938" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.953916" elapsed="0.000252"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.954651" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.955003" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:23.955077" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:23.817371" elapsed="0.137816"/>
</kw>
<msg time="2026-04-10T00:57:23.955284" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:23.955327" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:23.812726" elapsed="0.142638"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:23.955737" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:23.955439" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.955422" elapsed="0.000398"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:23.812580" elapsed="0.143269"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:23.541219" elapsed="0.414664"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:23.538855" elapsed="0.417090"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:57:23.533832" elapsed="0.422170"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:23.533372" elapsed="0.422674"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:57:23.530324" elapsed="0.425780"/>
</kw>
<kw name="Get InventoryConfig Shard Status" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.963591" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:23.963160" elapsed="0.000460"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.964094" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:23.963785" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:23.964167" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:23.964324" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:23.962787" elapsed="0.001562"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:57:23.964506" elapsed="0.000206"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.965287" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:23.964953" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.965753" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:23.965472" elapsed="0.000307"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.966164" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:23.965928" elapsed="0.000261"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:23.968806" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:23.968311" elapsed="0.000522"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:23.968881" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:23.969034" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:23.967968" elapsed="0.001090"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.047269" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.046871" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:57:24.048356" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:57:24.048063" elapsed="0.000371">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:57:24.048529" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:57:24.047668" elapsed="0.000903"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.049127" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:24.048742" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:57:24.049481" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:57:24.049664" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:57:24.049319" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.050098" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.049851" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.051121" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.050864" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.051629" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.051338" 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-04-10T00:57:24.051984" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.052191" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.052375" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:57:24.051847" elapsed="0.000586"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.051707" elapsed="0.000757"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:57:24.052511" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:57:24.052693" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:57:24.050520" elapsed="0.002198"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.050217" elapsed="0.002534"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.052928" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.052776" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.050196" elapsed="0.002810"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.053757" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.053206" elapsed="0.000580"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:57:24.053837" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:57:24.046175" elapsed="0.007831"/>
</kw>
<msg time="2026-04-10T00:57:24.054078" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:24.032475" elapsed="0.021744"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.068112" elapsed="0.000053"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.081805" elapsed="0.000052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.095455" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.095849" elapsed="0.000075"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.096161" elapsed="0.000074"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.096969" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.096740" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:57:24.096713" elapsed="0.000362"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.097337" elapsed="0.000052"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.097680" 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-04-10T00:57:24.097986" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:57:24.096647" elapsed="0.001422"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.096376" elapsed="0.001763"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.098456" elapsed="0.000073"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.098718" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:57:24.098897" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:57:24.021932" elapsed="0.076991"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:57:24.100953" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:57:24.100641" elapsed="0.000380">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:57:24.101169" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:57:24.099845" elapsed="0.001363"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.102652" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.101386" elapsed="0.001354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.103658" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.103079" elapsed="0.000626"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.102778" elapsed="0.000977"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.101337" elapsed="0.002453"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.106737" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:24.103992" elapsed="0.002786"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:57:24.106915" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:57:24.107144" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:57:24.099351" elapsed="0.007819"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:57:24.109206" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:57:24.108898" elapsed="0.000373">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:57:24.109442" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:57:24.108111" elapsed="0.001372"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:57:24.110057" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:57:24.109767" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.109747" elapsed="0.000494"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.110441" elapsed="0.000075"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.110779" elapsed="0.000074"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.110975" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:57:24.125410" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:57:24.107525" elapsed="0.017914"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.127940" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.127335" elapsed="0.000738"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.129028" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.128308" elapsed="0.000848"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:24.160985" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:24.161736" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:57:24.162372" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:24.132351" elapsed="0.030096"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.129280" elapsed="0.033310"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.164262" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.162672" elapsed="0.001738"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.129261" elapsed="0.035202"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.172032" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.168216" elapsed="0.004221"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.167750" elapsed="0.004767"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.167699" elapsed="0.004888"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.175535" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.173040" elapsed="0.002710"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.172703" elapsed="0.003110"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.172667" elapsed="0.003195"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.176881" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.176280" elapsed="0.000649"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.177408" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.177045" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.178112" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.177786" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.177558" elapsed="0.000642"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.177013" elapsed="0.001234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.179153" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.178624" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.179665" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.179330" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.180344" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.180019" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.179801" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.179289" elapsed="0.001193"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:24.180855" elapsed="0.000501"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:24.182182" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.181731" elapsed="0.000499"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.182603" elapsed="0.002639"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:24.165834" elapsed="0.019569"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.185830" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:24.185614" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.185592" elapsed="0.000408"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:24.197344" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:24.186205" elapsed="0.011191"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:24.197559" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T00:57:24.197847" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:24.125819" elapsed="0.072055"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:24.197944" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:24.198104" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:57:23.980980" elapsed="0.217150"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.198515" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.198222" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.198203" elapsed="0.000505"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:24.198744" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:57:23.974635" elapsed="0.224245"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:23.969129" elapsed="0.229798"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:23.969111" elapsed="0.229842"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:57:24.199646" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:57:24.199508" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.199770" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:24.199732" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.199490" elapsed="0.000341"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.199992" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:57:24.200115" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:57:24.199205" elapsed="0.000936"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.200772" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.200320" elapsed="0.000480"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.201473" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.200970" elapsed="0.000531"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.207288" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.207002" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.207790" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.207497" 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-04-10T00:57:24.220789" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:24.220961" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:24 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:24 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":196089,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":196089,"Leader":"member-2-shard-inventory-config","LastIndex":196090,"RaftState":"Follower","LastApplied":196090,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":196090,"LastLeadershipChangeTime":"2026-04-10 00:56:32.528","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"613.4 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":196090,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":730950},"timestamp":1775782644,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:24.221188" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:24.210052" elapsed="0.011203"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.207906" elapsed="0.013413"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.221599" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.221357" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.207888" elapsed="0.013835"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.228057" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":196089,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":196089,"Leader":"member-2-shard-inventory-config","LastIndex":196090,"RaftState":"Follower","LastApplied":196090,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":196090,"LastLeadershipChangeTime":"2026-04-10 00:56:32.528","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"613.4 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":196090,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":730950},"timestamp":1775782644,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.223609" elapsed="0.004756"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.223150" elapsed="0.005349"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.223122" elapsed="0.005417"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.233276" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.229152" elapsed="0.004324"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.228649" elapsed="0.004979"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.228622" elapsed="0.005046"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.234782" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.233916" elapsed="0.000905"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.236003" elapsed="0.000114"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.234973" elapsed="0.001311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.238174" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.237062" elapsed="0.001174"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.236346" elapsed="0.002047"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.234944" elapsed="0.003485"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.239570" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.238688" elapsed="0.000924"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.240743" elapsed="0.000109"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.239765" elapsed="0.001232"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.242727" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.241851" elapsed="0.000919"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.241036" elapsed="0.001839"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.239738" elapsed="0.003161"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:24.243062" elapsed="0.000748"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:24.244595" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.244030" elapsed="0.000593"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.244821" elapsed="0.002821"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:24.222463" elapsed="0.025274"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.247919" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:24.247809" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.247790" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:24.267146" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:24.248134" elapsed="0.019046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:24.267238" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:57:24.267419" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:24.202470" elapsed="0.064993"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:24.267606" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:57:24.267772" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:57:24.201763" elapsed="0.066037"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.269062" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782644, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.268520" elapsed="0.000580"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:24.269151" elapsed="0.000061"/>
</return>
<msg time="2026-04-10T00:57:24.269374" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782644, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:24.268106" elapsed="0.001296"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:24.269837" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 196090, 'CommittedTransactionsCount': 0, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerIni...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.269608" elapsed="0.000258"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:24.270261" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.270044" elapsed="0.000243"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:57:24.270337" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:24.270519" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:57:23.967348" elapsed="0.303514"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:57:24.270938" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:24.271129" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:57:23.966631" elapsed="0.304525"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.271471" elapsed="0.000246"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.271245" elapsed="0.000512"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.271969" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.271783" elapsed="0.000267"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.272228" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.272075" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.271226" elapsed="0.001076"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:23.966446" elapsed="0.305881"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.274798" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.274472" elapsed="0.000354"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:24.274872" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:24.275023" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:24.274124" elapsed="0.000929"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.356411" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.355998" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:57:24.357316" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:57:24.357003" elapsed="0.000397">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:57:24.357617" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:57:24.356656" elapsed="0.000988"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.358210" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:24.357818" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:57:24.358589" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:57:24.358769" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:57:24.358403" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.359212" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.358959" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.360280" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.360021" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.360818" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.360514" elapsed="0.000330"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.361232" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.361449" 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-04-10T00:57:24.361675" elapsed="0.000025"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:57:24.361049" elapsed="0.000690"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.360902" elapsed="0.000868"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:57:24.361821" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:57:24.361998" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:57:24.359689" elapsed="0.002334"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.359342" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.362230" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.362081" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.359317" elapsed="0.002991"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.362950" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.362469" elapsed="0.000509"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:57:24.363029" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:57:24.355248" elapsed="0.007949"/>
</kw>
<msg time="2026-04-10T00:57:24.363269" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:24.341231" elapsed="0.022180"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.377451" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.391720" elapsed="0.000055"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.405826" elapsed="0.000056"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.406209" elapsed="0.000080"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.406561" elapsed="0.000080"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.407384" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.407149" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:57:24.407119" elapsed="0.000385"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.407790" elapsed="0.000039"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.408104" 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-04-10T00:57:24.408408" elapsed="0.000042"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:57:24.407051" elapsed="0.001451"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.406787" elapsed="0.001808"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.408919" elapsed="0.000076"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.409213" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:57:24.409403" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:57:24.325884" elapsed="0.083553"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:57:24.411588" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:57:24.411241" elapsed="0.000421">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:57:24.411814" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:57:24.410371" elapsed="0.001483"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.413275" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.412005" elapsed="0.001360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.414256" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.413748" elapsed="0.000554"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.413404" elapsed="0.000947"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.411985" elapsed="0.002402"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.417724" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:24.414657" elapsed="0.003109"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:57:24.417900" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:57:24.418134" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:57:24.409865" elapsed="0.008295"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:57:24.420135" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:57:24.419826" elapsed="0.000375">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:57:24.420446" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:57:24.419020" elapsed="0.001470"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:57:24.421161" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-10T00:57:24.420797" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.420777" elapsed="0.000574"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.421582" elapsed="0.000078"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.421912" elapsed="0.000075"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.422111" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:57:24.436262" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:57:24.418539" elapsed="0.017752"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.439128" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.438509" elapsed="0.000752"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.440107" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.439501" elapsed="0.000736"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:24.461350" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:24.461870" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:57:24.462305" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:24.443706" elapsed="0.018650"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.440364" elapsed="0.022070"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.463788" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.462489" elapsed="0.001399"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.440344" elapsed="0.023583"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.469661" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.466527" elapsed="0.003507"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.466202" elapsed="0.003902"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.466167" elapsed="0.003988"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.473187" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.470580" elapsed="0.002656"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.470256" elapsed="0.003083"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.470225" elapsed="0.003171"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.474453" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.473889" elapsed="0.000611"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.474947" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.474632" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.475740" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.475304" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.475078" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.474598" elapsed="0.001276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.476749" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.476218" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.477235" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.476911" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.477898" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.477593" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.477364" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.476878" elapsed="0.001155"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:24.478378" elapsed="0.000463"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:24.479668" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.479194" elapsed="0.000521"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.480052" elapsed="0.002875"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:24.464858" elapsed="0.018162"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.483422" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:24.483206" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.483181" elapsed="0.000498"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:24.494341" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:24.483891" elapsed="0.010502"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:24.494557" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:57:24.494834" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:24.436905" elapsed="0.057957"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:24.494930" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:24.495087" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:57:24.283792" elapsed="0.211322"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.495504" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.495209" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.495190" elapsed="0.000557"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:24.495782" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:57:24.279460" elapsed="0.216453"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.275318" elapsed="0.220640"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.275117" elapsed="0.220866"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:57:24.496643" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:57:24.496517" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.496763" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:24.496725" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.496500" elapsed="0.000324"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.497000" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:57:24.497121" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:57:24.496223" elapsed="0.000923"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.497767" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.497334" elapsed="0.000460"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.498415" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.497951" elapsed="0.000492"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.504096" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.503817" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.504574" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.504298" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:24.518606" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:24.518717" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:24 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:24 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":2001,"SnapshotIndex":196089,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":196089,"Leader":"member-2-shard-inventory-config","LastIndex":196090,"RaftState":"Leader","LastApplied":196090,"LastCommittedTransactionTime":"2026-04-10 00:57:17.330","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":196090,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.106","active":true,"matchIndex":196090,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":196091},{"timeSinceLastActivity":"00:00:00.106","active":true,"matchIndex":196090,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":196091}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"2.524 ms","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":196090,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":4002,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":730950},"timestamp":1775782644,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:24.518874" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:24.506772" elapsed="0.012129"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.504686" elapsed="0.014262"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.519136" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.518979" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.504668" elapsed="0.014610"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.523673" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":2001,"SnapshotIndex":196089,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":196089,"Leader":"member-2-shard-inventory-config","LastIndex":196090,"RaftState":"Leader","LastApplied":196090,"LastCommittedTransactionTime":"2026-04-10 00:57:17.330","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":196090,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.106","active":true,"matchIndex":196090,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":196091},{"timeSinceLastActivity":"00:00:00.106","active":true,"matchIndex":196090,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":196091}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"2.524 ms","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":196090,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":4002,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":730950},"timestamp":1775782644,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.520644" elapsed="0.003177"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.520322" elapsed="0.003590"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.520303" elapsed="0.003637"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.527133" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.524310" elapsed="0.002959"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.524000" elapsed="0.003361"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.523982" elapsed="0.003406"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.528172" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.527588" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.528956" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.528304" elapsed="0.000833"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.530406" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.529670" elapsed="0.000779"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.529165" elapsed="0.001453"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.528285" elapsed="0.002360"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.531360" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.530812" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.532104" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.531491" elapsed="0.000789"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.533557" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.532802" elapsed="0.000799"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.532307" elapsed="0.001393"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.531471" elapsed="0.002253"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:24.533881" elapsed="0.000750"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:24.535383" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.534847" elapsed="0.000562"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.535625" elapsed="0.002718"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:24.519846" elapsed="0.018595"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.538781" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:24.538521" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.538501" elapsed="0.000353"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:24.555181" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:24.539009" elapsed="0.016205"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:24.555331" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:57:24.555510" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:24.499370" elapsed="0.056167"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:24.555615" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:24.555768" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:57:24.498678" elapsed="0.057116"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.556960" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782644, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.556449" elapsed="0.000540"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:24.557038" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:24.557215" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782644, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:24.556051" elapsed="0.001191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:24.557623" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 196090, 'CommittedTransactionsCount': 1, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.557400" elapsed="0.000251"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:24.558007" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.557808" elapsed="0.000225"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:57:24.558079" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:24.558233" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:57:24.273486" elapsed="0.284771"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:57:24.558316" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:57:24.558464" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:57:24.272730" elapsed="0.285758"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.559019" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.558797" elapsed="0.000280"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.559312" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.559100" elapsed="0.000439"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.559728" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.559579" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.558778" elapsed="0.001025"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:24.272538" elapsed="0.287288"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.562203" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.561903" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:24.562276" elapsed="0.000192"/>
</return>
<msg time="2026-04-10T00:57:24.562832" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:24.561556" elapsed="0.001302"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.647502" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.646948" elapsed="0.000614"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:57:24.648695" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:57:24.648330" elapsed="0.000485">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:57:24.648934" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:57:24.647886" elapsed="0.001080"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.649606" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:24.649187" elapsed="0.000447"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:57:24.649946" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:57:24.650111" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:57:24.649802" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.650560" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.650298" 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-04-10T00:57:24.651685" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.651400" elapsed="0.000331"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.652166" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.651895" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.652536" 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-04-10T00:57:24.652817" 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-04-10T00:57:24.653020" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:57:24.652396" elapsed="0.000701"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.652248" elapsed="0.000890"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:57:24.653202" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:57:24.653405" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:57:24.651063" elapsed="0.002375"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.650699" elapsed="0.002780"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.653714" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.653510" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.650672" elapsed="0.003140"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.654533" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.653993" elapsed="0.000593"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:57:24.654650" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:57:24.645862" elapsed="0.009018"/>
</kw>
<msg time="2026-04-10T00:57:24.654970" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:24.627919" elapsed="0.027234"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.675475" elapsed="0.000132"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.693936" elapsed="0.000110"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.707986" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.708388" elapsed="0.000076"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.708776" elapsed="0.000078"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.709665" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.709409" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:57:24.709377" elapsed="0.000400"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.710043" elapsed="0.000035"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.710349" elapsed="0.000034"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.710675" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:57:24.709301" elapsed="0.001458"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.709020" elapsed="0.001812"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.711148" elapsed="0.000075"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.711396" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:57:24.711632" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:57:24.614181" elapsed="0.097480"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:57:24.713802" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:57:24.713421" elapsed="0.000463">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:57:24.714033" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:57:24.712563" elapsed="0.001509"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.715628" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.714268" elapsed="0.001452"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.716612" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.716071" elapsed="0.000615"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.715759" elapsed="0.000982"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.714245" elapsed="0.002532"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.720100" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:24.716986" elapsed="0.003155"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:57:24.720277" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:57:24.720520" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:57:24.712054" elapsed="0.008506"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:57:24.722761" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:57:24.722302" elapsed="0.000531">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:57:24.722983" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:57:24.721501" elapsed="0.001521"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:57:24.723460" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:57:24.723169" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.723149" elapsed="0.000509"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.723859" elapsed="0.000075"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.724179" elapsed="0.000075"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.724373" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:57:24.738375" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:57:24.721029" elapsed="0.017375"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.741163" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.740533" elapsed="0.000765"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.742141" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.741536" elapsed="0.000737"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:24.777690" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:24.778289" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:57:24.778826" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:24.745881" elapsed="0.033026"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.742398" elapsed="0.036599"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.780482" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.779060" elapsed="0.001605"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.742378" elapsed="0.038339"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.788259" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.784212" elapsed="0.004671"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.783766" elapsed="0.005213"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.783718" elapsed="0.005343"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.792038" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.789518" elapsed="0.002567"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.789200" elapsed="0.002946"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.789158" elapsed="0.003049"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.793190" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.792622" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.793686" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.793351" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.794400" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.794062" elapsed="0.000366"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.793828" elapsed="0.000661"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.793319" elapsed="0.001217"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.795435" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.794920" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.795917" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.795609" elapsed="0.000390"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.796624" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.796266" elapsed="0.000386"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.796048" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.795576" elapsed="0.001184"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:24.797098" elapsed="0.000459"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:24.798349" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.797911" elapsed="0.000484"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.798781" elapsed="0.002483"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:24.781980" elapsed="0.019367"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.801814" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:24.801515" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.801494" elapsed="0.000485"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:24.812598" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:24.802179" elapsed="0.010468"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:24.812821" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T00:57:24.813140" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:24.739002" elapsed="0.074173"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:24.813257" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:57:24.813451" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:57:24.571369" elapsed="0.242116"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.813871" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.813605" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.813586" elapsed="0.000435"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:24.814055" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:57:24.567112" elapsed="0.247071"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.562928" elapsed="0.251299"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.562910" elapsed="0.251340"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:57:24.814950" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:57:24.814837" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.815108" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:24.815058" elapsed="0.000101"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.814814" elapsed="0.000373"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.815389" elapsed="0.000028"/>
</kw>
<msg time="2026-04-10T00:57:24.815630" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:57:24.814494" elapsed="0.001172"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.816368" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.815894" elapsed="0.000507"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.817226" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.816650" elapsed="0.000611"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.825031" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.824350" elapsed="0.000753"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.825657" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.825309" 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-04-10T00:57:24.840908" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:24.841082" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:24 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:24 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":196089,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":196089,"Leader":"member-2-shard-inventory-config","LastIndex":196090,"RaftState":"Follower","LastApplied":196090,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":196090,"PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","LastLeadershipChangeTime":"2026-04-10 00:56:49.389","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"2.751 ms","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":196090,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":656187},"timestamp":1775782644,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:24.841322" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:24.828698" elapsed="0.012661"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.825816" elapsed="0.015617"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.841786" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.841482" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.825785" elapsed="0.016117"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.847821" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":196089,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":196089,"Leader":"member-2-shard-inventory-config","LastIndex":196090,"RaftState":"Follower","LastApplied":196090,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":196090,"PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","LastLeadershipChangeTime":"2026-04-10 00:56:49.389","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"2.751 ms","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":196090,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":656187},"timestamp":1775782644,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.843703" elapsed="0.004397"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.843282" elapsed="0.004937"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.843256" elapsed="0.005003"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.852595" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.848828" elapsed="0.003950"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.848349" elapsed="0.004554"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.848322" elapsed="0.004624"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.854083" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.853254" elapsed="0.000864"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.855059" elapsed="0.000096"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.854258" elapsed="0.001024"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.856940" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.855939" elapsed="0.001058"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.855318" elapsed="0.001803"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.854229" elapsed="0.002923"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.858032" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.857329" elapsed="0.000731"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.858807" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.858175" elapsed="0.000818"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.860280" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:24.859506" elapsed="0.000818"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.859021" elapsed="0.001408"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.858153" elapsed="0.002299"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:24.860677" elapsed="0.000737"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:24.862240" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.861698" elapsed="0.000568"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.862465" elapsed="0.002854"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:24.842648" elapsed="0.022771"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.865742" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:24.865494" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.865475" elapsed="0.000339"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:24.882015" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:24.865965" elapsed="0.016083"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:24.882106" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:57:24.882284" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:24.818589" elapsed="0.063723"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:24.882441" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:24.882616" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:57:24.817534" elapsed="0.065109"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.883768" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782644, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:24.883294" elapsed="0.000503"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:24.883847" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:24.884020" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782644, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:24.882904" elapsed="0.001143"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:24.884414" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 196090, 'CommittedTransactionsCount': 0, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerIni...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.884207" elapsed="0.000234"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:24.884874" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.884668" elapsed="0.000232"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:57:24.884948" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:24.885102" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:57:24.560936" elapsed="0.324191"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:57:24.885185" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:57:24.885335" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:57:24.560169" elapsed="0.325191"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.885972" elapsed="0.000199"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:24.885447" elapsed="0.000763"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.886383" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.886234" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.886623" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.886462" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.885428" elapsed="0.001271"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:24.559998" elapsed="0.326726"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:23.966240" elapsed="0.920517"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:57:24.886801" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:24.887007" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:57:24.887054" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:57:23.962056" elapsed="0.925022"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.887538" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:57:24.887642" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:24.887259" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:24.887953" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:24.887736" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.887718" elapsed="0.000312"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.890561" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:57:24.888168" elapsed="0.002443"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:57:24.891013" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.890821" elapsed="0.000219"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:57:24.891087" elapsed="0.000029"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:57:23.959217" elapsed="0.932025"/>
</kw>
<msg time="2026-04-10T00:57:24.891348" level="INFO">${inv_conf_leader} = 2</msg>
<msg time="2026-04-10T00:57:24.891397" level="INFO">${inv_conf_followers_list} = [1, 3]</msg>
<var>${inv_conf_leader}</var>
<var>${inv_conf_followers_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Get_Leader_And_Followers_For_Shard</arg>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:23.958610" elapsed="0.932812"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.891929" level="INFO">config inventory Leader is 2 and followers are [1, 3]</msg>
<arg>config inventory Leader is ${inv_conf_leader} and followers are ${inv_conf_followers_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:24.891633" elapsed="0.000340"/>
</kw>
<return>
<value>${inv_conf_leader}</value>
<value>${inv_conf_followers_list}</value>
<status status="PASS" start="2026-04-10T00:57:24.892017" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:24.892222" level="INFO">${inventory_leader} = 2</msg>
<msg time="2026-04-10T00:57:24.892268" level="INFO">${inventory_followers} = [1, 3]</msg>
<var>${inventory_leader}</var>
<var>${inventory_followers}</var>
<doc>Check Status for Inventory Config shard in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:57:23.956338" elapsed="0.935954"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:57:24.892701" level="INFO">${Follower_Node_2} = 3</msg>
<var>${Follower_Node_2}</var>
<arg>${Inventory_Followers}</arg>
<arg>1</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.892495" elapsed="0.000232"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.893232" level="INFO">${Follower_Node_2} = 3</msg>
<arg>${Follower_Node_2}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:57:24.892919" elapsed="0.000355"/>
</kw>
<doc>Find follower in the inventory config shard</doc>
<status status="PASS" start="2026-04-10T00:57:23.529683" elapsed="1.363700"/>
</test>
<test id="s1-s3-t31" name="Start Mininet Connect To Follower Node2" line="233">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:57:24.896805" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:57:24.896514" elapsed="0.000558"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.898083" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:24.897971" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.897952" elapsed="0.000201"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.903195" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:24.903089" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.903070" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.904381" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:24.903993" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:24.904910" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:24.904606" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:24.904980" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:57:24.905138" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:24.903603" elapsed="0.001559"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.910920" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:24.910810" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.910791" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:24.912176" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:24.912069" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:24.912051" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:24.912743" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:24.912397" elapsed="0.000373"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:24.913154" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:24.912933" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:24.944967" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:24.913699" elapsed="0.031483"/>
</kw>
<msg time="2026-04-10T00:57:24.945416" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:24.945466" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:24.913340" elapsed="0.032165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:25.018640" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:24.946218" elapsed="0.072722"/>
</kw>
<msg time="2026-04-10T00:57:25.019197" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:25.019248" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:24.945781" elapsed="0.073507"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:25.019807" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:25.019418" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.019380" elapsed="0.000520"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:25.020569" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:25.020052" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:25.020989" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:25.020758" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.020738" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:25.021106" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:25.022726" elapsed="0.000796"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:25.023836" elapsed="0.000523"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:25.024714" 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-04-10T00:57:25.022048" elapsed="0.003151"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:25.021432" elapsed="0.003838"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:24.911766" elapsed="0.113612"/>
</kw>
<msg time="2026-04-10T00:57:25.025486" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:25.025533" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:24.911147" elapsed="0.114446"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:25.025814" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-10T00:57:25.025690" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.025665" elapsed="0.000254"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:25.026389" 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-04-10T00:57:25.026766" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:25.026843" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:24.910445" elapsed="0.116513"/>
</kw>
<msg time="2026-04-10T00:57:25.027058" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:25.027186" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:24.905537" elapsed="0.121689"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:25.027591" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:25.027306" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.027288" elapsed="0.000383"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:24.905392" elapsed="0.122303"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:25.034009" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:25.033881" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.033858" elapsed="0.000232"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:25.035372" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:25.035259" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.035241" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:25.035943" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:25.035621" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:25.036405" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:25.036136" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:25.078983" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:25.037171" elapsed="0.041984"/>
</kw>
<msg time="2026-04-10T00:57:25.079403" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:25.079468" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:25.036827" elapsed="0.042691"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:25.146041" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:25.080373" elapsed="0.066224"/>
</kw>
<msg time="2026-04-10T00:57:25.147145" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:25.147296" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:25.079823" elapsed="0.067595"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:25.148455" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:25.147764" elapsed="0.000836"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.147680" elapsed="0.000965"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:25.149433" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:25.148876" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:25.150000" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:25.149686" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.149660" elapsed="0.000449"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:25.150162" elapsed="0.000054"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:25.152398" elapsed="0.001114"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:25.153935" elapsed="0.000665"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:25.154973" elapsed="0.000504"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:25.151415" elapsed="0.004315"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:25.150618" elapsed="0.005205"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:25.034955" elapsed="0.121008"/>
</kw>
<msg time="2026-04-10T00:57:25.156099" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:25.156160" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:25.034289" elapsed="0.121967"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:25.156532" elapsed="0.000070"/>
</return>
<status status="PASS" start="2026-04-10T00:57:25.156375" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.156347" elapsed="0.000338"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:25.157264" elapsed="0.000039"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:25.157774" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:25.157877" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:25.033440" elapsed="0.124596"/>
</kw>
<msg time="2026-04-10T00:57:25.158184" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:25.158252" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:25.027988" elapsed="0.130318"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:25.158861" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:25.158419" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.158394" elapsed="0.000581"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:25.027836" elapsed="0.131173"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:25.166129" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:25.165990" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.165963" elapsed="0.000263"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:25.167529" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:25.167419" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.167402" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:25.168103" level="INFO">${karaf_connection_index} = 374</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:25.167782" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:25.168629" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:25.168362" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:25.202826" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:25.169171" elapsed="0.033919"/>
</kw>
<msg time="2026-04-10T00:57:25.203341" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:25.203389" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:25.168822" elapsed="0.034604"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:25.276640" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:25.204362" elapsed="0.072519"/>
</kw>
<msg time="2026-04-10T00:57:25.277090" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:25.277138" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:25.203765" elapsed="0.073498"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:25.277722" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:25.277384" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.277346" elapsed="0.000465"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:25.278346" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:25.277961" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:25.278744" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:25.278504" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.278487" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:25.278860" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:25.280623" elapsed="0.000837"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:25.281771" elapsed="0.000477"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:25.282535" 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-04-10T00:57:25.279869" elapsed="0.003166"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:25.279199" elapsed="0.003901"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:25.167114" elapsed="0.116088"/>
</kw>
<msg time="2026-04-10T00:57:25.283302" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:25.283348" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:25.166419" elapsed="0.116967"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:25.283595" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:57:25.283466" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.283447" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:25.284138" elapsed="0.000033"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:25.284506" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:25.284599" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:25.165558" elapsed="0.119183"/>
</kw>
<msg time="2026-04-10T00:57:25.284865" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:25.284911" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:25.159396" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:25.285283" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:25.285029" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.285011" elapsed="0.000350"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:25.159194" elapsed="0.126191"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:24.905218" elapsed="0.380201"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:24.902729" elapsed="0.382752"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:57:24.897677" elapsed="0.387878"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:24.897228" elapsed="0.388377"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:57:24.894341" elapsed="0.391360"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:25.289058" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:25.288832" elapsed="0.000273"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:25.291696" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:25.291409" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:25.291390" elapsed="0.000389"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:25.292105" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:25.291930" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:25.292839" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:25.292435" elapsed="0.000452"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:25.293411" 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-04-10T00:57:25.293044" elapsed="0.000393"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:25.294346" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:25.294423" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:25.294070" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:25.294621" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:25.295790" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:25.626686" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:57:14 UTC 2026

  System load:  0.0                Processes:             112
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:16 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:25.295461" elapsed="0.331379"/>
</kw>
<msg time="2026-04-10T00:57:25.626923" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:25.295108" elapsed="0.331897"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:25.293673" elapsed="0.333477"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:25.627658" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:57:26.776171" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:57:26.776719" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:26.776842" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:25.627398" elapsed="1.149507"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:26.777444" elapsed="0.000741"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:26.779462" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:26.778757" elapsed="0.000986"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:26.780324" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:26.779976" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:26.779908" elapsed="0.000586"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:26.780960" elapsed="0.000070"/>
</return>
<status status="PASS" start="2026-04-10T00:57:26.780653" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:26.780616" elapsed="0.000570"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:26.781315" elapsed="0.000035"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:26.787265" elapsed="0.000640"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:26.788190" elapsed="0.000271"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:26.788717" elapsed="0.000159"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:26.782193" elapsed="0.006764"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:25.290842" elapsed="1.498256"/>
</kw>
<msg time="2026-04-10T00:57:26.789195" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:25.290168" elapsed="1.499127"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:57:25.289682" elapsed="1.499744"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:26.792822" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:26.792355" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:26.792323" elapsed="0.000627"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:26.793450" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:26.793230" elapsed="0.000485"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:26.794929" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:26.794059" elapsed="0.000944"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:26.795825" 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-04-10T00:57:26.795260" elapsed="0.000602"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:26.797173" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:26.797299" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:26.796776" elapsed="0.000557"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:26.797584" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:26.799388" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:27.146493" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:57:14 UTC 2026

  System load:  0.0                Processes:             112
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:25 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:26.798915" elapsed="0.347835"/>
</kw>
<msg time="2026-04-10T00:57:27.146977" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:26.798287" elapsed="0.348794"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:26.796178" elapsed="0.351062"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:27.147827" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:57:27.191694" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:57:27.192113" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:27.192215" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:27.147512" elapsed="0.044770"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:27.192879" elapsed="0.000599"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:27.194761" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:27.193955" elapsed="0.000907"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:27.195365" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:27.195058" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:27.195007" elapsed="0.000525"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:27.195930" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-04-10T00:57:27.195688" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:27.195653" elapsed="0.000474"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:27.196205" elapsed="0.000033"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:27.203427" elapsed="0.000500"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:27.204132" elapsed="0.000190"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:27.204481" 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-04-10T00:57:27.196977" elapsed="0.007681"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:26.791502" elapsed="0.413255"/>
</kw>
<msg time="2026-04-10T00:57:27.204819" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:26.790603" elapsed="0.414281"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:57:26.789755" elapsed="0.415212"/>
</kw>
<arg>${mininet}</arg>
<status status="PASS" start="2026-04-10T00:57:25.289309" elapsed="1.915718"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:27.210962" level="INFO">${tools_connection} = 405</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:27.210336" elapsed="0.000669"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:27.213753" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:27.213870" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:27.213308" elapsed="0.000597"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:27.214175" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:27.215989" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:27.540012" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:57:14 UTC 2026

  System load:  0.0                Processes:             112
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:27 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:27.215492" elapsed="0.324678"/>
</kw>
<msg time="2026-04-10T00:57:27.540364" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:27.214961" elapsed="0.325483"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:27.212567" elapsed="0.328017"/>
</kw>
<msg time="2026-04-10T00:57:27.540638" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:27.211919" elapsed="0.328766"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:57:27.211320" elapsed="0.329443"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-10T00:57:27.540823" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:57:27.541032" level="INFO">${mininet_conn_id} = 405</msg>
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-10T00:57:27.209719" elapsed="0.331339"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:27.541771" level="INFO">${mininet_conn_id} = 405</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:57:27.541337" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:27.544158" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:27.541967" elapsed="0.002249"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:27.541945" elapsed="0.002297"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:27.544728" level="INFO">Start mininet --topo tree,1 to 10.30.171.151</msg>
<arg>Start mininet ${options} to ${controller}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:27.544404" elapsed="0.000372"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:27.547559" level="INFO">sudo mn --controller 'remote,ip=10.30.171.151,port=6633' --topo tree,1 --switch ovsk,protocols=OpenFlow13</msg>
<arg>sudo mn --controller 'remote,ip=${controller},port=${ofport}' ${options} --switch ovsk,protocols=OpenFlow${ofversion}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:27.544944" elapsed="0.002680"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:57:27.763006" level="INFO">[?2004l*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2 
*** Adding switches:
s1 
*** Adding links:
(s1, h1) (s1, h2) 
*** Configuring hosts
h1 h2 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:57:27.547791" elapsed="0.215423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:27.763949" level="INFO">Check OVS configuratiom</msg>
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:27.763591" elapsed="0.000405"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:27.765228" level="INFO">sh ovs-vsctl show</msg>
<arg>sh ovs-vsctl show</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:27.764171" elapsed="0.001113"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:57:27.773274" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Bridge s1
        Controller "ptcp:6654"
        Controller "tcp:10.30.171.151:6633"
        fail_mode: secure
        Port s1-eth1
            Interface s1-eth1
        Port s1-eth2
            Interface s1-eth2
        Port s1
            Interface s1
                type: internal
    ovs_version: "2.17.11"
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:57:27.765443" elapsed="0.007891"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="PASS" start="2026-04-10T00:57:27.773385" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:57:27.773649" level="INFO">${mininet_conn_id} = 405</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${Follower_Node_2}_IP}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="PASS" start="2026-04-10T00:57:25.286017" elapsed="2.487659"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:27.774215" level="INFO">${mininet_conn_id} = 405</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:57:27.773884" elapsed="0.000372"/>
</kw>
<doc>Start mininet with connection to Follower Node2.</doc>
<status status="PASS" start="2026-04-10T00:57:24.893780" elapsed="2.880601"/>
</test>
<test id="s1-s3-t32" name="Add Bulk Flow From Follower Node2" line="240">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:57:27.778035" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:57:27.777764" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:27.779409" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:27.779255" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:27.779233" elapsed="0.000247"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:27.784516" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:27.784407" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:27.784389" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:27.785639" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:27.785223" elapsed="0.000444"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:27.786302" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:27.785983" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:27.786375" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:57:27.786537" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:27.784843" elapsed="0.001737"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:27.794108" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:27.793989" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:27.793968" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:27.795387" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:27.795279" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:27.795261" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:27.795936" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:27.795629" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:27.796373" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:27.796123" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:27.835306" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:27.796918" elapsed="0.038672"/>
</kw>
<msg time="2026-04-10T00:57:27.835970" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:27.836073" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:27.796581" elapsed="0.039572"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:27.902199" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:27.837404" elapsed="0.065191"/>
</kw>
<msg time="2026-04-10T00:57:27.903007" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:27.903113" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:27.836592" elapsed="0.066604"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:27.904165" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:27.903404" elapsed="0.000939"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:27.903348" elapsed="0.001069"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:27.905900" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:27.904894" elapsed="0.001273"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:27.906809" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:27.906355" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:27.906304" elapsed="0.000632"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:27.906992" elapsed="0.000054"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:27.911123" elapsed="0.000258"/>
</kw>
<msg time="2026-04-10T00:57:27.911475" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:27.909313" elapsed="0.002381"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:27.912101" elapsed="0.000109"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:27.912714" elapsed="0.000109"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:27.908327" elapsed="0.004659"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:27.907442" elapsed="0.005639"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:27.794977" elapsed="0.118248"/>
</kw>
<msg time="2026-04-10T00:57:27.913365" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:27.913429" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:27.794340" elapsed="0.119279"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:27.913919" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:57:27.913755" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:27.913727" elapsed="0.000316"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:27.914588" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:27.914930" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:27.915002" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:27.793412" elapsed="0.121700"/>
</kw>
<msg time="2026-04-10T00:57:27.915210" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:27.915254" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:27.786961" elapsed="0.128330"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:27.915635" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:27.915369" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:27.915352" elapsed="0.000362"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:27.786814" elapsed="0.128923"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:27.921602" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:27.921407" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:27.921387" elapsed="0.000292"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:27.922836" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:27.922728" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:27.922710" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:27.923356" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:27.923052" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:27.923823" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:27.923562" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:27.960851" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:27.924386" elapsed="0.036582"/>
</kw>
<msg time="2026-04-10T00:57:27.961142" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:27.961190" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:27.924042" elapsed="0.037186"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:28.021469" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:27.961856" elapsed="0.059824"/>
</kw>
<msg time="2026-04-10T00:57:28.021909" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:28.022046" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:27.961416" elapsed="0.060686"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.022541" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:28.022220" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.022189" elapsed="0.000457"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.023135" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:28.022793" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.023518" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:28.023294" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.023276" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:28.023649" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:28.026236" elapsed="0.000170"/>
</kw>
<msg time="2026-04-10T00:57:28.026468" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:28.025125" elapsed="0.001488"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.026890" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.027223" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:28.024486" elapsed="0.002921"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:28.023938" elapsed="0.003534"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:27.922398" elapsed="0.105196"/>
</kw>
<msg time="2026-04-10T00:57:28.027691" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:28.027735" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:27.921835" elapsed="0.105938"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:28.027957" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:57:28.027850" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.027832" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.028439" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.028800" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:28.028873" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:27.921052" elapsed="0.107932"/>
</kw>
<msg time="2026-04-10T00:57:28.029079" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:28.029123" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:27.916014" elapsed="0.113146"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.029522" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:28.029235" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.029218" elapsed="0.000409"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:27.915871" elapsed="0.113780"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:28.035388" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:28.035279" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.035260" elapsed="0.000230"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:28.036652" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:28.036521" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.036504" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:28.037164" level="INFO">${karaf_connection_index} = 374</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:28.036866" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:28.037632" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:28.037353" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:28.073064" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:28.038164" elapsed="0.035007"/>
</kw>
<msg time="2026-04-10T00:57:28.073370" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:28.073418" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:28.037823" elapsed="0.035632"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:28.159797" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:28.074020" elapsed="0.086055"/>
</kw>
<msg time="2026-04-10T00:57:28.160322" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:28.160371" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:28.073665" elapsed="0.086744"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.160946" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:28.160535" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.160496" elapsed="0.000543"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.161636" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:28.161192" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.162054" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:28.161797" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.161779" elapsed="0.000357"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:28.162174" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:28.164930" elapsed="0.000182"/>
</kw>
<msg time="2026-04-10T00:57:28.165173" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:28.163772" elapsed="0.001575"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.165649" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.165982" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:28.163101" elapsed="0.003066"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:28.162503" elapsed="0.003730"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:28.036222" elapsed="0.130111"/>
</kw>
<msg time="2026-04-10T00:57:28.166430" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:28.166474" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:28.035665" elapsed="0.130850"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:28.166785" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:57:28.166675" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.166656" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.167276" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.167724" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:28.167817" 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-04-10T00:57:28.034933" elapsed="0.133036"/>
</kw>
<msg time="2026-04-10T00:57:28.168087" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:28.168137" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:28.029928" elapsed="0.138248"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.168519" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:28.168256" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.168238" elapsed="0.000383"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:28.029783" elapsed="0.138864"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:27.786637" elapsed="0.382048"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:27.784046" elapsed="0.384703"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:57:27.778950" elapsed="0.389875"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:27.778459" elapsed="0.390417"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:57:27.775488" elapsed="0.393446"/>
</kw>
<kw name="Add Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Add Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.180481" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:28.180154" elapsed="0.000354"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:28.180574" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:57:28.180730" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:28.179790" elapsed="0.000964"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.194633" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:28.194351" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.195080" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:28.194842" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.195525" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:28.195281" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.195976" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:28.195737" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:28.196846" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:57:28.196642" elapsed="0.000230"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:57:28.197194" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:57:28.197026" elapsed="0.000193"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:57:28.197402" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.198037" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:28.197789" elapsed="0.000295"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:57:28.198149" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:57:28.198388" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:57:28.196221" elapsed="0.002193"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:28.207380" level="INFO">POST Request : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Content-Length': '401', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:57:28.207432" level="INFO">POST Response : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:28.207571" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:28.200952" elapsed="0.006648"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:28.198491" elapsed="0.009158"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.207840" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:28.207679" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.198471" elapsed="0.009458"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.211661" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:28.209194" elapsed="0.002512"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:28.208965" elapsed="0.002775"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.208946" elapsed="0.002819"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.214924" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:28.212039" elapsed="0.002952"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:28.211820" elapsed="0.003223"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.211803" elapsed="0.003275"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.215954" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:28.215343" elapsed="0.000650"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.216449" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:28.216096" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.217427" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:28.216838" elapsed="0.000631"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:28.216594" elapsed="0.000928"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.216071" elapsed="0.001506"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.218360" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:28.217813" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.218873" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:28.218504" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.219687" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:28.219228" elapsed="0.000498"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:28.218993" elapsed="0.000785"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.218479" elapsed="0.001330"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:28.220035" elapsed="0.000531"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:28.221319" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:28.220817" elapsed="0.000548"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:28.221630" elapsed="0.003549"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:28.208313" elapsed="0.017129"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:28.225737" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:28.225619" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.225598" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:28.228368" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:28.225959" elapsed="0.002435"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:28.228443" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:57:28.228622" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:28.191592" elapsed="0.037055"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:28.228714" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:28.228866" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:57:28.188928" elapsed="0.039963"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:28.228943" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:57:28.229091" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:28.179315" elapsed="0.049800"/>
</kw>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Add Bulk Flow in member 3 according to ${json_body_add}.</doc>
<status status="PASS" start="2026-04-10T00:57:28.174662" elapsed="0.054518"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.236646" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:28.236311" elapsed="0.000363"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:28.236722" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:57:28.236878" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:28.235948" elapsed="0.000956"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.243685" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:28.243381" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.244135" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:28.243893" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:28.255222" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:28.255282" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:28 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782648,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:28.255381" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:28.246358" elapsed="0.009049"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:28.244251" elapsed="0.011198"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.255662" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:28.255478" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.244231" elapsed="0.011519"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.259242" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782648,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:28.256814" elapsed="0.002478"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:28.256584" elapsed="0.002742"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.256564" elapsed="0.002786"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.262018" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:28.259644" elapsed="0.002420"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:28.259405" elapsed="0.002897"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.259388" elapsed="0.002942"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.262947" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:28.262518" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.263284" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:28.263044" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.263859" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:28.263529" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:28.263366" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.263026" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.264466" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:28.264104" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:28.264832" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:28.264597" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.265415" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:28.265074" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:28.264913" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.264577" elapsed="0.000921"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:28.265672" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:28.266485" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:28.266183" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:28.266685" elapsed="0.002579"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:28.256134" elapsed="0.013196"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:28.269511" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-04-10T00:57:28.269401" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:28.269382" 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-04-10T00:57:28.269784" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:28.269855" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:57:28.272169" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782648,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:28.237349" elapsed="0.034849"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:28.272250" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:28.272402" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782648,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:28.235399" elapsed="0.037029"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.273537" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782648, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:28.273025" elapsed="0.000562"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:28.273638" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:28.273796" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782648, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:28.272674" elapsed="0.001148"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:28.274183" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:28.274002" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.274773" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:28.274386" elapsed="0.000415"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.275238" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:28.274976" elapsed="0.000287"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:57:28.275840" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:57:28.275436" elapsed="0.000479">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:57:28.230458" elapsed="0.045572">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.287940" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:29.287533" elapsed="0.000442"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:29.288040" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:57:29.288217" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:29.287156" elapsed="0.001087"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.297467" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.297024" elapsed="0.000543"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.298187" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.297818" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:29.306573" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:29.306634" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:29 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782649,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:29.306732" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:29.302151" elapsed="0.004608"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.298368" elapsed="0.008435"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.306989" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.306832" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.298336" elapsed="0.008741"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.310780" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782649,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.308164" elapsed="0.002689"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.307930" elapsed="0.002967"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.307911" elapsed="0.003012"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.313859" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.311236" elapsed="0.002692"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.310994" elapsed="0.002984"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.310970" elapsed="0.003042"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.314864" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:29.314268" elapsed="0.000651"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.315423" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.315058" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.316239" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:29.315804" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.315538" elapsed="0.000822"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.315025" elapsed="0.001365"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.317170" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:29.316639" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.317783" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.317398" elapsed="0.000484"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.318657" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:29.318178" elapsed="0.000519"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.317919" elapsed="0.000833"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.317372" elapsed="0.001423"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:29.319061" elapsed="0.000553"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:29.320349" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:29.319885" elapsed="0.000507"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:29.320816" elapsed="0.003680"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:29.307472" elapsed="0.017117"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:29.324786" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T00:57:29.324668" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.324647" 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-04-10T00:57:29.325046" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:29.325121" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:57:29.327478" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782649,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:29.288665" elapsed="0.038847"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:29.327587" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:29.327747" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782649,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:29.286655" elapsed="0.041120"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.328955" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782649, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:29.328479" elapsed="0.000504"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:29.329032" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:29.329188" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782649, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:29.328015" elapsed="0.001200"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:29.329600" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:29.329396" elapsed="0.000230"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.330124" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:29.329813" elapsed="0.000353"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.330700" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:29.330388" elapsed="0.000339"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:57:29.330910" elapsed="0.000320"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:57:29.277077" elapsed="0.054217"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:28.229871" elapsed="1.101475"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 3.</doc>
<status status="PASS" start="2026-04-10T00:57:28.229446" elapsed="1.101965"/>
</kw>
<arg>${temp_json_config_add}</arg>
<arg>${Follower_Node_2}</arg>
<arg>${operation_timeout}</arg>
<doc>Add Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:57:28.174060" elapsed="1.157408"/>
</kw>
<doc>1000 Flows added via Follower Node2 and verify it gets applied in all instances.</doc>
<status status="PASS" start="2026-04-10T00:57:27.774833" elapsed="1.556956"/>
</test>
<test id="s1-s3-t33" name="Get Bulk Flows and Verify In Cluster Before Follower Restart" line="244">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:57:29.335951" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:57:29.335673" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:29.337318" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:29.337197" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.337177" elapsed="0.000212"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:29.342462" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:29.342354" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.342336" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.343580" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:29.343157" elapsed="0.000452"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.344090" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:29.343774" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:29.344162" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:57:29.344357" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:29.342778" elapsed="0.001606"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:29.349856" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:29.349746" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.349727" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:29.351151" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:29.351042" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.351024" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:29.351692" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:29.351371" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:29.352139" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:29.351886" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:29.386468" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:29.352723" elapsed="0.033938"/>
</kw>
<msg time="2026-04-10T00:57:29.386884" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:29.386933" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:29.352358" elapsed="0.034613"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:29.494704" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:29.387639" elapsed="0.107342"/>
</kw>
<msg time="2026-04-10T00:57:29.495223" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:29.495272" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:29.387192" elapsed="0.108118"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.495837" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.495439" elapsed="0.000459"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.495402" elapsed="0.000524"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.496515" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.496075" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.497003" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.496778" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.496760" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:29.497120" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:29.499862" elapsed="0.000181"/>
</kw>
<msg time="2026-04-10T00:57:29.500106" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:29.498726" elapsed="0.001537"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.500541" elapsed="0.000095"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.500896" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:29.498050" elapsed="0.003032"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:29.497450" elapsed="0.003697"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:29.350730" elapsed="0.150514"/>
</kw>
<msg time="2026-04-10T00:57:29.501341" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:29.501384" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:29.350077" elapsed="0.151344"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:29.501625" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:57:29.501500" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.501482" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.502112" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.502451" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:29.502524" elapsed="0.000037"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:29.349390" elapsed="0.153267"/>
</kw>
<msg time="2026-04-10T00:57:29.502753" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:29.502798" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:29.344792" elapsed="0.158046"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.503171" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.502916" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.502899" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:29.344642" elapsed="0.158630"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:29.509487" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:29.509373" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.509353" 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-04-10T00:57:29.510750" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:29.510641" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.510622" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:29.511295" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:29.510987" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:29.511759" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:29.511483" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:29.544228" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:29.512354" elapsed="0.032347"/>
</kw>
<msg time="2026-04-10T00:57:29.544927" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:29.544975" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:29.511947" elapsed="0.033066"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:29.623880" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:29.545806" elapsed="0.078361"/>
</kw>
<msg time="2026-04-10T00:57:29.624441" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:29.624491" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:29.545238" elapsed="0.079292"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.625035" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.624678" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.624639" elapsed="0.000487"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.625690" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.625279" elapsed="0.000512"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.626079" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.625859" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.625841" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:29.626196" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:29.628957" elapsed="0.000175"/>
</kw>
<msg time="2026-04-10T00:57:29.629194" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:29.627800" elapsed="0.001530"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.629625" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.629959" elapsed="0.000075"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:29.627129" elapsed="0.003015"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:29.626525" elapsed="0.003684"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:29.510313" elapsed="0.119994"/>
</kw>
<msg time="2026-04-10T00:57:29.630406" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:29.630450" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:29.509739" elapsed="0.120750"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:29.630708" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:57:29.630599" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.630579" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.631200" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.631564" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:29.631639" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:29.508514" elapsed="0.123235"/>
</kw>
<msg time="2026-04-10T00:57:29.631906" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:29.631951" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:29.503580" elapsed="0.128408"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.632340" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.632086" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.632068" elapsed="0.000350"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:29.503407" elapsed="0.129035"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:29.638081" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:29.637970" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.637950" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:29.639342" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:29.639230" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.639211" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:29.639913" level="INFO">${karaf_connection_index} = 374</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:29.639588" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:29.640412" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:29.640145" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:29.675668" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:29.640973" elapsed="0.034876"/>
</kw>
<msg time="2026-04-10T00:57:29.676088" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:29.676138" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:29.640621" elapsed="0.035554"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:29.769907" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:29.676867" elapsed="0.093741"/>
</kw>
<msg time="2026-04-10T00:57:29.770842" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:29.770892" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:29.676406" elapsed="0.094524"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.771386" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.771045" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.771010" elapsed="0.000482"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.772096" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "a "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.771660" elapsed="0.000538"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.772491" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.772268" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.772250" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:29.772624" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:29.775353" elapsed="0.000180"/>
</kw>
<msg time="2026-04-10T00:57:29.775621" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:29.774196" elapsed="0.001632"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.776154" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.776500" 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-04-10T00:57:29.773521" elapsed="0.003190"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:29.772946" elapsed="0.003830"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:29.638920" elapsed="0.137955"/>
</kw>
<msg time="2026-04-10T00:57:29.776970" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:29.777015" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:29.638309" elapsed="0.138743"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:29.777242" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:57:29.777132" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.777113" 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-04-10T00:57:29.777755" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.778101" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:29.778176" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:29.637605" elapsed="0.140681"/>
</kw>
<msg time="2026-04-10T00:57:29.778384" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:29.778430" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:29.632740" elapsed="0.145727"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.778832" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.778574" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.778528" elapsed="0.000385"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:29.632593" elapsed="0.146345"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:29.344444" elapsed="0.434527"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:29.341990" elapsed="0.437039"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:57:29.336902" elapsed="0.442191"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:29.336430" elapsed="0.442714"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:57:29.333011" elapsed="0.446192"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.791239" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:29.790803" elapsed="0.000465"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.791841" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:29.791437" elapsed="0.000433"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:29.791943" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:57:29.792109" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:29.790370" elapsed="0.001764"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.804435" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:29.804110" elapsed="0.000354"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:29.804603" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:57:29.804765" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:29.803717" elapsed="0.001073"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.818289" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.818016" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.818763" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.818501" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.819232" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.818981" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.819697" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.819431" elapsed="0.000311"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:29.820611" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:57:29.820391" elapsed="0.000247"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:57:29.820981" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:57:29.820798" elapsed="0.000209"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:57:29.821159" elapsed="0.000201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.821790" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.821520" elapsed="0.000314"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:57:29.821878" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:57:29.822039" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:57:29.819976" elapsed="0.002088"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:29.833041" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:57:29.833092" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:29.833202" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:29.824464" elapsed="0.008766"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.822143" elapsed="0.011137"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.833469" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.833309" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.822123" elapsed="0.011552"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.841594" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.836025" elapsed="0.005673"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.835471" elapsed="0.006307"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.835431" elapsed="0.006404"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.846007" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.842460" elapsed="0.003595"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.841963" elapsed="0.004127"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.841924" elapsed="0.004191"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.846717" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:29.846304" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.847053" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.846815" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.847623" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:29.847298" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.847134" elapsed="0.000621"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.846797" elapsed="0.000981"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.848329" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:29.847958" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.848679" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.848427" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.849224" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:29.848926" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.848762" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.848410" elapsed="0.000897"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:29.849465" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:29.850292" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:29.849996" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:29.850475" elapsed="0.002450"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:29.834466" elapsed="0.018531"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:29.853196" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:29.853081" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.853060" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:29.855896" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:29.853421" elapsed="0.002504"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:29.855973" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:57:29.856141" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:29.815257" elapsed="0.040909"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:29.856231" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:57:29.856382" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:57:29.812655" elapsed="0.043752"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:29.856459" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:57:29.856624" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:29.803250" elapsed="0.053399"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:57:29.798745" elapsed="0.057968"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:29.792328" elapsed="0.064419"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.869812" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:29.869333" elapsed="0.000517"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:29.869916" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:57:29.870120" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:29.868855" elapsed="0.001298"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.888824" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.888432" elapsed="0.000461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.889429" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.889110" elapsed="0.000521"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.890180" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.889848" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.890807" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.890453" elapsed="0.000414"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:29.892044" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:57:29.891704" elapsed="0.000376"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:57:29.892507" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:57:29.892290" elapsed="0.000249"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:57:29.892940" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.893773" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.893418" elapsed="0.000415"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:57:29.893891" elapsed="0.000050"/>
</return>
<msg time="2026-04-10T00:57:29.894114" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:57:29.891138" elapsed="0.003009"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:29.906757" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:57:29.906828" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:29.906954" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:29.897374" elapsed="0.009614"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.894255" elapsed="0.012800"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.907327" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.907096" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.894227" elapsed="0.013221"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.912471" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.908964" elapsed="0.003572"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.908655" elapsed="0.003949"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.908631" elapsed="0.004008"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.916194" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.913020" elapsed="0.003236"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.912717" elapsed="0.003586"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.912694" elapsed="0.003642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.917118" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:29.916604" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.917585" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.917248" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.918317" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:29.917921" elapsed="0.000431"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.917700" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.917224" elapsed="0.001203"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.919133" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:29.918660" elapsed="0.000507"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.919587" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.919259" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.920342" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:29.919952" elapsed="0.000424"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.919694" elapsed="0.000813"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.919236" elapsed="0.001302"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:29.920767" elapsed="0.000456"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:29.921847" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:29.921446" elapsed="0.000435"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:29.922092" elapsed="0.003192"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:29.908038" elapsed="0.017334"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:29.925649" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:29.925477" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.925450" elapsed="0.000295"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:29.929194" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:29.925947" elapsed="0.003282"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:29.929292" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:57:29.929510" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:29.884785" elapsed="0.044776"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:29.929655" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:57:29.929850" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:57:29.881215" elapsed="0.048666"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:29.929950" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:57:29.930129" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:29.868235" elapsed="0.061923"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:57:29.862344" elapsed="0.067895"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:29.856854" elapsed="0.073429"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.944888" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:29.944389" elapsed="0.000540"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:29.945001" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:57:29.945222" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:29.943906" elapsed="0.001351"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.964076" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.963664" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.964695" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.964365" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.965302" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.964969" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.965906" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.965584" elapsed="0.000382"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:29.967055" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:57:29.966793" elapsed="0.000297"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:57:29.967537" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:57:29.967303" elapsed="0.000289"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:57:29.967947" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.968775" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.968417" elapsed="0.000418"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:57:29.968892" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:57:29.969116" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:57:29.966240" elapsed="0.002908"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:29.980679" level="INFO">POST Request : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:57:29.980753" level="INFO">POST Response : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:29.980884" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:29.972160" elapsed="0.008759"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.969254" elapsed="0.011731"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.981261" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.981026" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.969227" elapsed="0.012160"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.986188" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.982880" elapsed="0.003371"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.982562" elapsed="0.003736"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.982521" elapsed="0.003812"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.989905" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:29.986735" elapsed="0.003235"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.986412" elapsed="0.003603"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.986389" elapsed="0.003661"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.990845" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:29.990298" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.991300" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.990978" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.992081" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:29.991651" elapsed="0.000467"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.991410" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.990953" elapsed="0.001245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.992904" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:29.992416" elapsed="0.000523"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:29.993342" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:29.993031" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:29.994084" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:29.993696" elapsed="0.000422"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:29.993454" elapsed="0.000710"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.993008" elapsed="0.001186"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:29.994404" elapsed="0.000487"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:29.995488" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:29.995114" elapsed="0.000409"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:29.995778" elapsed="0.003119"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:29.981943" elapsed="0.017130"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:29.999263" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:29.999152" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:29.999132" elapsed="0.000201"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:57:30.001956" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:57:29.999483" elapsed="0.002501"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:57:30.002035" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:57:30.002200" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:29.959703" elapsed="0.042522"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:30.002293" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:57:30.002444" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:57:29.956044" elapsed="0.046425"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:30.002521" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:57:30.002685" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:29.943227" elapsed="0.059483"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:57:29.936640" elapsed="0.066133"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:29.930411" elapsed="0.072397"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:29.792194" elapsed="0.210648"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:30.015537" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:30.015090" elapsed="0.000511"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:30.015670" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:57:30.015913" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:30.014567" elapsed="0.001383"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:30.025457" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:30.025197" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:30.025920" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:30.025677" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:30.033183" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:30.033243" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:30 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782650,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:30.033339" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:30.028126" elapsed="0.005240"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:30.026035" elapsed="0.007375"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:30.033679" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:30.033440" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:30.026015" elapsed="0.007791"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:30.039473" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782650,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:30.035435" elapsed="0.004134"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:30.035010" elapsed="0.004614"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:30.034983" elapsed="0.004678"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:30.043795" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:30.040110" elapsed="0.003755"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:30.039777" elapsed="0.004139"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:30.039750" elapsed="0.004203"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:30.044724" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:30.044213" elapsed="0.000538"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:30.045063" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:30.044824" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:30.045633" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:30.045309" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:30.045146" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:30.044805" elapsed="0.000914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:30.046243" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:30.045881" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:30.046602" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:30.046341" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:30.047145" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:30.046847" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:30.046685" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:30.046323" elapsed="0.000905"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:30.047383" elapsed="0.000386"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:30.048229" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:30.047938" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:30.048411" elapsed="0.002392"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:30.034353" elapsed="0.016516"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:30.051049" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:57:30.050942" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:30.050923" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:30.051293" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:30.051364" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:57:30.053717" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782650,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:30.016449" elapsed="0.037297"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:30.053798" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:30.053951" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782650,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:30.013876" elapsed="0.040102"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:30.054981" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782650, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:30.054579" elapsed="0.000430"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:30.055059" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:30.055268" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782650, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:30.054209" elapsed="0.001086"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:30.055679" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:30.055478" elapsed="0.000260"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:30.056224" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:30.055918" elapsed="0.000333"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:30.056717" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:30.056425" elapsed="0.000319"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:57:30.057272" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:57:30.056918" elapsed="0.000425">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:57:30.008946" elapsed="0.048510">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:31.070067" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:31.069701" elapsed="0.000397"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:31.070159" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:57:31.070323" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:31.069322" elapsed="0.001026"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:31.077700" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:31.077396" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:31.078163" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:31.077915" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:31.084938" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:31.084998" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:31 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:31 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782651,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:31.085096" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:31.080494" elapsed="0.004628"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:31.078287" elapsed="0.006881"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:31.085352" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:31.085196" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:31.078263" elapsed="0.007175"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:31.089154" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782651,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:31.086512" elapsed="0.002691"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:31.086285" elapsed="0.002954"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:31.086267" elapsed="0.002996"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:31.092261" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:31.089554" elapsed="0.002809"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:31.089320" elapsed="0.003096"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:31.089303" elapsed="0.003148"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:31.093365" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:31.092743" elapsed="0.000663"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:31.093928" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:31.093512" elapsed="0.000507"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:31.094782" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:31.094299" elapsed="0.000628"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:31.094056" elapsed="0.000932"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:31.093485" elapsed="0.001535"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:31.095853" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:31.095266" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:31.096357" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:31.096004" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:31.097195" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:31.096746" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:31.096480" elapsed="0.000809"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:31.095977" elapsed="0.001343"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:31.097571" elapsed="0.000529"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:31.098806" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:31.098350" elapsed="0.000496"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:31.099114" elapsed="0.003862"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:31.085850" elapsed="0.017227"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:31.103348" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T00:57:31.103186" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:31.103158" elapsed="0.000326"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:31.103688" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:31.103762" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:57:31.106111" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782651,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:31.070711" elapsed="0.035430"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:31.106195" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:31.106353" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782651,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:31.068820" elapsed="0.037561"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:31.107591" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782651, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:31.107152" elapsed="0.000471"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:31.107672" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:31.107840" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782651, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:31.106637" elapsed="0.001238"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:31.108241" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:31.108058" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:31.108773" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:31.108442" elapsed="0.000361"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:31.109260" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:31.108988" elapsed="0.000299"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:57:31.109842" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:57:31.109461" elapsed="0.000454">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:57:31.058416" elapsed="0.051612">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:32.121028" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:32.120616" elapsed="0.000445"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:32.121124" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:57:32.121300" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:32.120104" elapsed="0.001221"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:32.128295" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:32.128028" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:32.128772" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:32.128506" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:32.137084" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:32.137144" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:32 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:32 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782652,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:32.137238" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:32.131047" elapsed="0.006217"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:32.128894" elapsed="0.008412"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:32.137487" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:32.137333" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:32.128873" elapsed="0.008725"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:32.142829" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782652,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:32.139137" elapsed="0.003766"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:32.138804" elapsed="0.004152"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:32.138776" elapsed="0.004216"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:32.146893" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:32.143405" elapsed="0.003536"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:32.143075" elapsed="0.003901"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:32.143050" elapsed="0.003951"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:32.147588" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:32.147180" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:32.147930" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:32.147687" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:32.148481" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:32.148176" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:32.148012" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:32.147669" elapsed="0.000914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:32.149111" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:32.148745" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:32.149442" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:32.149207" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:32.150006" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:32.149708" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:32.149524" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:32.149190" elapsed="0.000899"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:32.150285" elapsed="0.000381"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:32.151172" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:32.150879" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:32.151356" elapsed="0.002363"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:32.138125" elapsed="0.015658"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:32.153961" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:57:32.153854" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:32.153835" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:32.154217" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:32.154290" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:57:32.156595" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782652,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:32.121705" elapsed="0.034920"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:32.156678" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:32.156833" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782652,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:32.119464" elapsed="0.037396"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:32.157843" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782652, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:32.157425" elapsed="0.000447"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:32.157922" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:32.158079" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782652, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:32.157082" elapsed="0.001024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:32.158500" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:32.158315" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:32.159029" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:32.158724" elapsed="0.000331"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:32.159492" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:32.159230" elapsed="0.000287"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:57:32.160058" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:57:32.159707" elapsed="0.000422">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:57:32.111164" elapsed="0.049073">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:33.171356" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:33.170816" elapsed="0.000589"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:33.171492" elapsed="0.000086"/>
</return>
<msg time="2026-04-10T00:57:33.171779" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:33.170206" elapsed="0.001615"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:33.179731" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:33.179357" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:33.180217" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:33.179965" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:33.186828" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:33.187012" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:33 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:33 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782653,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:33.187120" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:33.182516" elapsed="0.004632"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:33.180349" elapsed="0.006845"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:33.187383" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:33.187224" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:33.180323" elapsed="0.007151"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:33.191339" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782653,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:33.188612" elapsed="0.002798"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:33.188365" elapsed="0.003095"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:33.188346" elapsed="0.003149"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:33.195572" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:33.191931" elapsed="0.003713"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:33.191601" elapsed="0.004094"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:33.191575" elapsed="0.004156"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:33.196575" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:33.195989" elapsed="0.000629"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:33.197085" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:33.196729" elapsed="0.000444"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:33.197954" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:33.197441" elapsed="0.000556"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:33.197208" elapsed="0.000848"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:33.196698" elapsed="0.001391"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:33.198838" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:33.198320" elapsed="0.000547"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:33.199190" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:33.198940" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:33.199784" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:33.199447" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:33.199276" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:33.198922" elapsed="0.000949"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:33.200029" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:33.200876" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:33.200578" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:33.201064" elapsed="0.002406"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:33.187919" elapsed="0.015618"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:33.203748" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:57:33.203631" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:33.203611" elapsed="0.000235"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:33.204000" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:33.204072" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:57:33.206424" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782653,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:33.172349" elapsed="0.034138"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:33.206559" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:57:33.206726" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782653,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:33.169278" elapsed="0.037475"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:33.207767" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782653, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:33.207332" elapsed="0.000464"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:33.207846" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:33.208006" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782653, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:33.206979" elapsed="0.001053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:33.208410" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:33.208223" elapsed="0.000213"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:33.208943" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:33.208631" elapsed="0.000339"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:33.209423" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:33.209144" elapsed="0.000305"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:57:33.210035" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:57:33.209641" elapsed="0.000468">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:57:33.161249" elapsed="0.048989">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.223159" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.222789" elapsed="0.000401"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:34.223252" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:57:34.223419" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:34.222405" elapsed="0.001039"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.231909" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.231639" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.232363" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.232116" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:34.238753" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:34.238839" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782654,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:34.238993" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:34.234608" elapsed="0.004423"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.232480" elapsed="0.006614"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.239365" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.239135" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.232460" elapsed="0.007031"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.244550" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782654,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.241034" elapsed="0.003611"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.240703" elapsed="0.004118"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.240677" elapsed="0.004183"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.248659" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.245259" elapsed="0.003468"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.244942" elapsed="0.003834"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.244917" elapsed="0.003892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.249621" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.249054" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.250096" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.249762" elapsed="0.000456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.250905" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.250486" elapsed="0.000447"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.250256" elapsed="0.000713"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.249736" elapsed="0.001255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.251522" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.251155" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.251877" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.251642" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.252420" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.252121" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.251960" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.251623" elapsed="0.000881"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:34.252682" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:34.253490" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.253199" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.253694" elapsed="0.002525"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:34.240064" elapsed="0.016222"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:34.256467" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:57:34.256357" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.256339" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.256735" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.256808" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:57:34.259156" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782654,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:34.223811" elapsed="0.035374"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:34.259239" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:34.259392" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782654,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:34.221918" elapsed="0.037501"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.260410" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782654, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.260013" elapsed="0.000426"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:34.260488" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:34.260667" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782654, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:34.259662" elapsed="0.001072"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:34.261108" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.260924" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.261640" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:34.261312" elapsed="0.000357"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.262113" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:34.261846" elapsed="0.000293"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.262315" elapsed="0.000333"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:57:34.211405" elapsed="0.051305"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:30.008302" elapsed="4.254461"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:30.007867" elapsed="4.254979"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:30.003035" elapsed="4.259846"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.275035" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.274680" elapsed="0.000387"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:34.275130" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:57:34.275296" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:34.274291" elapsed="0.001030"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.282198" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.281886" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.282688" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.282421" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:34.291669" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:34.291762" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782654,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:34.291895" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:34.285007" elapsed="0.006918"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.282820" elapsed="0.009170"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.292239" elapsed="0.000089"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.292027" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.282796" elapsed="0.009601"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.298240" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782654,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.293976" elapsed="0.004348"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.293586" elapsed="0.004796"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.293557" elapsed="0.004863"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.302530" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.298947" elapsed="0.003692"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.298532" elapsed="0.004154"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.298496" elapsed="0.004219"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.303391" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.302948" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.303770" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.303496" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.304416" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.304106" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.303938" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.303476" elapsed="0.001025"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.305098" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.304685" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.305436" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.305197" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.306002" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.305702" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.305518" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.305179" elapsed="0.000906"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:34.306252" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:34.307100" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.306801" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.307284" elapsed="0.002624"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:34.292906" elapsed="0.017080"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:34.310186" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:57:34.310069" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.310047" 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-04-10T00:57:34.310447" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.310519" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:57:34.312908" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782654,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:34.275737" elapsed="0.037201"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:34.312993" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:34.313151" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782654,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:34.273778" elapsed="0.039400"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.314336" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782654, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.313888" elapsed="0.000477"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:34.314415" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:34.314576" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782654, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:34.313463" elapsed="0.001160"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:34.314995" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.314811" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.315508" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:34.315200" elapsed="0.000336"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.315996" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:34.315729" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.316199" elapsed="0.000314"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:57:34.268911" elapsed="0.047668"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:34.268275" elapsed="0.048463"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:34.267836" elapsed="0.048967"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:34.262977" elapsed="0.053862"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.329274" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.328907" elapsed="0.000401"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:34.329371" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:57:34.329540" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:34.328497" elapsed="0.001074"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.336815" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.336425" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.337296" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.337050" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:34.345534" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:34.345649" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782654,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:34.345786" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:34.339580" elapsed="0.006236"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.337425" elapsed="0.008451"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.346141" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.345919" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.337401" elapsed="0.008835"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.350180" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782654,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.347475" elapsed="0.002764"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.347210" elapsed="0.003069"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.347188" elapsed="0.003117"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.353139" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.350620" elapsed="0.002568"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.350365" elapsed="0.002859"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.350347" elapsed="0.002902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.353908" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.353466" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.354256" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.354010" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.354852" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.354506" elapsed="0.000374"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.354337" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.353991" elapsed="0.000947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.355548" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.355113" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.355990" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.355667" elapsed="0.000500"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.356921" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.356450" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.356205" elapsed="0.000807"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.355648" elapsed="0.001396"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:34.357283" elapsed="0.000543"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:34.358496" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.358072" elapsed="0.000462"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.358799" elapsed="0.004117"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:34.346691" elapsed="0.016335"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:34.363321" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-10T00:57:34.363153" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.363117" elapsed="0.000342"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.363731" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.363888" elapsed="0.000024"/>
</return>
<msg time="2026-04-10T00:57:34.366521" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782654,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:34.329949" elapsed="0.036606"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:34.366625" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:57:34.366786" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782654,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:34.327912" elapsed="0.038900"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.368029" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782654, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.367504" elapsed="0.000553"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:34.368106" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:34.368263" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782654, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:34.367077" elapsed="0.001212"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:34.368689" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.368472" elapsed="0.000243"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.369207" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:34.368896" elapsed="0.000337"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.369693" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:57:34.369407" elapsed="0.000311"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.369896" elapsed="0.000315"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:57:34.322947" elapsed="0.047326"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:34.322252" elapsed="0.048075"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:34.321688" elapsed="0.048703"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:34.316942" elapsed="0.053484"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:30.002895" elapsed="4.367570"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.381955" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.381540" elapsed="0.000449"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:34.382166" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:57:34.382345" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:34.381159" elapsed="0.001211"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.389578" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.389216" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.390078" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.389833" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:34.398871" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:34.399068" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782654,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:34.399414" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:34.392325" elapsed="0.007184"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.390213" elapsed="0.009502"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.400279" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.399811" elapsed="0.000670"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.390185" elapsed="0.010364"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.407985" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782654,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.403332" elapsed="0.004706"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.402738" elapsed="0.005336"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.402689" elapsed="0.005410"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.410784" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.408385" elapsed="0.002449"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.408157" elapsed="0.002711"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.408139" elapsed="0.002754"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.411483" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.411079" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.411849" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.411590" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.412405" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.412100" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.411933" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.411569" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.413033" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.412667" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.413366" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.413130" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.413929" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.413628" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.413448" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.413113" elapsed="0.000900"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:34.414168" elapsed="0.000401"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:34.415194" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.414765" elapsed="0.000465"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.415538" elapsed="0.003489"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:34.401519" elapsed="0.017574"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:34.419278" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:57:34.419165" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.419146" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.419530" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.419622" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:57:34.421934" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782654,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:34.382748" elapsed="0.039215"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:34.422018" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:34.422173" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782654,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:34.380645" elapsed="0.041554"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:57:34.422247" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:34.422391" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782654,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 1. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:57:34.376177" elapsed="0.046239"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.423429" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782654, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.423029" elapsed="0.000428"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:34.423505" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:34.423685" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782654, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:34.422658" elapsed="0.001054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:34.424072" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.423891" elapsed="0.000208"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.424567" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:57:34.424281" elapsed="0.000357"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:57:34.375647" elapsed="0.049051"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:34.370700" elapsed="0.054034"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.435861" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.435534" elapsed="0.000354"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:34.435935" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:34.436083" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:34.435144" elapsed="0.000964"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.442853" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.442602" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.443299" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.443055" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:34.453806" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:34.453956" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782654,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:34.454072" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:34.445569" elapsed="0.008532"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.443444" elapsed="0.010729"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.454396" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.454212" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.443425" elapsed="0.011060"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.459907" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782654,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.456082" elapsed="0.003896"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.455754" elapsed="0.004274"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.455726" elapsed="0.004336"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.464031" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.460535" elapsed="0.003563"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.460144" elapsed="0.004004"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.460119" elapsed="0.004064"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.465163" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.464434" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.465678" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.465307" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.466262" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.465957" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.465794" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.465281" elapsed="0.001064"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.466890" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.466503" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.467219" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.466987" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.467780" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.467468" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.467300" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.466969" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:34.468016" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:34.468833" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.468523" elapsed="0.000337"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.469055" elapsed="0.002378"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:34.455018" elapsed="0.016480"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:34.471720" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:57:34.471573" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.471551" 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-04-10T00:57:34.471971" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.472042" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:57:34.474338" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782654,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:34.436441" elapsed="0.037975"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:34.474470" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:34.474644" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782654,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:34.434685" elapsed="0.039986"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:57:34.474718" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:57:34.474863" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782654,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:57:34.430117" elapsed="0.044772"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.475882" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782654, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.475461" elapsed="0.000449"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:34.475958" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:34.476111" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782654, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:34.475113" elapsed="0.001024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:34.476493" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.476315" elapsed="0.000203"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.476996" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:57:34.476716" elapsed="0.000335"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:57:34.429671" elapsed="0.047438"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:34.424837" elapsed="0.052306"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.487881" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.487559" elapsed="0.000351"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:34.487958" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:57:34.488114" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:34.487205" elapsed="0.000934"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.495075" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.494821" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.495545" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.495278" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:34.502361" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:57:34.502420" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:57:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:57:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782654,"status":200} 
 </msg>
<msg time="2026-04-10T00:57:34.502515" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:57:34.497747" elapsed="0.004798"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.495681" elapsed="0.006935"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.502867" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.502688" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.495661" elapsed="0.007297"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.507523" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782654,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.504102" elapsed="0.003642"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.503776" elapsed="0.004022"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.503752" elapsed="0.004082"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.511704" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.508247" elapsed="0.003539"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.507914" elapsed="0.003918"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.507890" elapsed="0.003973"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.512419" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.512038" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.512800" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.512532" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.513356" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.513050" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.512884" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.512510" elapsed="0.000930"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.514008" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.513633" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.514341" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.514106" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.514925" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.514605" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.514422" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.514088" elapsed="0.000922"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:34.515165" elapsed="0.000407"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:57:34.516241" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.515769" elapsed="0.000499"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.516423" elapsed="0.002403"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:57:34.503319" elapsed="0.015760"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:57:34.519260" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:57:34.519152" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.519133" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.519552" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.519649" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:57:34.522005" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782654,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:57:34.488479" elapsed="0.033560"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:57:34.522098" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:57:34.522273" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782654,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:57:34.486740" elapsed="0.035563"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:57:34.522352" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:34.522502" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782654,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 3. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:57:34.482315" elapsed="0.040214"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.523707" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782654, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:34.523189" elapsed="0.000630"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:57:34.523872" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:57:34.524036" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782654, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:57:34.522804" elapsed="0.001258"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:34.524460" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.524254" elapsed="0.000233"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.524993" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:57:34.524695" elapsed="0.000358"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:57:34.481873" elapsed="0.043240"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:34.477243" elapsed="0.047906"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:34.370530" elapsed="0.154659"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:57:29.787871" elapsed="4.737383"/>
</kw>
<doc>Initiate get operation and check flow count across cluster nodes.</doc>
<status status="PASS" start="2026-04-10T00:57:29.332200" elapsed="5.193187"/>
</test>
<test id="s1-s3-t34" name="Verify Flows In Switch Before Follower Restart" line="251">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:57:34.529067" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:57:34.528793" elapsed="0.000539"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.530406" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:34.530285" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.530264" elapsed="0.000213"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.535612" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:34.535484" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.535466" elapsed="0.000218"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.536780" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:34.536366" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.537291" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:34.536973" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:34.537362" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:34.537516" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:34.535915" elapsed="0.001629"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.543169" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:34.543059" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.543041" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.544510" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:34.544345" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.544328" elapsed="0.000257"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:34.545154" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.544836" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:34.545625" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:34.545346" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:34.582351" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:34.546163" elapsed="0.036323"/>
</kw>
<msg time="2026-04-10T00:57:34.582742" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:34.582791" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:34.545821" elapsed="0.037006"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:34.693180" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:34.583562" elapsed="0.109886"/>
</kw>
<msg time="2026-04-10T00:57:34.693720" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:34.693772" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:34.583171" elapsed="0.110641"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.694290" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.693933" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.693897" elapsed="0.000482"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.694943" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.694530" elapsed="0.000509"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.695335" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.695109" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.695090" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:34.695452" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:34.698336" elapsed="0.000198"/>
</kw>
<msg time="2026-04-10T00:57:34.698630" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:34.697115" elapsed="0.001654"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.699066" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.699401" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:34.696443" elapsed="0.003172"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:34.695792" elapsed="0.003891"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:34.544037" elapsed="0.155745"/>
</kw>
<msg time="2026-04-10T00:57:34.699879" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:34.699924" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:34.543392" elapsed="0.156570"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:34.700150" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:57:34.700041" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.700022" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.700698" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.701045" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.701116" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:34.542717" elapsed="0.158509"/>
</kw>
<msg time="2026-04-10T00:57:34.701323" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:34.701367" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:34.537957" elapsed="0.163448"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.701823" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.701537" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.701518" elapsed="0.000383"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:34.537807" elapsed="0.164118"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.707466" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:34.707357" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.707338" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.708713" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:34.708580" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.708563" elapsed="0.000240"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:34.709255" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.708952" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:34.709710" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:34.709443" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:34.761287" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:34.710236" elapsed="0.051213"/>
</kw>
<msg time="2026-04-10T00:57:34.761721" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:34.761770" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:34.709898" elapsed="0.051909"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:34.826367" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:34.762443" elapsed="0.064132"/>
</kw>
<msg time="2026-04-10T00:57:34.826776" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:34.826823" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:34.762035" elapsed="0.064825"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.827235" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.826956" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.826929" elapsed="0.000389"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.827802" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.827461" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.828183" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.827965" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.827946" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:34.828296" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:34.830920" elapsed="0.000178"/>
</kw>
<msg time="2026-04-10T00:57:34.831158" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:34.829854" elapsed="0.001441"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.831583" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.831933" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:34.829186" elapsed="0.002931"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:34.828629" elapsed="0.003607"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:34.708273" elapsed="0.124063"/>
</kw>
<msg time="2026-04-10T00:57:34.832428" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:34.832472" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:34.707708" elapsed="0.124800"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:34.832718" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:57:34.832609" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.832571" elapsed="0.000232"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.833215" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.833555" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.833649" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:34.707006" elapsed="0.126752"/>
</kw>
<msg time="2026-04-10T00:57:34.833855" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:34.833899" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:34.702204" elapsed="0.131733"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.834265" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.834013" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.833996" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:34.702058" elapsed="0.132308"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.840018" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:34.839901" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.839879" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.841249" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:34.841143" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.841126" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:34.841860" level="INFO">${karaf_connection_index} = 374</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:34.841464" elapsed="0.000423"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:34.842288" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:34.842047" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:34.875879" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:34.842838" elapsed="0.033146"/>
</kw>
<msg time="2026-04-10T00:57:34.876145" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:34.876192" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:34.842476" elapsed="0.033752"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:34.958647" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:34.876803" elapsed="0.082087"/>
</kw>
<msg time="2026-04-10T00:57:34.959123" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:34.959173" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:34.876401" elapsed="0.082809"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.959779" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.959404" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.959371" elapsed="0.000495"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.960438" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "B "e "f "o "r "e "[C "F "o "l "l "o "w "e "r "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:34.960014" elapsed="0.000518"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.960841" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.960619" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.960599" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:34.960956" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:34.963621" elapsed="0.000186"/>
</kw>
<msg time="2026-04-10T00:57:34.963869" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:34.962555" elapsed="0.001450"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.964285" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.964682" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:34.961887" elapsed="0.002986"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:34.961284" elapsed="0.003653"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:34.840843" elapsed="0.124192"/>
</kw>
<msg time="2026-04-10T00:57:34.965132" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:34.965177" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:34.840237" elapsed="0.124984"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:34.965411" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:57:34.965304" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.965285" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.965922" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.966260" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:34.966331" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:34.839511" elapsed="0.126930"/>
</kw>
<msg time="2026-04-10T00:57:34.966537" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:34.966600" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:34.834663" elapsed="0.131978"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:34.967025" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:34.966719" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.966702" elapsed="0.000411"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:34.834498" elapsed="0.132639"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:34.537624" elapsed="0.429546"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:34.535119" elapsed="0.432111"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:57:34.529979" elapsed="0.437309"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:34.529493" elapsed="0.437841"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:57:34.526230" elapsed="0.441196"/>
</kw>
<kw name="Verify Aggregate Flow From Mininet Session" owner="MininetKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:34.969376" elapsed="0.000173"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.969156" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.969138" elapsed="0.000488"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:34.970058" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:34.969793" elapsed="0.000291"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:34.970960" elapsed="0.000166"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:34.970744" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:34.970726" elapsed="0.000459"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:34.974003" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:34.971324" elapsed="0.002751"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:57:34.999854" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<msg time="2026-04-10T00:57:35.000136" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:57:34.974253" elapsed="0.025911"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:57:35.000210" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:57:35.000372" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 405 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:57:34.970406" elapsed="0.029993"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:57:35.000838" level="INFO">${flows} = ['1000']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:57:35.000567" elapsed="0.000297"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.001409" level="INFO">${total_flows} = 1000</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:57:35.001027" elapsed="0.000409"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.001920" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-04-10T00:57:35.001636" elapsed="0.000340"/>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="PASS" start="2026-04-10T00:57:34.968849" elapsed="0.033187"/>
</kw>
<arg>${time_out}</arg>
<arg>2s</arg>
<arg>MininetKeywords.Check Flows In Mininet</arg>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:34.968161" elapsed="0.033953"/>
</kw>
<arg>${mininet_conn_id}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${operation_timeout}</arg>
<doc>Verify flow count per switch</doc>
<status status="PASS" start="2026-04-10T00:57:34.967676" elapsed="0.034499"/>
</kw>
<doc>Verify flows are installed in switch before follower restart.</doc>
<status status="PASS" start="2026-04-10T00:57:34.525653" elapsed="0.476632"/>
</test>
<test id="s1-s3-t35" name="Kill Follower Node2" line="258">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:57:35.005753" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:57:35.005465" elapsed="0.000559"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.007036" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.006928" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.006909" elapsed="0.000197"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.012252" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.012146" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.012128" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.013330" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:35.012949" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.013875" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:35.013518" elapsed="0.000384"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:35.013948" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:35.014110" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:35.012547" elapsed="0.001649"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.019846" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.019739" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.019720" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.021125" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.021018" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.021001" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:35.021656" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:35.021338" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.022091" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:35.021849" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.055684" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:35.022637" elapsed="0.033152"/>
</kw>
<msg time="2026-04-10T00:57:35.055953" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:35.055998" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.022278" elapsed="0.033757"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.110208" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "F "o "l "[78Cl "[A[78Co
 "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:35.056668" elapsed="0.053717"/>
</kw>
<msg time="2026-04-10T00:57:35.110659" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:35.110754" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.056210" elapsed="0.054615"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.111278" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.110946" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.110915" elapsed="0.000477"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.112287" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "F "o "l "[78Cl "[A[78Co
 "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:35.111632" elapsed="0.000895"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.113320" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.112774" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.112727" elapsed="0.000782"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:35.113627" elapsed="0.000071"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:35.117481" elapsed="0.000198"/>
</kw>
<msg time="2026-04-10T00:57:35.117745" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:35.116433" elapsed="0.001450"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.118165" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.118502" elapsed="0.000081"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:35.115788" elapsed="0.002928"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:35.114270" elapsed="0.004529"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:35.020713" elapsed="0.098243"/>
</kw>
<msg time="2026-04-10T00:57:35.119053" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:35.119126" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.020067" elapsed="0.099107"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:35.119372" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:57:35.119258" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.119238" elapsed="0.000221"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.119905" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.120257" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.120334" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:35.019380" elapsed="0.101069"/>
</kw>
<msg time="2026-04-10T00:57:35.120551" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:35.120614" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.014668" elapsed="0.105988"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.120991" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.120734" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.120717" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:35.014462" elapsed="0.106633"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.126708" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.126570" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.126551" 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-04-10T00:57:35.127963" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.127857" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.127839" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:35.128477" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:35.128177" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.128976" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:35.128730" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.161255" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:35.129504" elapsed="0.031852"/>
</kw>
<msg time="2026-04-10T00:57:35.161516" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:35.161586" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.129165" elapsed="0.032461"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.214767" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "F "o "l "[78Cl "[A[78Co
 "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:35.162147" elapsed="0.052771"/>
</kw>
<msg time="2026-04-10T00:57:35.215091" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:35.215138" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.161800" elapsed="0.053375"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.215515" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.215278" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.215238" elapsed="0.000441"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.216342" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "F "o "l "[78Cl "[A[78Co
 "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:35.215828" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.216739" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.216496" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.216478" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:35.216853" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:35.219314" elapsed="0.000203"/>
</kw>
<msg time="2026-04-10T00:57:35.219600" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:35.218305" elapsed="0.001429"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.220133" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.220464" elapsed="0.000074"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:35.217685" elapsed="0.002989"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:35.217129" elapsed="0.003610"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:35.127537" elapsed="0.093300"/>
</kw>
<msg time="2026-04-10T00:57:35.220930" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:35.220974" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.126934" elapsed="0.094079"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:35.221198" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:57:35.221090" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.221071" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.221694" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.222027" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.222099" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:35.126219" elapsed="0.095989"/>
</kw>
<msg time="2026-04-10T00:57:35.222301" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:35.222345" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.121375" elapsed="0.101008"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.222727" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.222457" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.222440" elapsed="0.000365"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:35.121227" elapsed="0.101601"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.228243" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.228137" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.228118" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.229448" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.229343" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.229326" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:35.229987" level="INFO">${karaf_connection_index} = 374</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:35.229686" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.230459" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:35.230215" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.267946" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:35.231010" elapsed="0.037035"/>
</kw>
<msg time="2026-04-10T00:57:35.268223" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:35.268269" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.230668" elapsed="0.037638"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.330658" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "F "o "l "[78Cl "[A[78Co
 "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:35.268853" elapsed="0.062027"/>
</kw>
<msg time="2026-04-10T00:57:35.331145" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:35.331214" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.268477" elapsed="0.062793"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.331838" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.331408" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.331369" elapsed="0.000762"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.332948" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "K "i "l "l "[C "F "o "l "[78Cl "[A[78Co
 "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:35.332399" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.333506" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.333179" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.333153" elapsed="0.000511"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:35.333727" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:35.337562" elapsed="0.000198"/>
</kw>
<msg time="2026-04-10T00:57:35.337824" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:35.336292" elapsed="0.001675"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.338251" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.338613" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:35.335357" elapsed="0.003448"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:35.334157" elapsed="0.004715"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:35.229044" elapsed="0.109932"/>
</kw>
<msg time="2026-04-10T00:57:35.339076" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:35.339120" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.228465" elapsed="0.110693"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:35.339345" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:57:35.339237" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.339219" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.339865" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.340274" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.340349" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:35.227763" elapsed="0.112698"/>
</kw>
<msg time="2026-04-10T00:57:35.340561" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:35.340624" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.223091" elapsed="0.117595"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.341035" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.340772" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.340753" elapsed="0.000370"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:35.222948" elapsed="0.118201"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:35.014265" elapsed="0.326917"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:35.011782" elapsed="0.329462"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:57:35.006641" elapsed="0.334663"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.006179" elapsed="0.335171"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:57:35.002970" elapsed="0.338439"/>
</kw>
<kw name="Kill_Single_Member" owner="ClusterManagement">
<kw name="ClusterManagement__Build_List" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.344725" level="INFO">${member_int} = 3</msg>
<var>${member_int}</var>
<arg>${member}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:57:35.344388" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.345317" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>${member_int}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:35.345005" elapsed="0.000339"/>
</kw>
<return>
<value>${index_list}</value>
<status status="PASS" start="2026-04-10T00:57:35.345390" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:35.345543" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>${member}</arg>
<status status="PASS" start="2026-04-10T00:57:35.344056" elapsed="0.001513"/>
</kw>
<kw name="Return_Member_IP" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.346398" level="INFO">${member_int} = 3</msg>
<var>${member_int}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:57:35.346096" elapsed="0.000328"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:35.346860" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_int}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:35.346578" elapsed="0.000307"/>
</kw>
<return>
<value>${member_ip}</value>
<status status="PASS" start="2026-04-10T00:57:35.346931" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:35.347079" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>${member}</arg>
<doc>Return the IP address of the member given the member_index.</doc>
<status status="PASS" start="2026-04-10T00:57:35.345778" elapsed="0.001325"/>
</kw>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.354233" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.354124" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.354106" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.355311" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:35.354931" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.355824" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:35.355497" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:35.355895" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:35.356051" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:35.354529" elapsed="0.001546"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.361541" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.361430" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.361411" elapsed="0.000247"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.362804" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.362697" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.362678" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:35.363232" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:35.363017" elapsed="0.000241"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.363636" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:35.363416" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.394811" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "1 ". "1 "5 "1 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:35.364158" elapsed="0.030772"/>
</kw>
<msg time="2026-04-10T00:57:35.395097" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:35.395147" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.363823" elapsed="0.031362"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.399026" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:35.395828" elapsed="0.003258"/>
</kw>
<msg time="2026-04-10T00:57:35.399206" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:35.399253" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.395399" elapsed="0.003880"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.399639" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.399372" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.399347" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.400127" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:35.399869" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.400460" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.400242" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.400224" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:35.400577" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:35.402367" elapsed="0.000251"/>
</kw>
<msg time="2026-04-10T00:57:35.402722" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:35.401824" elapsed="0.000968"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.402955" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.403119" elapsed="0.000225"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:35.401422" elapsed="0.002016"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:35.400901" elapsed="0.002587"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:35.362328" elapsed="0.041284"/>
</kw>
<msg time="2026-04-10T00:57:35.403710" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:35.403754" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.361817" elapsed="0.041965"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:35.403970" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:57:35.403861" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.403843" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.404450" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.404867" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.404941" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:35.361090" elapsed="0.043960"/>
</kw>
<msg time="2026-04-10T00:57:35.405144" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:35.405188" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.356451" elapsed="0.048764"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.405539" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.405291" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.405274" elapsed="0.000363"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:35.356305" elapsed="0.049356"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.411178" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.411072" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.411054" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.412364" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.412259" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.412241" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:35.412817" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:35.412580" elapsed="0.000263"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.413195" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:35.412999" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.441953" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "1 ". "1 "5 "1 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:35.413729" elapsed="0.028473"/>
</kw>
<msg time="2026-04-10T00:57:35.442453" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:35.442518" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.413378" elapsed="0.029217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.445676" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:35.443654" elapsed="0.002105"/>
</kw>
<msg time="2026-04-10T00:57:35.445890" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:35.445952" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.442968" elapsed="0.003020"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.446509" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.446135" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.446090" elapsed="0.000563"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.447200" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:35.446872" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.447636" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.447341" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.447319" elapsed="0.000413"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:35.447782" elapsed="0.000057"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:35.450240" elapsed="0.000297"/>
</kw>
<msg time="2026-04-10T00:57:35.450962" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:35.449509" elapsed="0.001561"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.451434" elapsed="0.000032"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.451696" elapsed="0.000031"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:35.448928" elapsed="0.002892"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:35.448207" elapsed="0.003813"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:35.411960" elapsed="0.040208"/>
</kw>
<msg time="2026-04-10T00:57:35.452295" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:35.452347" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.411399" elapsed="0.040982"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:35.453136" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:57:35.452483" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.452457" elapsed="0.000798"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.453962" 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-04-10T00:57:35.454391" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.454484" elapsed="0.000028"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:35.410729" elapsed="0.043930"/>
</kw>
<msg time="2026-04-10T00:57:35.454781" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:35.454834" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.405931" elapsed="0.048935"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.455274" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.454963" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.454942" elapsed="0.000426"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:35.405788" elapsed="0.049609"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.462370" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.462227" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.462206" elapsed="0.000253"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.463832" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.463710" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.463689" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:35.464303" level="INFO">${karaf_connection_index} = 374</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:35.464052" elapsed="0.000278"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.464736" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:35.464495" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.497074" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "1 ". "1 "5 "1 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:35.465269" elapsed="0.031928"/>
</kw>
<msg time="2026-04-10T00:57:35.497336" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:35.497382" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "K "i "l "l "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.464927" elapsed="0.032491"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.500464" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:35.498107" elapsed="0.002418"/>
</kw>
<msg time="2026-04-10T00:57:35.500639" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:35.500684" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.497664" elapsed="0.003133"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.501164" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.500904" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.500876" elapsed="0.000373"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.501675" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:35.501394" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.502013" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.501793" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.501775" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:35.502131" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:35.504229" elapsed="0.000240"/>
</kw>
<msg time="2026-04-10T00:57:35.504578" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:35.503452" elapsed="0.001226"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.504840" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.505004" elapsed="0.000020"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:35.503062" elapsed="0.002027"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:35.502449" elapsed="0.002700"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:35.463348" elapsed="0.041904"/>
</kw>
<msg time="2026-04-10T00:57:35.505347" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:35.505391" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.462680" elapsed="0.042738"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:35.505657" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:57:35.505498" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.505478" 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 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.506400" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.506770" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.506849" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:35.461778" elapsed="0.045180"/>
</kw>
<msg time="2026-04-10T00:57:35.507052" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:35.507094" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:35.455795" elapsed="0.051326"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.507448" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.507197" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.507180" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:35.455576" elapsed="0.051976"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:35.356132" elapsed="0.151472"/>
</for>
<arg>Killing ODL${member} ${member_ip}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:35.351974" elapsed="0.155697"/>
</kw>
<kw name="Kill_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.509336" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:35.508951" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.509951" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:35.509574" elapsed="0.000402"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:35.510038" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:35.510196" level="INFO">${kill_index_list} = [3]</msg>
<var>${kill_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:35.508535" elapsed="0.001686"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.511215" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:35.510840" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.511748" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:35.511399" elapsed="0.000376"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:35.511820" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:35.511973" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${original_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:35.510446" elapsed="0.001551"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.513463" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:35.513094" elapsed="0.000395"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.513999" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:35.513702" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:35.514070" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:35.514221" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:35.512725" elapsed="0.001520"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:35.515305" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:35.515039" elapsed="0.000292"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.516139" level="INFO">index=405
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:35.515978" elapsed="0.000319"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.519797" elapsed="0.000091"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:35.519072" elapsed="0.000932"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.519051" elapsed="0.000983"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.520341" level="INFO">index=405
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:35.520193" elapsed="0.000544"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.521906" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:35.520922" elapsed="0.001050"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.522949" level="INFO">${conn_id} = 406</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:35.522148" elapsed="0.000832"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.524733" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:35.525006" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:35.524111" elapsed="0.000997"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:35.525410" elapsed="0.000654"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.527447" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:35.851110" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:57:01 UTC 2026

  System load:  1.02               Processes:             124
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:02 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:35.527106" elapsed="0.324324"/>
</kw>
<msg time="2026-04-10T00:57:35.851745" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:35.526388" elapsed="0.325561"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:35.523344" elapsed="0.328842"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:35.853112" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | awk '{print "kill -9 " $1}' | sh'.</msg>
<msg time="2026-04-10T00:57:35.876442" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:57:35.876852" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:35.876955" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:35.852559" elapsed="0.024449"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:35.877624" elapsed="0.000518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.880177" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:35.878610" elapsed="0.001676"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.881055" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.880562" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.880494" elapsed="0.000898"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:35.882001" elapsed="0.000071"/>
</return>
<status status="PASS" start="2026-04-10T00:57:35.881520" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.881484" elapsed="0.000885"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.882449" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:35.889850" elapsed="0.000301"/>
</kw>
<msg time="2026-04-10T00:57:35.890272" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:35.888040" elapsed="0.002409"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.890943" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.891442" elapsed="0.000070"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:35.883222" elapsed="0.008550"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:35.518427" elapsed="0.373481"/>
</kw>
<msg time="2026-04-10T00:57:35.891985" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:35.517789" elapsed="0.374268"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:57:35.517057" elapsed="0.375113"/>
</kw>
<msg time="2026-04-10T00:57:35.892229" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:35.516465" elapsed="0.376235"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:35.896318" elapsed="0.000209"/>
</kw>
<msg time="2026-04-10T00:57:35.896572" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:35.895750" elapsed="0.000904"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.896815" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:35.896979" elapsed="0.000021"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:35.893131" elapsed="0.003931"/>
</kw>
<msg time="2026-04-10T00:57:35.897155" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:57:35.515551" elapsed="0.381630"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.897647" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:35.897373" elapsed="0.000317"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:57:35.897734" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:57:35.514637" elapsed="0.383235"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:35.514440" elapsed="0.383470"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:35.514305" elapsed="0.383642"/>
</for>
<arg>command=${NODE_KILL_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:57:35.512220" elapsed="0.385784"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:35.898469" level="INFO">${updated_index_list} = [1, 2, 3]</msg>
<var>${updated_index_list}</var>
<arg>@{index_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:35.898162" elapsed="0.000333"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{kill_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:57:35.898669" elapsed="0.000217"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-10T00:57:35.899066" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:35.898960" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:35.898941" elapsed="0.000190"/>
</if>
<kw name="Sleep" owner="BuiltIn">
<msg time="2026-04-10T00:57:36.899833" level="INFO">Slept 1 second.</msg>
<msg time="2026-04-10T00:57:36.899983" level="INFO">Kill -9 closes open files, which may take longer than ssh overhead, but not long enough to warrant WUKS.</msg>
<arg>1s</arg>
<arg>Kill -9 closes open files, which may take longer than ssh overhead, but not long enough to warrant WUKS.</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="PASS" start="2026-04-10T00:57:35.899272" elapsed="1.000841"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Verify_Karaf_Is_Not_Running_On_Member" owner="ClusterManagement">
<kw name="Count_Running_Karafs_On_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:36.903926" level="INFO">${command} = ps axf | grep org.apache.karaf | grep -v grep | wc -l</msg>
<var>${command}</var>
<arg>${NODE_KARAF_COUNT_COMMAND}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:36.903170" elapsed="0.000817"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:36.906029" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:36.905370" elapsed="0.000724"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:36.908075" level="INFO">index=405
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:36.907734" elapsed="0.000622"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:36.917208" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:36.916506" elapsed="0.000802"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:36.916458" elapsed="0.000921"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:36.918095" level="INFO">index=405
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:36.917673" elapsed="0.000826"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:36.919480" level="INFO">Attempting to execute command "ps axf | grep org.apache.karaf | grep -v grep | wc -l" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:36.918796" elapsed="0.000979"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:36.920938" level="INFO">${conn_id} = 407</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:36.920065" elapsed="0.000996"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:36.922717" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:36.922800" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:36.922372" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:36.923041" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:36.924379" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:37.248690" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:57:01 UTC 2026

  System load:  1.02               Processes:             124
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:35 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:36.924052" elapsed="0.324794"/>
</kw>
<msg time="2026-04-10T00:57:37.248935" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:36.923679" elapsed="0.325347"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:36.921498" elapsed="0.327766"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:37.250161" level="INFO">Executing command 'ps axf | grep org.apache.karaf | grep -v grep | wc -l'.</msg>
<msg time="2026-04-10T00:57:37.273272" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:57:37.274084" level="INFO">${stdout} = 0</msg>
<msg time="2026-04-10T00:57:37.274468" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:37.249663" elapsed="0.025070"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:37.275447" elapsed="0.001204"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:37.279290" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:37.277985" elapsed="0.001859"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:37.280549" elapsed="0.000066"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:37.280121" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:37.280034" elapsed="0.000745"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:37.281323" elapsed="0.000092"/>
</return>
<status status="PASS" start="2026-04-10T00:57:37.280966" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:37.280910" elapsed="0.000695"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:37.281738" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:37.290940" elapsed="0.000201"/>
</kw>
<msg time="2026-04-10T00:57:37.291213" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:37.290065" elapsed="0.001278"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:37.291686" elapsed="0.000040"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:37.291973" elapsed="0.000035"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:37.282688" elapsed="0.009443"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:36.913639" elapsed="0.378738"/>
</kw>
<msg time="2026-04-10T00:57:37.292492" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:36.911521" elapsed="0.381028"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:57:36.910114" elapsed="0.382595"/>
</kw>
<msg time="2026-04-10T00:57:37.292750" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:36.908770" elapsed="0.384027"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:37.296190" elapsed="0.000197"/>
</kw>
<msg time="2026-04-10T00:57:37.296431" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:37.295732" elapsed="0.000760"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:37.296673" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:37.296840" elapsed="0.000020"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:37.293114" elapsed="0.003807"/>
</kw>
<msg time="2026-04-10T00:57:37.297015" level="INFO">${output} = 0</msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:57:36.906777" elapsed="0.390262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:37.297506" level="INFO">0</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:37.297252" elapsed="0.000303"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:57:37.297667" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:57:37.297833" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>command=${command}</arg>
<arg>member_index=${member_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:57:36.904427" elapsed="0.393432"/>
</kw>
<return>
<value>${count}</value>
<status status="PASS" start="2026-04-10T00:57:37.297905" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:57:37.298049" level="INFO">${count} = 0</msg>
<var>${count}</var>
<arg>member_index=${member_index}</arg>
<doc>Remotely execute grep for karaf process, return count as string.</doc>
<status status="PASS" start="2026-04-10T00:57:36.902229" elapsed="0.395846"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>0</arg>
<arg>${count}</arg>
<arg>Found running Karaf count: ${count}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-04-10T00:57:37.298236" elapsed="0.000402"/>
</kw>
<arg>member_index=${index}</arg>
<doc>Fail if non-zero karaf instances are counted on member of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:36.901265" elapsed="0.397440"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:36.900768" elapsed="0.397968"/>
</iter>
<var>${index}</var>
<value>@{kill_index_list}</value>
<status status="PASS" start="2026-04-10T00:57:36.900297" elapsed="0.398475"/>
</for>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:37.302063" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:37.301666" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:37.302560" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:37.302251" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:37.302646" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:37.302801" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:37.301266" elapsed="0.001560"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:37.303977" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:37.303667" elapsed="0.000337"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:37.304814" level="INFO">index=405
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:37.304651" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:37.308454" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:37.307715" elapsed="0.000930"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:37.307693" elapsed="0.000981"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:37.309196" level="INFO">index=405
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:37.309050" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:37.310518" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:37.309561" elapsed="0.001039"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:37.311683" level="INFO">${conn_id} = 408</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:37.310780" elapsed="0.000931"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:37.313384" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:37.313666" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:37.312855" elapsed="0.000910"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:37.314063" elapsed="0.000615"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:37.315956" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:37.634554" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:57:00 UTC 2026

  System load:  0.63               Processes:             126
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:00 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:37.315635" elapsed="0.319338"/>
</kw>
<msg time="2026-04-10T00:57:37.635289" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:37.314979" elapsed="0.320541"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:37.311981" elapsed="0.323890"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:37.637248" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:57:37.650789" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:57:37.651276" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:37.651397" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:37.636621" elapsed="0.014816"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:37.652060" elapsed="0.000796"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:37.654476" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:37.653334" elapsed="0.001286"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:37.655239" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:37.654845" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:37.654779" elapsed="0.000763"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:37.655972" elapsed="0.000073"/>
</return>
<status status="PASS" start="2026-04-10T00:57:37.655678" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:37.655645" elapsed="0.000630"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:37.656346" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:37.663757" elapsed="0.000199"/>
</kw>
<msg time="2026-04-10T00:57:37.664043" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:37.662317" elapsed="0.001890"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:37.664618" elapsed="0.000052"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:37.665016" elapsed="0.000058"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:37.657113" elapsed="0.008160"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:37.307079" elapsed="0.358326"/>
</kw>
<msg time="2026-04-10T00:57:37.665631" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:37.306150" elapsed="0.359552"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:57:37.305618" elapsed="0.360202"/>
</kw>
<msg time="2026-04-10T00:57:37.665884" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:37.305098" elapsed="0.360857"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:37.670884" elapsed="0.000259"/>
</kw>
<msg time="2026-04-10T00:57:37.671212" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:37.670080" elapsed="0.001226"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:37.671548" elapsed="0.000057"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:37.671818" elapsed="0.000028"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:37.666406" elapsed="0.005526"/>
</kw>
<msg time="2026-04-10T00:57:37.672117" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:57:37.304224" elapsed="0.367935"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:37.672784" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:37.672470" elapsed="0.000359"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:57:37.672886" elapsed="0.000043"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:57:37.303193" elapsed="0.369853"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:37.303017" elapsed="0.370084"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:37.674672" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:37.674227" elapsed="0.000484"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:37.675957" level="INFO">index=405
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:37.675712" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:37.680914" elapsed="0.000108"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:37.679718" elapsed="0.001442"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:37.679677" elapsed="0.001533"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:37.681644" level="INFO">index=405
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:37.681422" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:37.683411" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:37.682111" elapsed="0.001386"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:37.684777" level="INFO">${conn_id} = 409</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:37.683769" elapsed="0.001038"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:37.687230" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:37.687515" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:37.686477" elapsed="0.001161"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:37.687955" elapsed="0.000707"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:37.690021" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:38.047626" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:57:01 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:01 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:37.689670" elapsed="0.358144"/>
</kw>
<msg time="2026-04-10T00:57:38.048024" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:37.688987" elapsed="0.359165"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:37.685114" elapsed="0.363217"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:38.049060" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:57:38.062217" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:57:38.062526" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:38.062680" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:38.048661" elapsed="0.014074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:38.063243" elapsed="0.000555"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:38.065464" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:38.064231" elapsed="0.001409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:38.066285" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:38.065862" elapsed="0.000658"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.065808" elapsed="0.000808"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:38.067095" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-04-10T00:57:38.066745" elapsed="0.000611"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.066708" elapsed="0.000710"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:38.067497" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:38.073870" elapsed="0.000218"/>
</kw>
<msg time="2026-04-10T00:57:38.074174" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:38.072392" elapsed="0.001942"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.074837" elapsed="0.000068"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.075296" elapsed="0.000060"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:38.068263" elapsed="0.007302"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:37.678882" elapsed="0.396840"/>
</kw>
<msg time="2026-04-10T00:57:38.075797" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:37.677837" elapsed="0.398029"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:57:37.677107" elapsed="0.398872"/>
</kw>
<msg time="2026-04-10T00:57:38.076035" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:37.676396" elapsed="0.399703"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:38.081052" elapsed="0.000241"/>
</kw>
<msg time="2026-04-10T00:57:38.081337" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:38.080449" elapsed="0.000975"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.081619" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.081788" elapsed="0.000020"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:38.076552" elapsed="0.005319"/>
</kw>
<msg time="2026-04-10T00:57:38.081966" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:57:37.675010" elapsed="0.406982"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:38.082446" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:38.082169" elapsed="0.000320"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:57:38.082532" elapsed="0.000034"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:57:37.673574" elapsed="0.409111"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:37.673280" elapsed="0.409443"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:38.083732" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:38.083434" elapsed="0.000326"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:38.084550" level="INFO">index=405
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:38.084391" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.087974" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:38.087283" elapsed="0.000857"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.087264" elapsed="0.000903"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:38.088458" level="INFO">index=405
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:38.088318" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:38.089807" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:38.088829" elapsed="0.001042"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:38.090805" level="INFO">${conn_id} = 410</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:38.090051" elapsed="0.000781"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:38.092354" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:38.092639" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:38.091827" elapsed="0.000911"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:38.093032" elapsed="0.000629"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:38.094931" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:38.402668" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:57:01 UTC 2026

  System load:  1.02               Processes:             124
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:37 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:38.094612" elapsed="0.308356"/>
</kw>
<msg time="2026-04-10T00:57:38.403121" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:38.093963" elapsed="0.309279"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:38.091100" elapsed="0.312309"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:38.404115" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:57:38.416956" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:57:38.417259" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:38.417359" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:38.403721" elapsed="0.013691"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:38.417946" elapsed="0.000470"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:38.420138" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:38.418924" elapsed="0.001353"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:38.420957" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:38.420494" elapsed="0.000704"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.420438" elapsed="0.000818"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:38.421774" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-04-10T00:57:38.421379" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.421344" elapsed="0.000757"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:38.422184" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:38.428899" elapsed="0.000234"/>
</kw>
<msg time="2026-04-10T00:57:38.429220" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:38.427269" elapsed="0.002108"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.429876" elapsed="0.000068"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.430333" elapsed="0.000063"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:38.423009" elapsed="0.007632"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:38.086678" elapsed="0.344104"/>
</kw>
<msg time="2026-04-10T00:57:38.430873" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:38.086020" elapsed="0.344928"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:57:38.085469" elapsed="0.345598"/>
</kw>
<msg time="2026-04-10T00:57:38.431221" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:38.084877" elapsed="0.346427"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:38.434863" elapsed="0.000185"/>
</kw>
<msg time="2026-04-10T00:57:38.435092" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:38.434344" elapsed="0.000808"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.435351" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.435520" elapsed="0.000025"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:38.431755" elapsed="0.003878"/>
</kw>
<msg time="2026-04-10T00:57:38.435749" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:57:38.083980" elapsed="0.351799"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:38.436227" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:38.435976" elapsed="0.000293"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:57:38.436312" elapsed="0.000028"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:57:38.083015" elapsed="0.353481"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:38.082827" elapsed="0.353708"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:37.302884" elapsed="1.133709"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:57:37.298999" elapsed="1.137656"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-10T00:57:38.436698" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:57:38.436865" level="INFO">${updated_index_list} = [1, 2]</msg>
<var>${updated_index_list}</var>
<arg>${index_list}</arg>
<arg>${original_index_list}</arg>
<arg>${confirm}</arg>
<doc>If the list is empty, kill all ODL instances. Otherwise, kill members based on ${kill_index_list}
If ${confirm} is True, sleep 1 second and verify killed instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-04-10T00:57:35.508027" elapsed="2.928863"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-10T00:57:38.436943" elapsed="0.000026"/>
</return>
<arg>${Follower_Node_2}</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="PASS" start="2026-04-10T00:57:35.341691" elapsed="3.095378"/>
</kw>
<doc>Kill Follower Node2.</doc>
<status status="PASS" start="2026-04-10T00:57:35.002500" elapsed="3.434691"/>
</test>
<test id="s1-s3-t36" name="Stop Mininet Connected To Follower Node2 and Exit" line="262">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:57:38.441618" elapsed="0.000328"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:57:38.441216" elapsed="0.000813"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:38.443523" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:38.443303" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.443276" elapsed="0.000370"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:38.448877" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:38.448771" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.448753" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:38.449945" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:38.449549" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:38.450434" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:38.450132" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:38.450504" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:38.450677" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:38.449170" elapsed="0.001532"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:38.456245" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:38.456136" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.456117" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:38.457475" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:38.457369" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.457352" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:38.458017" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:38.457709" elapsed="0.000334"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:38.458688" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:38.458201" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:38.499589" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:38.459216" elapsed="0.040540"/>
</kw>
<msg time="2026-04-10T00:57:38.499961" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:38.500008" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:38.458880" elapsed="0.041165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:38.575044" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "a "n "d "[C "E "x "i "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:38.500782" elapsed="0.074552"/>
</kw>
<msg time="2026-04-10T00:57:38.575522" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:38.575594" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:38.500269" elapsed="0.075367"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.576051" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:38.575746" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.575714" elapsed="0.000424"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:38.576650" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "a "n "d "[C "E "x "i "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:38.576283" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.577039" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:38.576818" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.576799" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:38.577155" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:38.579962" elapsed="0.000179"/>
</kw>
<msg time="2026-04-10T00:57:38.580203" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:38.578765" elapsed="0.001572"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.580638" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.580969" elapsed="0.000076"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:38.578094" elapsed="0.003061"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:38.577490" elapsed="0.003732"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:38.457066" elapsed="0.124253"/>
</kw>
<msg time="2026-04-10T00:57:38.581416" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:38.581459" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:38.456468" elapsed="0.125028"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:38.581704" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:57:38.581595" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.581558" elapsed="0.000230"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.582195" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.582536" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:38.582635" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:38.455756" elapsed="0.126989"/>
</kw>
<msg time="2026-04-10T00:57:38.582842" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:38.582886" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:38.451085" elapsed="0.131839"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.583246" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:38.582999" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.582982" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:38.450933" elapsed="0.132411"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:38.589093" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:38.588985" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.588966" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:38.590298" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:38.590191" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.590174" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:38.590836" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:38.590510" elapsed="0.000353"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:38.591262" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:38.591022" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:38.623062" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:38.591824" elapsed="0.031497"/>
</kw>
<msg time="2026-04-10T00:57:38.623622" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:38.623674" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:38.591449" elapsed="0.032262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:38.720336" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "a "n "d "[C "E "x "i "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:38.624528" elapsed="0.095955"/>
</kw>
<msg time="2026-04-10T00:57:38.720675" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:38.720723" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:38.624010" elapsed="0.096750"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.721169" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:38.720873" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.720839" elapsed="0.000419"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:38.721765" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "a "n "d "[C "E "x "i "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:38.721408" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.722158" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:38.721932" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.721913" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:38.722279" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:38.725193" elapsed="0.000192"/>
</kw>
<msg time="2026-04-10T00:57:38.725449" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:38.723949" elapsed="0.001675"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.725906" elapsed="0.000118"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.726290" elapsed="0.000073"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:38.723256" elapsed="0.003219"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:38.722656" elapsed="0.003889"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:38.589884" elapsed="0.136780"/>
</kw>
<msg time="2026-04-10T00:57:38.726759" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:38.726973" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:38.589312" elapsed="0.137771"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:38.727280" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:57:38.727168" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.727149" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.727833" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.728178" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:38.728252" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:38.588594" elapsed="0.139771"/>
</kw>
<msg time="2026-04-10T00:57:38.728463" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:38.728507" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:38.583654" elapsed="0.144895"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:38.728899" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:38.728642" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.728624" elapsed="0.000352"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:38.583475" elapsed="0.145525"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:38.734535" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:38.734427" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.734408" elapsed="0.000302"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:38.735879" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:38.735769" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:38.735751" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:38.736440" level="INFO">${karaf_connection_index} = 374</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:38.736131" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:38.736887" level="INFO">${current_connection_index} = 405</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:38.736645" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:38.737718" level="FAIL">OSError: Socket is closed</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:57:38.737416" elapsed="0.001058">OSError: Socket is closed</status>
</kw>
<msg time="2026-04-10T00:57:38.738683" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:57:38.738730" level="INFO">${message_write} = OSError: Socket is closed</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:38.737078" elapsed="0.001676"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:48.739991" level="FAIL">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:57:38.739276" elapsed="10.001626">No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</status>
</kw>
<msg time="2026-04-10T00:57:48.741209" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:57:48.741265" level="INFO">${message_wait} = No match found for 'opendaylight-user.*root.*&gt;' in 10 seconds
Output:
.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:38.738926" elapsed="10.002367"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:57:48.742588" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node2 and Exit"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:57:48.741797" elapsed="0.000862">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node2 and Exit"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:57:48.741430" elapsed="0.001305">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node2 and Exit"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:57:48.741393" elapsed="0.001379">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node2 and Exit"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:48.743098" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:48.743346" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:48.743196" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:57:48.743177" elapsed="0.000250"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:57:48.743467" elapsed="0.000020"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:48.746365" elapsed="0.000220"/>
</kw>
<msg time="2026-04-10T00:57:48.746663" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:48.745131" elapsed="0.001668"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:48.747125" elapsed="0.000085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:48.747480" elapsed="0.000143"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:48.744443" elapsed="0.003299"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:48.743823" elapsed="0.003987"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:57:38.735434" elapsed="10.012473">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node2 and Exit"</status>
</kw>
<msg time="2026-04-10T00:57:48.748030" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:57:48.748076" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Stop Mininet Connected To Follower Node2 and ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:38.734865" elapsed="10.013235"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:48.748299" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:48.748180" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:48.748162" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:48.749249" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:48.749132" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:48.749113" elapsed="0.000212"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:48.749705" level="INFO">index=405
host=10.30.170.218
alias=None
port=22
timeout=30 seconds
newline=

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

prompt=&gt;
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:48.749484" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:48.750314" level="INFO">{1: 299, 2: 303, 3: 374}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:48.750015" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:48.750800" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:48.750533" elapsed="0.000311"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:48.751420" elapsed="0.000350"/>
</kw>
<msg time="2026-04-10T00:57:48.751872" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:48.751920" level="INFO">${old_connection_index} = 374</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:48.751031" elapsed="0.000912"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:48.752842" elapsed="0.000228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:48.754246" level="FAIL">OSError: Socket is closed</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:57:48.753782" elapsed="0.001521">OSError: Socket is closed</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:48.753243" elapsed="0.002170"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:48.756127" elapsed="0.000365"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:48.755649" elapsed="0.000950"/>
</kw>
<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="PASS" start="2026-04-10T00:57:48.752254" elapsed="0.004432"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:48.752020" elapsed="0.004721"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:48.752002" elapsed="0.004766"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:48.757719" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:48.757313" elapsed="0.000437"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:57:48.757807" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:57:48.757985" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:48.756984" elapsed="0.001030"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:48.758205" elapsed="0.000503"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:48.759072" level="INFO">index=411
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:48.758887" elapsed="0.000324"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:57:48.759364" elapsed="0.002401"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:57:48.762203" level="INFO">Logging into '10.30.171.151:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:57:48.763382" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</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="FAIL" start="2026-04-10T00:57:48.761937" elapsed="0.002342">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:48.781905" elapsed="0.000439"/>
</kw>
<msg time="2026-04-10T00:57:48.782435" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:48.780401" elapsed="0.002202"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:48.782768" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:48.782933" elapsed="0.000021"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:48.766155" elapsed="0.016861"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:48.764954" elapsed="0.018108"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:57:48.748819" elapsed="0.034357">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:48.783532" elapsed="0.000277"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:48.783860" 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="FAIL" start="2026-04-10T00:57:38.734075" elapsed="10.049896">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<msg time="2026-04-10T00:57:48.784083" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:57:48.784127" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:38.729285" elapsed="10.054865"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:48.784490" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:48.784231" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:48.784213" elapsed="0.000375"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:38.729139" elapsed="10.055474"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:38.450759" elapsed="10.334038"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:38.448387" elapsed="10.336471"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:57:38.442889" elapsed="10.342073"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:38.442248" elapsed="10.342763"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:57:38.438133" elapsed="10.346935"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:48.790265" elapsed="0.000168"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:48.790042" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:48.790024" elapsed="0.000471"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:48.794070" level="INFO">exit</msg>
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:48.790652" elapsed="0.003474"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:57:48.943784" level="INFO">*** Stopping 1 controllers
c0 
*** Stopping 2 links
..
*** Stopping 1 switches
s1 
*** Stopping 2 hosts
h1 h2 
*** Done
completed in 21.339 seconds
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:57:48.794287" elapsed="0.149664"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:48.944235" elapsed="0.000260"/>
</kw>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="PASS" start="2026-04-10T00:57:48.789767" elapsed="0.154826"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:48.947722" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:48.947372" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:48.947348" elapsed="0.000465"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:48.948128" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:48.947970" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:48.948888" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:48.948426" elapsed="0.000510"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:48.949477" level="INFO">${conn_id} = 412</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:48.949101" elapsed="0.000414"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:48.950945" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:48.951063" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:48.950493" elapsed="0.000606"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:48.951341" elapsed="0.000516"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:48.953216" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:49.305201" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:57:14 UTC 2026

  System load:  0.0                Processes:             112
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:27 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:48.952719" elapsed="0.352681"/>
</kw>
<msg time="2026-04-10T00:57:49.305514" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:48.952112" elapsed="0.353536"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:48.949895" elapsed="0.355912"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:49.306468" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:57:50.490791" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:57:50.491379" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:50.491494" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:49.306142" elapsed="1.185454"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:50.492095" elapsed="0.000658"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:50.493861" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:50.493188" elapsed="0.000797"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:50.494472" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:50.494175" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:50.494124" elapsed="0.000549"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:50.495035" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-04-10T00:57:50.494794" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:50.494760" elapsed="0.000470"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:50.495306" elapsed="0.000211"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:50.503364" elapsed="0.000532"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:50.504135" elapsed="0.000230"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:50.504601" elapsed="0.000140"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:50.496586" elapsed="0.008230"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:48.946812" elapsed="1.558132"/>
</kw>
<msg time="2026-04-10T00:57:50.505021" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:48.945846" elapsed="1.559247"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:57:48.945299" elapsed="1.559901"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:50.508161" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:50.507769" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:50.507742" elapsed="0.000533"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:50.508669" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:50.508485" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:50.509335" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:50.508953" elapsed="0.000429"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:50.509923" level="INFO">${conn_id} = 414</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:50.509540" elapsed="0.000409"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:50.510918" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:50.510995" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:50.510637" elapsed="0.000381"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:50.511243" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:50.512425" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:50.871225" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:57:14 UTC 2026

  System load:  0.0                Processes:             112
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:49 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:50.512116" elapsed="0.359289"/>
</kw>
<msg time="2026-04-10T00:57:50.871500" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:50.511764" elapsed="0.359848"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:50.510167" elapsed="0.361586"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:50.872271" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:57:50.905360" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:57:50.905530" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:50.905637" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:50.872018" elapsed="0.033673"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:50.906131" elapsed="0.045455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:50.952305" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:50.951919" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:50.952598" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:50.952435" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:50.952412" elapsed="0.000290"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:50.952864" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:57:50.952756" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:50.952740" elapsed="0.000214"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:50.952990" elapsed="0.000014"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:50.955866" 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-04-10T00:57:50.956360" elapsed="0.000161"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:50.956694" elapsed="0.000102"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:50.953332" elapsed="0.003517"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:50.506965" elapsed="0.449978"/>
</kw>
<msg time="2026-04-10T00:57:50.956997" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:50.506170" elapsed="0.450878"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:57:50.505457" elapsed="0.451671"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:48.944866" elapsed="2.012317"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="PASS" start="2026-04-10T00:57:38.437492" elapsed="12.519794"/>
</test>
<test id="s1-s3-t37" name="Restart Follower Node2" line="267">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:57:50.961138" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:57:50.960871" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:50.962523" elapsed="0.000135"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:50.962414" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:50.962396" elapsed="0.000322"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:50.967925" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:50.967820" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:50.967802" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:50.969000" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:50.968612" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:50.969492" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:50.969189" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:50.969579" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:50.969737" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:50.968219" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:50.975230" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:50.975121" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:50.975103" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:50.976480" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:50.976373" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:50.976356" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:50.977028" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:50.976728" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:50.977439" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:50.977218" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.008824" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:50.977989" elapsed="0.031095"/>
</kw>
<msg time="2026-04-10T00:57:51.009341" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:51.009392" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:50.977645" elapsed="0.031787"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.064037" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "R "e "s "t "a "r "t "[C "[78CF "[A[78Co
 "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:51.010238" elapsed="0.054055"/>
</kw>
<msg time="2026-04-10T00:57:51.064533" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:51.064607" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.009745" elapsed="0.054903"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.065137" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.064778" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.064740" elapsed="0.000492"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.065815" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "R "e "s "t "a "r "t "[C "[78CF "[A[78Co
 "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:51.065385" elapsed="0.000518"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.066197" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.065973" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.065954" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:51.066398" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:51.068127" elapsed="0.001038"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.069478" elapsed="0.000496"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.070247" elapsed="0.000391"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:51.067424" elapsed="0.003318"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:51.066770" elapsed="0.004039"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:50.976072" elapsed="0.094842"/>
</kw>
<msg time="2026-04-10T00:57:51.071058" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:51.071105" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:50.975453" elapsed="0.095690"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:51.071399" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-04-10T00:57:51.071257" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.071229" elapsed="0.000301"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.071968" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.072314" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.072388" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:50.974780" elapsed="0.097720"/>
</kw>
<msg time="2026-04-10T00:57:51.072615" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:51.072662" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:50.970138" elapsed="0.102561"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.073033" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.072778" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.072760" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:50.969991" elapsed="0.103146"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.078927" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.078816" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.078795" elapsed="0.000238"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.080230" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.080120" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.080102" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:51.080842" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.080447" elapsed="0.000423"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.081256" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:51.081033" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.116176" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:51.081828" elapsed="0.034493"/>
</kw>
<msg time="2026-04-10T00:57:51.116514" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:51.116589" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.081444" elapsed="0.035185"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.171635" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "R "e "s "t "a "r "t "[C "[78CF "[A[78Co
 "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:51.117239" elapsed="0.054645"/>
</kw>
<msg time="2026-04-10T00:57:51.172058" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:51.172107" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.116839" elapsed="0.055306"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.172505" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.172250" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.172221" elapsed="0.000392"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.173078" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "R "e "s "t "a "r "t "[C "[78CF "[A[78Co
 "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:51.172762" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.173451" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.173232" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.173213" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:51.173584" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:51.175121" elapsed="0.000870"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.176277" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.177036" elapsed="0.000576"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:51.174455" elapsed="0.003262"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:51.173894" elapsed="0.003887"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:51.079807" elapsed="0.098075"/>
</kw>
<msg time="2026-04-10T00:57:51.177975" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:51.178019" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.079193" elapsed="0.098864"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:51.178244" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:57:51.178135" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.178116" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.178758" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.179096" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.179170" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:51.078392" elapsed="0.100886"/>
</kw>
<msg time="2026-04-10T00:57:51.179372" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:51.179416" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.073420" elapsed="0.106033"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.179832" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.179528" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.179511" elapsed="0.000398"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:51.073274" elapsed="0.106659"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.186012" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.185859" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.185832" elapsed="0.000300"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.187981" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.187823" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.187795" elapsed="0.000285"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:51.188762" level="INFO">${karaf_connection_index} = 411</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.188322" elapsed="0.000468"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.189239" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:51.188975" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.190082" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.189806" elapsed="0.001003">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:57:51.190998" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:57:51.191045" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.189434" elapsed="0.001642"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.191891" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.191618" elapsed="0.000944">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:57:51.192752" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:57:51.192797" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.191254" elapsed="0.001566"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.193789" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart Follower Node2"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.193136" elapsed="0.000718">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart Follower Node2"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:57:51.192896" elapsed="0.001030">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart Follower Node2"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:57:51.192877" elapsed="0.001253">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart Follower Node2"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.194299" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.194530" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.194387" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:57:51.194370" elapsed="0.000259"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.194662" elapsed="0.000016"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:51.196175" elapsed="0.000796"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.197266" elapsed="0.000637"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.198172" elapsed="0.000355"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:51.195478" elapsed="0.003172"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:51.194926" elapsed="0.003789"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.187301" elapsed="0.011503">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart Follower Node2"</status>
</kw>
<msg time="2026-04-10T00:57:51.198908" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:57:51.198952" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Restart Follower Node2"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.186352" elapsed="0.012624"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.199198" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.199088" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.199069" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.200115" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.200008" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.199990" elapsed="0.000194"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.200478" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.200338" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.201047" level="INFO">{1: 299, 2: 303, 3: 411}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:51.200785" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.201491" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:51.201246" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.202130" elapsed="0.000263"/>
</kw>
<msg time="2026-04-10T00:57:51.202493" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:51.202539" level="INFO">${old_connection_index} = 411</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.201763" elapsed="0.000818"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:51.203403" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.204760" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.204333" elapsed="0.001423">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.203842" elapsed="0.002015"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.206500" elapsed="0.000296"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.206029" elapsed="0.000852"/>
</kw>
<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="PASS" start="2026-04-10T00:57:51.202885" elapsed="0.004041"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:51.202660" elapsed="0.004315"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.202642" elapsed="0.004358"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:51.207935" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.207536" elapsed="0.000427"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:57:51.208011" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:57:51.208165" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:51.207208" elapsed="0.000981"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.208348" elapsed="0.000431"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.209092" level="INFO">index=419
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.208951" 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-04-10T00:57:51.209371" elapsed="0.002588"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.212438" level="INFO">Logging into '10.30.171.151:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:57:51.213613" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</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="FAIL" start="2026-04-10T00:57:51.212161" elapsed="0.001954">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:51.227433" elapsed="0.000581"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.228185" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.228485" elapsed="0.000289"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:51.214932" elapsed="0.013895"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:51.214396" elapsed="0.014475"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.199680" elapsed="0.029274">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.229281" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.229354" 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="FAIL" start="2026-04-10T00:57:51.185342" elapsed="0.044115">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<msg time="2026-04-10T00:57:51.229578" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:57:51.229623" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.180207" elapsed="0.049440"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.229977" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.229724" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.229706" elapsed="0.000347"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:51.180064" elapsed="0.050014"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:50.969819" elapsed="0.260289"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:50.967438" elapsed="0.262731"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:57:50.962085" elapsed="0.268143"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:50.961632" elapsed="0.268644"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:57:50.958493" elapsed="0.271839"/>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<kw name="ClusterManagement__Build_List" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.233735" level="INFO">${member_int} = 3</msg>
<var>${member_int}</var>
<arg>${member}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:57:51.233408" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.234206" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>${member_int}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:51.233916" elapsed="0.000317"/>
</kw>
<return>
<value>${index_list}</value>
<status status="PASS" start="2026-04-10T00:57:51.234278" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:57:51.234433" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>${member}</arg>
<status status="PASS" start="2026-04-10T00:57:51.233088" elapsed="0.001370"/>
</kw>
<kw name="Return_Member_IP" owner="ClusterManagement">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.235292" level="INFO">${member_int} = 3</msg>
<var>${member_int}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:57:51.234988" elapsed="0.000330"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:51.235745" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_int}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.235469" elapsed="0.000302"/>
</kw>
<return>
<value>${member_ip}</value>
<status status="PASS" start="2026-04-10T00:57:51.235817" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:57:51.235991" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>${member}</arg>
<doc>Return the IP address of the member given the member_index.</doc>
<status status="PASS" start="2026-04-10T00:57:51.234666" elapsed="0.001349"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.238746" level="INFO">${msg} = Starting ODL3 10.30.171.151</msg>
<var>${msg}</var>
<arg>"${msg}" == "${EMPTY}"</arg>
<arg>Starting ODL${member} ${member_ip}</arg>
<arg>Starting ODL${member} ${member_ip}, ${msg}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:51.236174" elapsed="0.002600"/>
</kw>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.245658" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.245534" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.245516" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.246775" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:51.246378" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.247264" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:51.246962" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:51.247333" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:57:51.247487" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:51.245996" elapsed="0.001515"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.253041" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.252933" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.252916" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.254251" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.254142" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.254123" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:51.254703" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.254466" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.255066" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:51.254887" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.285122" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "1 ". "1 "5 "1 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:51.255615" elapsed="0.029594"/>
</kw>
<msg time="2026-04-10T00:57:51.285318" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:51.285366" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.255260" elapsed="0.030143"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.288840" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:51.285957" elapsed="0.002942"/>
</kw>
<msg time="2026-04-10T00:57:51.288994" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:51.289038" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.285603" elapsed="0.003462"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.289367" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.289142" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.289122" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.289863" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:51.289607" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.290194" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.289978" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.289961" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:51.290306" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:51.291453" elapsed="0.000535"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.292158" elapsed="0.000193"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.292503" elapsed="0.000124"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:51.291092" elapsed="0.001588"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:51.290588" elapsed="0.002138"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:51.253830" elapsed="0.039058"/>
</kw>
<msg time="2026-04-10T00:57:51.292982" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:51.293027" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.253289" elapsed="0.039766"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:51.293240" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:57:51.293132" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.293114" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.293740" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.294073" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.294144" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:51.252595" elapsed="0.041658"/>
</kw>
<msg time="2026-04-10T00:57:51.294346" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:51.294390" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.247906" elapsed="0.046510"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.294760" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.294492" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.294475" elapsed="0.000362"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:57:51.247761" elapsed="0.047099"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.300211" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.300103" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.300085" elapsed="0.000230"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.301407" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.301301" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.301284" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:51.301853" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.301636" elapsed="0.000243"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.302208" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:51.302037" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.331518" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "7 "1 ". "1 "5 "1 "[K"</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:57:51.302742" elapsed="0.028930"/>
</kw>
<msg time="2026-04-10T00:57:51.331821" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:57:51.331867" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "O "D "L "3 "[C "1 "0 ". "3 "0 ". "1 "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.302393" elapsed="0.029510"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.335056" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:57:51.332639" elapsed="0.002478"/>
</kw>
<msg time="2026-04-10T00:57:51.335213" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:57:51.335257" level="INFO">${message_wait} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.332140" elapsed="0.003143"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.335642" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.335377" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.335350" elapsed="0.000444"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.336205" level="INFO">[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:51.335944" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.336575" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.336320" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.336303" elapsed="0.000351"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:57:51.336691" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:51.337934" 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-04-10T00:57:51.338471" elapsed="0.000193"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.338816" 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-04-10T00:57:51.337528" elapsed="0.001442"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:51.337000" elapsed="0.002016"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:57:51.300998" elapsed="0.038115"/>
</kw>
<msg time="2026-04-10T00:57:51.339207" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:51.339250" level="INFO">${message} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.300471" elapsed="0.038806"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:57:51.339461" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:57:51.339355" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.339337" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.339971" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.340584" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.340663" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:57:51.299763" elapsed="0.041009"/>
</kw>
<msg time="2026-04-10T00:57:51.340867" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:51.340910" level="INFO">${output} = [?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.295123" elapsed="0.045814"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.341275" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.341013" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.340996" elapsed="0.000356"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:57:51.294981" elapsed="0.046395"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.346871" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.346764" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.346746" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.348021" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.347917" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.347900" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:51.348453" level="INFO">${karaf_connection_index} = 419</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.348233" elapsed="0.000246"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.348866" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:51.348687" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.349595" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.349381" elapsed="0.000916">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:57:51.350409" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:57:51.350454" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.349050" elapsed="0.001428"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.351190" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.351009" elapsed="0.000695">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:57:51.351814" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:57:51.351859" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.350669" elapsed="0.001214"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.352499" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.352177" elapsed="0.000427">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:57:51.351959" elapsed="0.000716">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:57:51.351941" elapsed="0.000767">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.352869" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.353097" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.352956" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:57:51.352940" elapsed="0.000232"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.353205" elapsed="0.000014"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:51.354479" elapsed="0.000378"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.355024" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.355321" elapsed="0.000097"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:51.353977" elapsed="0.001492"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:51.353459" elapsed="0.002055"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.347616" elapsed="0.008006">Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</status>
</kw>
<msg time="2026-04-10T00:57:51.355723" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:57:51.355767" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting ODL3 10.30.171.151"</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.347094" elapsed="0.008696"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.355970" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.355866" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.355848" elapsed="0.000187"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.356852" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.356748" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.356730" elapsed="0.000189"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.357208" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.357071" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.357768" level="INFO">{1: 299, 2: 303, 3: 419}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:51.357489" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.358206" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:51.357966" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.358781" elapsed="0.000178"/>
</kw>
<msg time="2026-04-10T00:57:51.359098" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:57:51.359145" level="INFO">${old_connection_index} = 419</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.358406" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:57:51.359987" elapsed="0.000140"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.360808" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.360657" elapsed="0.000578">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.360293" elapsed="0.001004"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.361811" elapsed="0.000095"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.361463" elapsed="0.000489"/>
</kw>
<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="PASS" start="2026-04-10T00:57:51.359465" elapsed="0.002530"/>
</kw>
<status status="PASS" start="2026-04-10T00:57:51.359244" elapsed="0.002801"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.359226" elapsed="0.002844"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:51.362883" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.362614" elapsed="0.000295"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:57:51.362957" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:57:51.363109" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:51.362275" elapsed="0.000858"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.363288" elapsed="0.000422"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.364020" level="INFO">index=424
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.363881" elapsed="0.000265"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.364297" elapsed="0.002490"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.367214" level="INFO">Logging into '10.30.171.151:8101' as 'karaf'.</msg>
<msg time="2026-04-10T00:57:51.368128" level="FAIL">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</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="FAIL" start="2026-04-10T00:57:51.366955" elapsed="0.001554">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:51.371616" elapsed="0.000308"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.372089" elapsed="0.000144"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.372381" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:51.369339" elapsed="0.003191"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:57:51.368832" elapsed="0.003764"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.356412" elapsed="0.016293">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.373041" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.373116" 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="FAIL" start="2026-04-10T00:57:51.346400" elapsed="0.026820">NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</status>
</kw>
<msg time="2026-04-10T00:57:51.373361" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:57:51.373407" level="INFO">${output} = NoValidConnectionsError: [Errno None] Unable to connect to port 8101 on 10.30.171.151</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:57:51.341670" elapsed="0.031761"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.373789" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.373509" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.373491" elapsed="0.000377"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:51.341510" elapsed="0.032382"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:51.247584" elapsed="0.126338"/>
</for>
<arg>${msg}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:57:51.243451" elapsed="0.130529"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.380776" level="INFO">${base_command} = /tmp/karaf-0.23.1/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:51.380350" elapsed="0.000600"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.382827" level="INFO">${command} = /tmp/karaf-0.23.1/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:51.381669" elapsed="0.001224"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-10T00:57:51.383989" level="INFO">${epoch} = 1775782671.383772</msg>
<var>${epoch}</var>
<arg>time_zone=UTC</arg>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-10T00:57:51.383274" elapsed="0.000776"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.385525" level="INFO">${gc_filepath} = /tmp/karaf-0.23.1/data/log/gc_1775782671.383772.log</msg>
<var>${gc_filepath}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/data/log/gc_${epoch}.log</arg>
<arg>${GC_LOG_PATH}/gc_${epoch}.log</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:51.384435" elapsed="0.001186"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.386930" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782671.383772.log</msg>
<var>${gc_options}</var>
<arg>"docker" not in """${node_start_command}"""</arg>
<arg>-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${gc_filepath}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:51.386031" elapsed="0.000961"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.390682" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:51.389771" elapsed="0.000972"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.391844" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:51.391136" elapsed="0.000767"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:51.392025" elapsed="0.000087"/>
</return>
<msg time="2026-04-10T00:57:51.392410" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:51.388884" elapsed="0.003580"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:57:51.394347" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.394071" elapsed="0.000302"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.395227" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.395051" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.398985" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.398252" elapsed="0.000918"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.398228" elapsed="0.000973"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.399489" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.399358" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.400967" level="INFO">Attempting to execute command "/tmp/karaf-0.23.1/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782671.383772.log" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:51.399939" elapsed="0.001099"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.401993" level="INFO">${conn_id} = 426</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.401227" elapsed="0.000793"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.403641" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:57:51.403911" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:57:51.403047" elapsed="0.000964"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:51.404325" elapsed="0.000663"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.406322" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:57:51.793431" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:57:01 UTC 2026

  System load:  1.02               Processes:             124
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:38 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:57:51.405991" elapsed="0.387628"/>
</kw>
<msg time="2026-04-10T00:57:51.793775" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:51.405310" elapsed="0.388579"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:57:51.402302" elapsed="0.391755"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:57:51.794750" level="INFO">Executing command '/tmp/karaf-0.23.1/bin/start -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.23.1/data/log/gc_1775782671.383772.log'.</msg>
<msg time="2026-04-10T00:57:51.817829" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:57:51.818140" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:57:51.818239" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:57:51.794352" elapsed="0.023938"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.818848" elapsed="0.000546"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.821135" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:51.819886" elapsed="0.001349"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.821946" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.821456" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.821405" elapsed="0.000849"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:57:51.822775" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-10T00:57:51.822375" elapsed="0.000687"/>
</branch>
<status status="PASS" start="2026-04-10T00:57:51.822339" elapsed="0.000789"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.823262" elapsed="0.000040"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:51.829950" elapsed="0.000990"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.831436" elapsed="0.000526"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.832260" elapsed="0.000259"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:51.823899" elapsed="0.008780"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:57:51.397627" elapsed="0.435149"/>
</kw>
<msg time="2026-04-10T00:57:51.832887" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:51.396887" elapsed="0.436053"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:57:51.396291" elapsed="0.436728"/>
</kw>
<msg time="2026-04-10T00:57:51.833059" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:51.395518" elapsed="0.437585"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:57:51.835990" elapsed="0.000321"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:57:51.836478" elapsed="0.000168"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:57:51.836798" elapsed="0.000098"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:57:51.833414" elapsed="0.003533"/>
</kw>
<msg time="2026-04-10T00:57:51.837039" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:57:51.394618" elapsed="0.442446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.837502" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:51.837249" elapsed="0.000298"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:57:51.837607" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:57:51.393643" elapsed="0.444095"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:57:51.393024" elapsed="0.444751"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:57:51.392628" elapsed="0.445183"/>
</for>
<arg>command=${command} ${gc_options}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:57:51.387528" elapsed="0.450337"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.849885" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:57:51.849424" elapsed="0.000490"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.850535" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:57:51.850119" elapsed="0.000468"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:57:51.850635" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:57:51.850801" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:57:51.849037" elapsed="0.001789"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.852452" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:57:51.852142" elapsed="0.000336"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:57:51.852524" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:57:51.852711" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:57:51.851791" elapsed="0.000945"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.860767" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:51.860222" elapsed="0.000603"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:57:51.861470" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:57:51.860987" elapsed="0.000529"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:57:51.867806" level="FAIL">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.864292" elapsed="0.005495">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-10T00:57:51.861612" elapsed="0.008572">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.870394" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.870225" elapsed="0.000493"/>
</branch>
<status status="FAIL" start="2026-04-10T00:57:51.861592" elapsed="0.009155">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.871241" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.871379" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.871341" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:57:51.871324" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.871760" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.871834" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.855778" elapsed="0.016169">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.872025" elapsed="0.000017"/>
</return>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.852952" elapsed="0.019175">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.872348" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.872475" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:57:51.872440" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:57:51.872424" elapsed="0.000114"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.872752" elapsed="0.000024"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.872969" elapsed="0.000023"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-04-10T00:57:51.873036" elapsed="0.000015"/>
</return>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.851298" elapsed="0.021841">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-10T00:57:51.873260" elapsed="0.000017"/>
</continue>
<status status="NOT RUN" start="2026-04-10T00:57:51.873220" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:57:51.873203" elapsed="0.000120"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.873463" elapsed="0.000020"/>
</kw>
<var name="${index}">3</var>
<status status="FAIL" start="2026-04-10T00:57:51.851066" elapsed="0.022466">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:57:51.850882" elapsed="0.022728">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="FAIL" start="2026-04-10T00:57:51.848591" elapsed="0.025119">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<status status="FAIL" start="2026-04-10T00:57:51.848236" elapsed="0.025568">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</branch>
<status status="FAIL" start="2026-04-10T00:57:51.848217" elapsed="0.025621">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<arg>${member_index_list}</arg>
<status status="NOT RUN" start="2026-04-10T00:57:51.874166" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.873949" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:57:51.873925" elapsed="0.000321"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:57:51.874508" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:57:51.874299" elapsed="0.000283"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:57:51.874284" elapsed="0.000322"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="FAIL" start="2026-04-10T00:57:51.847802" elapsed="0.026887">ConnectionError: HTTPConnectionPool(host='10.30.171.151', port=8181): Max retries exceeded with url: /jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore (Caused by NewConnectionError("HTTPConnection(host='10.30.171.151', port=8181): Failed to establish a new connection: [Errno 111] Connection refused"))</status>
</kw>
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:01.890954" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:01.890305" elapsed="0.000690"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:01.891526" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:01.891185" elapsed="0.000386"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:01.891633" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:58:01.891816" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:01.889729" elapsed="0.002112"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:01.893590" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:01.893192" elapsed="0.000575"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:01.893838" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:58:01.894033" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:01.892819" elapsed="0.001241"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:01.903516" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:01.902984" elapsed="0.000627"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:01.904450" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:01.903781" 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-04-10T00:58:02.030007" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:02.030180" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 status=401, reason=Unauthorized 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '524'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 401 Unauthorized&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 401 Unauthorized&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;401&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Unauthorized&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;org.jolokia.osgi.servlet.JolokiaServlet&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-04-10T00:58:02.030501" level="FAIL">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-10T00:58:01.906980" elapsed="0.124051">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-04-10T00:58:01.904592" elapsed="0.126769">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:02.031667" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:02.031408" elapsed="0.000560"/>
</branch>
<status status="FAIL" start="2026-04-10T00:58:01.904567" elapsed="0.127429">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:02.032583" elapsed="0.000030"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:02.032742" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:02.032692" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:02.032673" 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-04-10T00:58:02.032978" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:02.033049" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-10T00:58:01.897342" elapsed="0.135826">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:02.033240" elapsed="0.000017"/>
</return>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="FAIL" start="2026-04-10T00:58:01.894280" elapsed="0.139063">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:02.033585" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:58:02.033717" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:02.033680" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:02.033663" elapsed="0.000116"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:02.033977" elapsed="0.000024"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:02.034203" elapsed="0.000023"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="NOT RUN" start="2026-04-10T00:58:02.034268" elapsed="0.000016"/>
</return>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="FAIL" start="2026-04-10T00:58:01.892383" elapsed="0.141990">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-10T00:58:02.034495" elapsed="0.000016"/>
</continue>
<status status="NOT RUN" start="2026-04-10T00:58:02.034456" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:02.034438" elapsed="0.000134"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:02.034719" elapsed="0.000022"/>
</kw>
<var name="${index}">3</var>
<status status="FAIL" start="2026-04-10T00:58:01.892145" elapsed="0.142647">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-10T00:58:01.891948" elapsed="0.142905">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="FAIL" start="2026-04-10T00:58:01.889138" elapsed="0.145816">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<status status="FAIL" start="2026-04-10T00:58:01.888707" elapsed="0.146308">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</branch>
<status status="FAIL" start="2026-04-10T00:58:01.888669" elapsed="0.146414">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<arg>${member_index_list}</arg>
<status status="NOT RUN" start="2026-04-10T00:58:02.035362" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:02.035156" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:02.035139" elapsed="0.000301"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:58:02.035736" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:02.035495" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:02.035479" elapsed="0.000339"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="FAIL" start="2026-04-10T00:58:01.887918" elapsed="0.147983">HTTPError: 401 Client Error: Unauthorized for url: http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</status>
</kw>
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.054810" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:12.054328" elapsed="0.000518"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.055342" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:12.055025" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:12.055420" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:58:12.055615" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:12.053908" elapsed="0.001733"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.057703" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:12.057342" elapsed="0.000392"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:12.057787" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:58:12.057950" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:12.056846" elapsed="0.001129"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.067208" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:12.066677" elapsed="0.000589"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.067942" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:12.067432" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:12.374685" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:12.375060" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:12 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:12 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-config","member-3-shard-topology-config","member-3-shard-inventory-config","member-3-shard-toaster-config"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782692,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:12.375524" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:12.070370" elapsed="0.305376"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:12.068069" elapsed="0.308207"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.376812" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:12.376354" elapsed="0.001117"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.068047" elapsed="0.309480"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.385986" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-config","member-3-shard-topology-config","member-3-shard-inventory-config","member-3-shard-toaster-config"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782692,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:12.381624" elapsed="0.004616"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:12.379855" elapsed="0.006459"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.379826" elapsed="0.006542"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.391706" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:12.388142" elapsed="0.003665"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:12.386488" elapsed="0.005370"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.386460" elapsed="0.005437"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.393501" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:12.392424" elapsed="0.001167"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.394305" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:12.393768" elapsed="0.000650"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.395489" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:12.394868" elapsed="0.000797"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:12.394465" elapsed="0.001268"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.393741" elapsed="0.002036"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.397429" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:12.396380" elapsed="0.001099"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.398221" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:12.397679" elapsed="0.000649"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.399398" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:12.398777" elapsed="0.000675"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:12.398379" elapsed="0.001137"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.397653" elapsed="0.002064"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:12.399995" elapsed="0.000963"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:12.402122" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:12.401349" elapsed="0.000824"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:12.402500" elapsed="0.003601"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:12.378699" elapsed="0.027574"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:12.406593" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:12.406388" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.406358" elapsed="0.000338"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:12.411122" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782692,...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:12.406906" elapsed="0.004256"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:12.411236" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:58:12.411460" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782692,...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:12.062270" elapsed="0.349224"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:12.411614" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:58:12.411814" level="INFO">${conf_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782692,...</msg>
<var>${conf_text}</var>
<arg>uri=${JOLOKIA_CONF_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:12.058196" elapsed="0.353653"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.413142" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782692,
 "value": {
  "LocalShards": [
   "member-3-shard-default-config",
   "member-3-shard-inventory-config",
   "member-3-shard-toaster-config",
   "member-3-shard-topology-config"
  ],
  "MemberName": "member-3",
  "SyncStatus": true
 }
}
</msg>
<arg>${shard_manager_text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:12.412683" elapsed="0.000569"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.415021" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782692, 'value': {...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:12.414015" elapsed="0.001046"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:12.415123" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:58:12.415330" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782692, 'value': {...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:12.413530" elapsed="0.001833"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:12.415955" level="INFO">${value_object} = {'LocalShards': ['member-3-shard-default-config', 'member-3-shard-inventory-config', 'member-3-shard-toaster-config', 'member-3-shard-topology-config'], 'MemberName': 'member-3', 'SyncStatus': True}</msg>
<var>${value_object}</var>
<arg>dictionary=${manager_object}</arg>
<arg>key=value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:12.415659" elapsed="0.000330"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:12.416485" level="INFO">${sync_status} = True</msg>
<var>${sync_status}</var>
<arg>dictionary=${value_object}</arg>
<arg>key=SyncStatus</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:12.416190" elapsed="0.000327"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-04-10T00:58:12.416595" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:58:12.416806" level="INFO">${conf_status} = True</msg>
<var>${conf_status}</var>
<arg>shard_manager_text=${conf_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="PASS" start="2026-04-10T00:58:12.412176" elapsed="0.004662"/>
</kw>
<if>
<branch type="IF" condition="'False' == ${conf_status}">
<return>
<value>False</value>
<status status="NOT RUN" start="2026-04-10T00:58:12.417092" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:12.416947" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.416912" elapsed="0.000291"/>
</if>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.428054" level="INFO">jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:12.427318" elapsed="0.000810"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.428948" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:12.428345" 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-04-10T00:58:12.444950" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:12.445192" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:12 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:12 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-operational","member-3-shard-topology-operational","member-3-shard-inventory-operational","member-3-shard-toaster-operational"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782692,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:12.445576" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:12.434604" elapsed="0.011107"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:12.429298" elapsed="0.016806"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.446473" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:12.446164" elapsed="0.000835"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.429243" elapsed="0.017798"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.455441" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"LocalShards":["member-3-shard-default-operational","member-3-shard-topology-operational","member-3-shard-inventory-operational","member-3-shard-toaster-operational"],"SyncStatus":true,"MemberName":"member-3"},"timestamp":1775782692,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:12.451214" elapsed="0.004424"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:12.449076" elapsed="0.006647"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.449042" elapsed="0.006745"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.462045" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:12.457824" elapsed="0.004427"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:12.455928" elapsed="0.006388"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.455897" elapsed="0.006463"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.463901" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:12.462950" elapsed="0.000994"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.464604" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:12.464094" elapsed="0.000637"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.465800" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:12.465063" elapsed="0.000789"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:12.464771" elapsed="0.001135"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.464072" elapsed="0.001870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.467422" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:12.466473" elapsed="0.000994"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.468078" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:12.467632" elapsed="0.000536"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.469162" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:12.468513" elapsed="0.000696"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:12.468207" elapsed="0.001054"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.467611" elapsed="0.001685"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:12.469598" elapsed="0.000849"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:12.471629" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:12.470958" elapsed="0.000715"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:12.471941" elapsed="0.002960"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:12.447810" elapsed="0.027234"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:12.475272" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:12.475132" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.475108" elapsed="0.000236"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:12.478979" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:12.475532" elapsed="0.003478"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:12.479064" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:58:12.479236" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:12.421491" elapsed="0.057773"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:12.479323" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:12.479480" level="INFO">${oper_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1...</msg>
<var>${oper_text}</var>
<arg>uri=${JOLOKIA_OPER_SHARD_MANAGER_URI}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:12.417473" elapsed="0.062051"/>
</kw>
<kw name="ClusterManagement__Parse_Sync_Status" owner="ClusterManagement">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.480499" level="INFO">{
 "request": {
  "mbean": "org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782692,
 "value": {
  "LocalShards": [
   "member-3-shard-default-operational",
   "member-3-shard-inventory-operational",
   "member-3-shard-toaster-operational",
   "member-3-shard-topology-operational"
  ],
  "MemberName": "member-3",
  "SyncStatus": true
 }
}
</msg>
<arg>${shard_manager_text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:12.480194" elapsed="0.000480"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.482069" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782692, ...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:12.481260" elapsed="0.000898"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:12.482212" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:12.482379" level="INFO">${manager_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=ShardManager,name=shard-manager-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782692, ...</msg>
<var>${manager_object}</var>
<arg>${shard_manager_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:12.480898" elapsed="0.001509"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:12.482829" level="INFO">${value_object} = {'LocalShards': ['member-3-shard-default-operational', 'member-3-shard-inventory-operational', 'member-3-shard-toaster-operational', 'member-3-shard-topology-operational'], 'MemberName': 'member-3', '...</msg>
<var>${value_object}</var>
<arg>dictionary=${manager_object}</arg>
<arg>key=value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:12.482594" elapsed="0.000264"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:12.483232" level="INFO">${sync_status} = True</msg>
<var>${sync_status}</var>
<arg>dictionary=${value_object}</arg>
<arg>key=SyncStatus</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:12.483018" elapsed="0.000239"/>
</kw>
<return>
<value>${sync_status}</value>
<status status="PASS" start="2026-04-10T00:58:12.483305" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:12.483460" level="INFO">${oper_status} = True</msg>
<var>${oper_status}</var>
<arg>shard_manager_text=${oper_text}</arg>
<doc>Return sync status parsed out of given text. Called twice by Get_Sync_Status_Of_Member.</doc>
<status status="PASS" start="2026-04-10T00:58:12.479819" elapsed="0.003666"/>
</kw>
<return>
<value>${oper_status}</value>
<status status="PASS" start="2026-04-10T00:58:12.483530" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:58:12.483724" level="INFO">${status} = True</msg>
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="PASS" start="2026-04-10T00:58:12.056432" elapsed="0.427318"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="PASS" start="2026-04-10T00:58:12.483937" elapsed="0.000031"/>
</continue>
<status status="PASS" start="2026-04-10T00:58:12.483823" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.483805" elapsed="0.000216"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.484171" elapsed="0.000023"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:12.056184" elapsed="0.428044"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:12.055705" elapsed="0.428559"/>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="PASS" start="2026-04-10T00:58:12.053459" elapsed="0.430866"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:12.053012" elapsed="0.431346"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.052985" elapsed="0.431398"/>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.486019" level="INFO">${return_list_reference} = [3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:12.485629" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.486505" level="INFO">${return_list_copy} = [3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:12.486208" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:12.486592" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:12.486746" level="INFO">${index_list} = [3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:12.485187" elapsed="0.001584"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.487793" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:12.487476" elapsed="0.000343"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:12.487865" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:12.488013" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:12.487129" elapsed="0.000909"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.541347" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:12.540904" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:12.542306" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:12.542057" elapsed="0.000323">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:12.542495" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:12.541679" elapsed="0.000879"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.543320" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:12.542873" elapsed="0.000498"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:12.543849" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:12.544023" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:12.543657" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.544630" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:12.544325" 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-04-10T00:58:12.545836" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:12.545579" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.546313" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:12.546046" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.546681" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.546890" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.547068" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:12.546526" elapsed="0.000601"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:12.546389" elapsed="0.000768"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:12.547202" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:12.547364" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:12.545230" elapsed="0.002160"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:12.544862" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.547794" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:12.547487" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.544809" elapsed="0.003102"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.548688" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:12.548177" elapsed="0.000564"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:12.548821" elapsed="0.000064"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:12.539652" elapsed="0.009404"/>
</kw>
<msg time="2026-04-10T00:58:12.549137" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:12.525530" elapsed="0.023673"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.571029" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.592974" elapsed="0.000031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.616277" elapsed="0.000070"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.616629" elapsed="0.000034"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.616870" 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-04-10T00:58:12.618149" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:12.617198" elapsed="0.001082"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:12.617179" elapsed="0.001154"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.618538" elapsed="0.000083"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.618859" elapsed="0.000071"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.619193" elapsed="0.000066"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:12.617138" elapsed="0.002231"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:12.616972" elapsed="0.002429"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.619822" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:12.619911" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:58:12.620080" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:12.521283" elapsed="0.098826"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:12.622243" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:12.621658" elapsed="0.000783">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:12.622585" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:12.620950" elapsed="0.001663"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.623090" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:12.622708" elapsed="0.000559"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.624213" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:12.623499" elapsed="0.000833"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:12.623295" elapsed="0.001187"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.622687" elapsed="0.001820"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.637299" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:12.624689" elapsed="0.012657"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:12.637432" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:58:12.637665" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:12.620559" elapsed="0.017133"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:12.639823" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:12.639252" elapsed="0.000770">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:12.640265" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:12.638569" elapsed="0.001723"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:12.640635" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:58:12.640377" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.640355" 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-04-10T00:58:12.640881" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:12.641070" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:12.641152" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:58:12.644199" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:12.638143" elapsed="0.006089"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.646240" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:12.645708" elapsed="0.000588"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:12.647013" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:12.646459" 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-04-10T00:58:13.131893" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:13.133145" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:58:13 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:13.134029" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:12.649916" elapsed="0.484304"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:12.647139" elapsed="0.487670"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:13.135314" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:13.134896" elapsed="0.001120"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.647118" elapsed="0.488953"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:13.143067" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:13.140016" elapsed="0.003434"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:13.138804" elapsed="0.004697"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:13.138783" elapsed="0.004818"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:13.147538" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:13.144869" elapsed="0.002807"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:13.143697" elapsed="0.004041"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:13.143676" elapsed="0.004105"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:13.149408" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:13.148316" elapsed="0.001250"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:13.150260" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:13.149794" elapsed="0.000557"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:13.151255" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:13.150710" elapsed="0.000591"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:13.150390" elapsed="0.000964"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:13.149770" elapsed="0.001620"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:13.153047" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:13.152125" elapsed="0.000966"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:13.153836" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:13.153235" elapsed="0.000713"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:13.154981" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:13.154309" elapsed="0.000725"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:13.154005" elapsed="0.001084"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:13.153214" elapsed="0.001912"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:13.155343" elapsed="0.001189"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:13.158052" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:13.156956" elapsed="0.001171"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:13.158503" elapsed="0.002939"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:13.137180" elapsed="0.024422"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:13.161832" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:13.161677" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:13.161658" elapsed="0.000248"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:13.173527" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:13.162078" elapsed="0.011532"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:13.173693" elapsed="0.000070"/>
</return>
<msg time="2026-04-10T00:58:13.173975" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:12.644751" elapsed="0.529263"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:13.174105" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:58:13.174323" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:12.498265" elapsed="0.676094"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:13.174858" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:13.174479" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:13.174454" elapsed="0.000564"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:13.175052" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:12.492170" elapsed="0.683012"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:12.486961" elapsed="0.688265"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:12.486825" elapsed="0.688437"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-10T00:58:12.484806" elapsed="0.690513"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:12.484474" elapsed="0.690876"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:12.484455" elapsed="0.690920"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-10T00:58:13.175834" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:13.175434" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:13.175417" elapsed="0.000506"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="PASS" start="2026-04-10T00:58:12.052411" elapsed="1.123565"/>
</kw>
<arg>${timeout}</arg>
<arg>10s</arg>
<arg>Verify_Members_Are_Ready</arg>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:57:51.838032" elapsed="21.338010"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement" type="TEARDOWN">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:13.179711" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:13.179283" elapsed="0.000462"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:13.180217" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:13.179911" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:13.180287" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:13.180441" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:13.178870" elapsed="0.001595"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:13.181878" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:13.181594" elapsed="0.000311"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:13.182748" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:13.182575" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:13.186383" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:13.185510" elapsed="0.001106"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:13.185490" elapsed="0.001165"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:13.189233" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:13.186890" elapsed="0.002621"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:13.191237" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:13.189823" elapsed="0.001485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:13.192676" 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-04-10T00:58:13.191541" elapsed="0.001195"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:13.195131" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:58:13.195454" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:13.194107" elapsed="0.001541"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:13.196176" elapsed="0.001086"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:58:13.199035" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:58:13.776586" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:58:13 UTC 2026

  System load:  0.41               Processes:             125
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:37 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:58:13.198663" elapsed="0.578174"/>
</kw>
<msg time="2026-04-10T00:58:13.776967" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:13.197773" elapsed="0.579381"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:58:13.193134" elapsed="0.584237"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:58:13.777980" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:58:13.790597" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:58:13.790885" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:58:13.790947" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:58:13.777653" elapsed="0.013326"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:13.791218" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:13.792430" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:13.791881" elapsed="0.000613"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:13.792868" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:13.792636" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:13.792602" elapsed="0.000373"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:58:13.793228" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:58:13.793050" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:13.793028" elapsed="0.000317"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:13.793393" elapsed="0.000020"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:13.798066" elapsed="0.001033"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:13.799567" elapsed="0.000620"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:13.800589" elapsed="0.000262"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:13.793876" elapsed="0.007278"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:58:13.184802" elapsed="0.616487"/>
</kw>
<msg time="2026-04-10T00:58:13.801364" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:13.184130" elapsed="0.617323"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:58:13.183557" elapsed="0.618029"/>
</kw>
<msg time="2026-04-10T00:58:13.801645" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:13.183036" elapsed="0.618687"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:13.805761" elapsed="0.000433"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:13.806424" elapsed="0.000222"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:13.806855" elapsed="0.000134"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:13.802129" elapsed="0.004932"/>
</kw>
<msg time="2026-04-10T00:58:13.807187" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:58:13.182125" elapsed="0.625096"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:13.807854" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:13.807512" elapsed="0.000383"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:58:13.807937" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:58:13.180853" elapsed="0.627209"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:13.180672" elapsed="0.627428"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:13.809186" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:13.808918" elapsed="0.000294"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:13.810028" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:13.809887" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:13.813501" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:13.812881" elapsed="0.000784"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:13.812861" elapsed="0.000831"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:13.813974" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:13.813846" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:13.815126" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:13.814308" elapsed="0.000866"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:13.816032" level="INFO">${conn_id} = 432</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:13.815351" elapsed="0.000708"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:13.817473" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:58:13.817726" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:13.816884" elapsed="0.000938"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:13.818131" elapsed="0.000703"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:58:13.820564" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:58:14.394627" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:58:14 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:37 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:58:13.820193" elapsed="0.574715"/>
</kw>
<msg time="2026-04-10T00:58:14.395172" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:13.819157" elapsed="0.576208"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:58:13.816275" elapsed="0.579326"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:58:14.396215" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:58:14.409732" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:58:14.410234" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:58:14.410339" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:58:14.395864" elapsed="0.014527"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:14.410815" elapsed="0.000686"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:14.412869" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:14.411961" elapsed="0.001014"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:14.413506" elapsed="0.000075"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:14.413153" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:14.413101" elapsed="0.000607"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:58:14.414180" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-04-10T00:58:14.413830" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:14.413795" elapsed="0.000579"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:14.414458" elapsed="0.000036"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:14.419276" elapsed="0.001136"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:14.420919" elapsed="0.000680"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:14.422004" elapsed="0.000280"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:14.415069" elapsed="0.007405"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:58:13.812187" elapsed="0.610453"/>
</kw>
<msg time="2026-04-10T00:58:14.422725" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:13.811479" elapsed="0.611344"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:58:13.810840" elapsed="0.612123"/>
</kw>
<msg time="2026-04-10T00:58:14.423027" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:13.810313" elapsed="0.612801"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:14.427208" elapsed="0.000457"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:14.427842" elapsed="0.000149"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:14.428140" elapsed="0.000097"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:14.423587" elapsed="0.004701"/>
</kw>
<msg time="2026-04-10T00:58:14.428384" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:58:13.809426" elapsed="0.618990"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:14.428885" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:14.428628" elapsed="0.000299"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:58:14.428970" elapsed="0.000031"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:58:13.808388" elapsed="0.620716"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:13.808202" elapsed="0.620939"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:14.430203" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:14.429929" elapsed="0.000301"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:14.431152" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:14.431007" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:14.434914" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:14.434274" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:14.434254" elapsed="0.000837"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:14.435378" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:14.435247" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:14.436588" level="INFO">Attempting to execute command "netstat -pnatu | grep 2550" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:14.435734" elapsed="0.000903"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:14.437468" level="INFO">${conn_id} = 435</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:14.436801" elapsed="0.000694"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:14.439006" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:58:14.439242" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:14.438374" elapsed="0.000968"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:14.439673" elapsed="0.000687"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:58:14.441885" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:58:15.027900" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:58:14 UTC 2026

  System load:  1.27               Processes:             125
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:51 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:58:14.441488" elapsed="0.586785"/>
</kw>
<msg time="2026-04-10T00:58:15.028427" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:14.440704" elapsed="0.587971"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:58:14.437732" elapsed="0.591195"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:58:15.029741" level="INFO">Executing command 'netstat -pnatu | grep 2550'.</msg>
<msg time="2026-04-10T00:58:15.042679" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-10T00:58:15.043135" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:58:15.043237" level="INFO">${stderr} = bash: line 1: netstat: command not found</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:58:15.029288" elapsed="0.014008"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:15.043746" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:15.045697" level="INFO">bash: line 1: netstat: command not found</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:15.044763" elapsed="0.001036"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.046358" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:15.045994" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.045938" elapsed="0.000590"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:58:15.047386" elapsed="0.000142"/>
</return>
<status status="PASS" start="2026-04-10T00:58:15.046683" elapsed="0.000996"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.046647" elapsed="0.001073"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.047789" elapsed="0.000025"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:15.052174" elapsed="0.000981"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:15.053478" elapsed="0.000525"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:15.054267" 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-04-10T00:58:15.048489" elapsed="0.006132"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:58:14.433609" elapsed="0.621115"/>
</kw>
<msg time="2026-04-10T00:58:15.054794" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:14.432925" elapsed="0.621954"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:58:14.432060" elapsed="0.622901"/>
</kw>
<msg time="2026-04-10T00:58:15.055005" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:14.431440" elapsed="0.623626"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:15.057950" elapsed="0.000317"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:15.058435" elapsed="0.000161"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:15.058747" 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-04-10T00:58:15.055363" elapsed="0.003537"/>
</kw>
<msg time="2026-04-10T00:58:15.059004" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:58:14.430523" elapsed="0.628507"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:15.059563" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:15.059281" elapsed="0.000326"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:58:15.059650" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:58:14.429434" elapsed="0.630350"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:14.429246" elapsed="0.630577"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:13.180521" elapsed="1.879348"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:58:13.176322" elapsed="1.883619"/>
</kw>
<arg>${index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${timeout}</arg>
<arg>check_system_status=${check_system_status}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>service_list=${service_list}</arg>
<doc>If the list is empty, start all cluster members. Otherwise, start members based on present indices.
If True, wait for cluster sync on listed members.
Optionally karaf_home can be overriden. Optionally specific JAVA_HOME is used for starting.
Garbage collection is unconditionally logged to files. TODO: Make that reasonable conditional?</doc>
<status status="PASS" start="2026-04-10T00:57:51.374244" elapsed="23.685756"/>
</kw>
<arg>${Follower_Node_2}</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="PASS" start="2026-04-10T00:57:51.230586" elapsed="23.829488"/>
</kw>
<doc>Start Follower Node2 Up.</doc>
<status status="PASS" start="2026-04-10T00:57:50.957946" elapsed="24.102264"/>
</test>
<test id="s1-s3-t38" name="Verify Data Recovery After Follower Node2 Restart" line="271">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:58:15.063876" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:58:15.063603" elapsed="0.000535"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.065219" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:15.065097" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.065077" elapsed="0.000212"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.070342" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:15.070231" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.070213" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:15.071473" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:15.071085" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:15.071986" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:15.071680" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:15.072055" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:15.072209" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:15.070702" elapsed="0.001532"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.077928" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:15.077820" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.077801" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.079151" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:15.079045" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.079028" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:15.079697" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:15.079368" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:15.080114" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:15.079888" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:15.111345" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:15.080689" elapsed="0.030760"/>
</kw>
<msg time="2026-04-10T00:58:15.111648" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:15.111695" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.080302" elapsed="0.031429"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:15.184032" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:15.112252" elapsed="0.072066"/>
</kw>
<msg time="2026-04-10T00:58:15.184718" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:15.184831" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.111906" elapsed="0.073009"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:15.185645" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:15.185092" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.185048" elapsed="0.000785"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:15.186875" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:15.186160" elapsed="0.000914"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:15.187751" elapsed="0.000097"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:15.187226" elapsed="0.000703"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.187186" elapsed="0.000797"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:15.188059" elapsed="0.000063"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:15.189945" elapsed="0.000793"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:15.191060" elapsed="0.000451"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:15.191819" elapsed="0.000359"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:15.189295" elapsed="0.002982"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:15.188680" elapsed="0.003660"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:15.078745" elapsed="0.113696"/>
</kw>
<msg time="2026-04-10T00:58:15.192534" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:15.192599" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.078153" elapsed="0.114483"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:15.192823" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:15.192714" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.192696" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:15.193311" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:15.193668" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.193741" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:15.077465" elapsed="0.116388"/>
</kw>
<msg time="2026-04-10T00:58:15.193948" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:15.193993" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.072667" elapsed="0.121362"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:15.194358" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:15.194105" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.194087" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:15.072488" elapsed="0.121971"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.200177" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:15.200069" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.200050" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.201394" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:15.201286" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.201268" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:15.201926" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:15.201628" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:15.202349" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:15.202115" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:15.231181" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:15.202979" elapsed="0.028330"/>
</kw>
<msg time="2026-04-10T00:58:15.231513" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:15.231590" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.202632" elapsed="0.028996"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:15.307215" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:15.232221" elapsed="0.075624"/>
</kw>
<msg time="2026-04-10T00:58:15.309492" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:15.309656" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.231836" elapsed="0.077942"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:15.310710" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:15.310030" elapsed="0.000817"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.309964" elapsed="0.000986"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:15.312196" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:15.311321" elapsed="0.001128"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:15.313158" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:15.312646" elapsed="0.000638"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.312603" elapsed="0.000734"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:15.313418" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:15.316742" elapsed="0.001174"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:15.318337" elapsed="0.000820"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:15.319591" 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-04-10T00:58:15.315703" elapsed="0.004604"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:15.314130" elapsed="0.006275"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:15.200983" elapsed="0.119612"/>
</kw>
<msg time="2026-04-10T00:58:15.320753" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:15.320822" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.200401" elapsed="0.120479"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:15.321179" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T00:58:15.321006" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.320977" elapsed="0.000338"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:15.321997" elapsed="0.000040"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:15.322630" elapsed="0.000041"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.322748" elapsed="0.000028"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:15.199696" elapsed="0.123261"/>
</kw>
<msg time="2026-04-10T00:58:15.323109" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:15.323177" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.194758" elapsed="0.128478"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:15.323790" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:15.323357" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.323331" elapsed="0.000581"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:15.194614" elapsed="0.129337"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.332122" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:15.332005" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.331986" elapsed="0.000275"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.333493" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:15.333379" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.333360" elapsed="0.000231"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:15.334065" level="INFO">${karaf_connection_index} = 424</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:15.333745" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:15.334540" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:15.334259" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:15.335527" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:58:15.335224" elapsed="0.001093">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:58:15.336515" level="INFO">${status_write} = FAIL</msg>
<msg time="2026-04-10T00:58:15.336594" level="INFO">${message_write} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.334828" elapsed="0.001793"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:15.337432" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="FAIL" start="2026-04-10T00:58:15.337167" elapsed="0.001074">Cannot open session, you need to establish a connection first.</status>
</kw>
<msg time="2026-04-10T00:58:15.338440" level="INFO">${status_wait} = FAIL</msg>
<msg time="2026-04-10T00:58:15.338486" level="INFO">${message_wait} = Cannot open session, you need to establish a connection first.</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.336805" elapsed="0.001704"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-10T00:58:15.339983" level="FAIL">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Follower Node2 Restart"</msg>
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-10T00:58:15.338954" elapsed="0.001126">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Follower Node2 Restart"</status>
</kw>
<status status="FAIL" start="2026-04-10T00:58:15.338625" elapsed="0.001566">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Follower Node2 Restart"</status>
</branch>
<status status="FAIL" start="2026-04-10T00:58:15.338604" elapsed="0.001635">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Follower Node2 Restart"</status>
</if>
<kw name="Log" owner="BuiltIn">
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:15.340538" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:15.340905" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:15.340692" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:15.340667" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.341062" elapsed="0.000021"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:15.343576" elapsed="0.001299"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:15.345298" elapsed="0.000824"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:15.346519" elapsed="0.000747"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:15.342312" elapsed="0.005105"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:15.341468" elapsed="0.006044"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="FAIL" start="2026-04-10T00:58:15.333069" elapsed="0.014604">Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Follower Node2 Restart"</status>
</kw>
<msg time="2026-04-10T00:58:15.347855" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:58:15.347925" level="INFO">${message} = Failed to send the command: log:log "ROBOT MESSAGE: Starting test openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch.Verify Data Recovery After Follower Node2 Res...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.332426" elapsed="0.015535"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.348245" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:15.348081" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.348051" elapsed="0.000359"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.349771" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:15.349520" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.349492" elapsed="0.000385"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:15.350751" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:15.350121" elapsed="0.000875"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:15.351683" level="INFO">{1: 299, 2: 303, 3: 424}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:15.351234" elapsed="0.000530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:15.352381" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:15.352006" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:15.353677" elapsed="0.000428"/>
</kw>
<msg time="2026-04-10T00:58:15.354261" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:15.354329" level="INFO">${old_connection_index} = 424</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.352925" elapsed="0.001436"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${old_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:15.355868" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:15.357986" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>logout</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-10T00:58:15.357206" elapsed="0.002130">Cannot open session, you need to establish a connection first.</status>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.356439" elapsed="0.003005"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:15.360165" elapsed="0.000282"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.359678" elapsed="0.000852"/>
</kw>
<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="PASS" start="2026-04-10T00:58:15.355037" elapsed="0.005557"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:15.354486" elapsed="0.006162"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.354455" elapsed="0.006223"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:15.361680" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:15.361312" elapsed="0.000399"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:58:15.361767" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:58:15.361947" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:15.360935" elapsed="0.001036"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:15.362139" elapsed="0.000574"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:15.363374" level="INFO">index=441
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:58:15.370096" elapsed="0.532817"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:15.920405" elapsed="0.000737"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:15.921397" elapsed="0.000280"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:15.921890" elapsed="0.000147"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:15.904668" elapsed="0.017457"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:15.903562" elapsed="0.018635"/>
</kw>
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:58:15.349058" elapsed="0.573215"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:15.923471" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:15.923303" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:15.923267" elapsed="0.000866"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:15.924675" level="INFO">${karaf_connection_index} = 441</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:15.924338" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:15.925180" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:15.924929" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:16.019157" 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 "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:15.925919" elapsed="0.093421"/>
</kw>
<msg time="2026-04-10T00:58:16.019568" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:16.019625" 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 "t "e "s "t "[C "o "p "e "n "f "l "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.925432" elapsed="0.094230"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:16.172094" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:16.020452" elapsed="0.151911"/>
</kw>
<msg time="2026-04-10T00:58:16.172574" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:16.172630" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:16.019954" elapsed="0.152714"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.173225" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:16.172840" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.172790" elapsed="0.000529"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.173891" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "D "[78Ca "[A[78Ct
 "a "[C "R "e "c "o "v "e "r "y "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.173471" elapsed="0.000528"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.174292" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:16.174068" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.174050" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:16.174410" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:16.175861" elapsed="0.000502"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:16.176653" elapsed="0.000215"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:16.177025" elapsed="0.000107"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:16.175380" elapsed="0.001804"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:16.174795" elapsed="0.002436"/>
</kw>
<msg time="2026-04-10T00:58:16.177363" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:15.922835" elapsed="0.254567"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:16.177452" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:15.331606" elapsed="0.845995"/>
</kw>
<msg time="2026-04-10T00:58:16.177705" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:16.177752" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.324383" elapsed="0.853404"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.178127" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:16.177868" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.177850" elapsed="0.000354"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:15.324164" elapsed="0.854064"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:15.072300" elapsed="1.105965"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:58:15.069874" elapsed="1.108453"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:58:15.064780" elapsed="1.113609"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:15.064291" elapsed="1.114145"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:58:15.061396" elapsed="1.117096"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.190798" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:16.190396" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.191308" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:16.190989" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:16.191378" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:16.191534" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:16.190006" elapsed="0.001568"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.202206" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:16.201903" elapsed="0.000330"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:16.202280" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:16.202428" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:16.201540" elapsed="0.000913"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.215936" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.215681" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.216378" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.216138" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.216866" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.216616" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.217366" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.217062" elapsed="0.000348"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:16.218243" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:58:16.218042" elapsed="0.000228"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:58:16.218615" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:58:16.218427" elapsed="0.000213"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:58:16.218793" elapsed="0.000203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.219398" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.219153" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:58:16.219484" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:16.219662" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:58:16.217631" elapsed="0.002056"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:16.230567" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:58:16.230618" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:16.230732" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:16.221991" elapsed="0.008768"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.219760" elapsed="0.011047"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.230990" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:16.230834" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.219742" elapsed="0.011337"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.237367" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.232165" elapsed="0.005269"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.231937" elapsed="0.005548"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.231917" elapsed="0.005603"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.241373" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.237949" elapsed="0.003504"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.237624" elapsed="0.003880"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.237599" elapsed="0.003939"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.242368" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:16.241809" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.242869" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:16.242508" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.243682" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:16.243210" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.242983" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.242482" elapsed="0.001320"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.244591" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:16.244027" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.245067" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:16.244730" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.245854" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:16.245401" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.245179" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.244705" elapsed="0.001269"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:16.246201" elapsed="0.000512"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:16.247402" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:16.247003" elapsed="0.000437"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:16.247698" elapsed="0.002733"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:16.231439" elapsed="0.019057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:16.250694" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:16.250585" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.250565" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:16.253439" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:16.250912" elapsed="0.002555"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:16.253516" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:58:16.253694" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:16.213002" elapsed="0.040717"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:16.253787" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:16.253937" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:58:16.210403" elapsed="0.043558"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:16.254012" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:16.254157" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:16.201088" elapsed="0.053093"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:58:16.196620" elapsed="0.057623"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:16.191828" elapsed="0.062450"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.264626" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:16.264296" elapsed="0.000357"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:16.264699" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:16.264848" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:16.263926" elapsed="0.000946"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.280395" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.280134" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.280861" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.280618" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.281310" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.281064" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.281770" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.281510" elapsed="0.000310"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:16.282674" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:58:16.282462" elapsed="0.000238"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:58:16.283061" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:58:16.282874" elapsed="0.000212"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:58:16.283237" elapsed="0.000188"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.283851" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.283596" elapsed="0.000343"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:58:16.283982" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:16.284172" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:58:16.282055" elapsed="0.002142"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:16.305302" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:58:16.305350" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:16.305446" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:16.286337" elapsed="0.019135"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.284270" elapsed="0.021249"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.305741" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:16.305568" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.284252" elapsed="0.021581"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.309688" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.306865" elapsed="0.002874"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.306640" elapsed="0.003143"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.306622" elapsed="0.003187"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.312577" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.310118" elapsed="0.002509"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.309870" elapsed="0.002793"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.309852" elapsed="0.002836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.313261" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:16.312874" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.313675" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:16.313360" elapsed="0.000387"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.314266" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:16.313948" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.313779" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.313342" elapsed="0.001011"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.314918" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:16.314516" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.315258" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:16.315019" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.315907" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:16.315504" elapsed="0.000442"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.315341" elapsed="0.000644"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.315000" elapsed="0.001007"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:16.316167" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:16.317144" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:16.316755" elapsed="0.000427"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:16.317401" elapsed="0.003523"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:16.306189" elapsed="0.014826"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:16.321327" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:16.321173" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.321145" elapsed="0.000274"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:16.325325" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:16.321648" elapsed="0.003716"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:16.325432" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:58:16.325676" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:16.277353" elapsed="0.048358"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:16.325805" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:58:16.326015" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:58:16.274523" elapsed="0.051526"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:16.326121" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:58:16.326323" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:16.263436" elapsed="0.062921"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:58:16.258931" elapsed="0.067537"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:16.254367" elapsed="0.072162"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.342903" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:16.342585" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:16.342980" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:16.343134" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:16.342221" elapsed="0.000938"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.357131" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.356868" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.357593" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.357337" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.358043" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.357796" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.358482" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.358240" elapsed="0.000285"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:16.359350" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:58:16.359156" elapsed="0.000219"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:58:16.359754" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:58:16.359531" elapsed="0.000249"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:58:16.359932" elapsed="0.000195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.360533" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.360284" elapsed="0.000309"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:58:16.360635" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:16.360794" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:58:16.358744" elapsed="0.002074"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:16.396244" level="INFO">POST Request : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:58:16.396368" level="INFO">POST Response : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:16.396468" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:16.363021" elapsed="0.033473"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.360896" elapsed="0.035669"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.396765" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:16.396596" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.360877" elapsed="0.035983"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.400453" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.397934" elapsed="0.002564"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.397707" elapsed="0.002826"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.397688" elapsed="0.002888"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.403247" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.400856" elapsed="0.002476"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.400633" elapsed="0.002736"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.400616" elapsed="0.002778"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.404078" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:16.403608" elapsed="0.000509"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.404572" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:16.404216" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.405352" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:16.404926" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.404690" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.404191" elapsed="0.001286"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.406277" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:16.405746" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.406775" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:16.406417" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.407626" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:16.407129" elapsed="0.000537"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.406898" elapsed="0.000821"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.406390" elapsed="0.001358"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:16.407965" elapsed="0.000488"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:16.409112" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:16.408713" elapsed="0.000435"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:16.409367" elapsed="0.003570"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:16.397234" elapsed="0.015793"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:16.413278" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:16.413129" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.413103" elapsed="0.000273"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:16.416704" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:16.413605" elapsed="0.003126"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:16.416780" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:58:16.416941" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:16.353959" elapsed="0.063008"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:16.417077" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:16.417232" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:58:16.351175" elapsed="0.066082"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:16.417308" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:16.417455" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:16.341768" elapsed="0.075712"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:58:16.337185" elapsed="0.080373"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:16.326791" elapsed="0.090804"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:16.191686" elapsed="0.225945"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.429136" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:16.428831" elapsed="0.000332"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:16.429210" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:16.429362" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:16.428466" elapsed="0.000920"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.436309" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.436036" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.436783" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.436516" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:16.444588" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:16.444653" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:16 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:16 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782696,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:16.444760" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:16.439237" elapsed="0.005551"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.436909" elapsed="0.007927"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.445035" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:16.444867" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.436885" elapsed="0.008241"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.449220" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782696,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.446438" elapsed="0.002834"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.446184" elapsed="0.003124"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.446158" elapsed="0.003175"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.452474" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:16.449665" elapsed="0.002899"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.449393" elapsed="0.003227"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.449375" elapsed="0.003281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.453506" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:16.452927" elapsed="0.000653"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.454044" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:16.453689" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.455069" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:16.454404" elapsed="0.000705"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.454164" elapsed="0.001084"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.453662" elapsed="0.001619"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.456092" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:16.455522" elapsed="0.000611"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.456602" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:16.456237" elapsed="0.000451"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.457619" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:16.456961" elapsed="0.000700"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:16.456724" elapsed="0.000991"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.456210" elapsed="0.001537"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:16.457979" elapsed="0.000740"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:16.459679" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:16.459022" elapsed="0.000696"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:16.459953" elapsed="0.011952"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:16.445715" elapsed="0.026261"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:16.472161" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:58:16.472049" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:16.472030" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:16.472410" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:16.472481" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:58:16.474911" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782696,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:16.429743" elapsed="0.045198"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:16.474996" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:16.475154" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782696,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:16.428013" elapsed="0.047168"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.476294" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782696, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:16.475806" elapsed="0.000517"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:16.476371" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:16.476526" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782696, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:16.475421" elapsed="0.001155"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:16.476940" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:16.476759" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.477449" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:16.477140" elapsed="0.000335"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.477941" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:16.477672" elapsed="0.000294"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:16.478510" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:16.478138" elapsed="0.000476">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:16.423483" elapsed="0.055252">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:17.489936" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:17.489573" elapsed="0.000395"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:17.490029" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:58:17.490195" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:17.489195" elapsed="0.001025"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:17.496901" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:17.496640" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:17.497352" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:17.497105" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:17.505305" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:17.505364" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:17 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782697,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:17.505459" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:17.499538" elapsed="0.005948"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:17.497469" elapsed="0.008061"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:17.505742" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:17.505584" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:17.497449" elapsed="0.008381"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:17.509896" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782697,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:17.507019" elapsed="0.002946"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:17.506796" elapsed="0.003219"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:17.506778" elapsed="0.003272"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:17.514047" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:17.510441" elapsed="0.003672"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:17.510128" elapsed="0.004035"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:17.510104" elapsed="0.004093"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:17.515070" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:17.514445" elapsed="0.000664"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:17.515538" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:17.515208" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:17.516506" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:17.515902" elapsed="0.000692"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:17.515677" elapsed="0.000971"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:17.515183" elapsed="0.001496"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:17.517411" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:17.516904" elapsed="0.000544"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:17.517893" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:17.517566" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:17.518820" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:17.518234" elapsed="0.000623"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:17.518006" elapsed="0.000900"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:17.517520" elapsed="0.001415"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:17.519148" elapsed="0.000700"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:17.520822" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:17.520158" elapsed="0.000702"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:17.521031" elapsed="0.008374"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:17.506354" elapsed="0.023116"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:17.529784" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:58:17.529542" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:17.529523" elapsed="0.000352"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:17.530036" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:17.530109" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:58:17.532457" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782697,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:17.490593" elapsed="0.041895"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:17.532564" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:17.532719" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782697,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:17.488575" elapsed="0.044170"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:17.534025" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782697, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:17.533305" elapsed="0.000749"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:17.534102" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:17.534257" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782697, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:17.532966" elapsed="0.001316"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:17.534657" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:17.534460" elapsed="0.000222"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:17.535240" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:17.534867" elapsed="0.000400"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:17.535734" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:17.535444" elapsed="0.000316"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:17.536287" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:17.535934" elapsed="0.000424">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:17.479661" elapsed="0.056845">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:18.547419" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:18.546940" elapsed="0.000517"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:18.547527" elapsed="0.000069"/>
</return>
<msg time="2026-04-10T00:58:18.547753" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:18.546465" elapsed="0.001320"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:18.557003" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:18.556573" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:18.557615" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:18.557290" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:18.569426" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:18.569650" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782698,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:18.569828" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:18.560723" elapsed="0.009142"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:18.557779" elapsed="0.012161"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:18.570264" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:18.569989" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:18.557748" elapsed="0.012632"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:18.575709" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782698,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:18.572106" elapsed="0.003684"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:18.571798" elapsed="0.004041"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:18.571773" elapsed="0.004098"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:18.580745" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:18.576251" elapsed="0.004647"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:18.575950" elapsed="0.005047"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:18.575927" elapsed="0.005138"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:18.582605" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:18.581539" elapsed="0.001131"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:18.583514" elapsed="0.000105"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:18.582943" elapsed="0.000764"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:18.584748" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:18.584073" elapsed="0.000719"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:18.583763" elapsed="0.001097"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:18.582889" elapsed="0.002006"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:18.585724" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:18.585142" elapsed="0.000623"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:18.586241" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:18.585880" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:18.587301" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:18.586632" elapsed="0.000711"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:18.586364" elapsed="0.001033"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:18.585845" elapsed="0.001583"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:18.587713" elapsed="0.000764"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:18.589438" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:18.588767" elapsed="0.000712"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:18.589756" elapsed="0.010065"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:18.571177" elapsed="0.028721"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:18.600102" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T00:58:18.599982" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:18.599961" 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-04-10T00:58:18.600371" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:18.600445" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:58:18.603007" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782698,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:18.548230" elapsed="0.054882"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:18.603181" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:18.603345" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782698,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:18.545847" elapsed="0.057524"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:18.604453" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782698, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:18.604015" elapsed="0.000468"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:18.604533" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:58:18.604712" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782698, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:18.603641" elapsed="0.001098"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:18.605111" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:18.604922" elapsed="0.000214"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:18.605854" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:18.605324" elapsed="0.000558"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:18.606334" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:18.606058" elapsed="0.000302"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:18.606928" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:18.606533" elapsed="0.000471">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:18.537363" elapsed="0.069758">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:19.619876" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:19.619364" elapsed="0.000555"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:19.619995" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:58:19.620227" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:19.618808" elapsed="0.001455"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:19.628853" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:19.628581" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:19.629308" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:19.629060" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:19.636719" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:19.636780" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782699,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:19.636875" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:19.631573" elapsed="0.005328"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:19.629436" elapsed="0.007510"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:19.637134" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:19.636974" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:19.629415" elapsed="0.007806"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:19.641029" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782699,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:19.638452" elapsed="0.002626"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:19.638218" elapsed="0.002952"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:19.638200" elapsed="0.002996"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:19.644227" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:19.641479" elapsed="0.002797"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:19.641253" elapsed="0.003058"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:19.641236" elapsed="0.003100"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:19.644954" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:19.644518" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:19.645313" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:19.645074" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:19.646035" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:19.645582" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:19.645394" elapsed="0.000716"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:19.645048" elapsed="0.001084"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:19.646702" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:19.646293" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:19.647036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:19.646800" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:19.647705" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:19.647276" elapsed="0.000455"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:19.647117" elapsed="0.000649"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:19.646782" elapsed="0.001006"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:19.647941" elapsed="0.000486"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:19.649055" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:19.648610" elapsed="0.000471"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:19.649237" elapsed="0.008443"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:19.637763" elapsed="0.019984"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:19.658632" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:58:19.658505" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:19.658486" elapsed="0.000236"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:19.658874" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:19.658945" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:58:19.661273" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782699,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:19.620763" elapsed="0.040541"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:19.661357" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:58:19.661904" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782699,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:19.618111" elapsed="0.043826"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:19.662981" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782699, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:19.662566" elapsed="0.000444"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:19.663057" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:19.663212" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782699, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:19.662174" elapsed="0.001104"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:19.663661" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:19.663460" elapsed="0.000227"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:19.664314" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:19.663864" elapsed="0.000476"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:19.664799" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:19.664512" elapsed="0.000312"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:19.665342" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:19.664994" elapsed="0.000420">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:19.608102" elapsed="0.057423">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.676468" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.675970" elapsed="0.000551"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:20.676634" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T00:58:20.676872" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:20.675406" elapsed="0.001503"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.685322" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.685052" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.685834" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.685570" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:20.693236" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:20.693300" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782700,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:20.693399" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:20.688046" elapsed="0.005380"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.685955" elapsed="0.007515"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.693715" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.693534" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.685934" elapsed="0.007880"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.697667" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782700,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.695033" elapsed="0.002686"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.694795" elapsed="0.002960"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.694773" elapsed="0.003008"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.700623" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.698076" elapsed="0.002598"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.697842" elapsed="0.002868"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.697821" elapsed="0.002916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.701332" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.700928" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.701771" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.701431" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.702742" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.702047" elapsed="0.000735"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.701859" elapsed="0.001042"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.701412" elapsed="0.001526"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.703743" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.703186" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.704243" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.703884" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.705223" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.704613" elapsed="0.000651"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.704362" elapsed="0.000956"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.703857" elapsed="0.001493"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:20.705638" elapsed="0.000731"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:20.707254" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.706635" elapsed="0.000658"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:20.707517" elapsed="0.010606"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:20.694343" elapsed="0.023859"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:20.718411" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:58:20.718286" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.718264" 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-04-10T00:58:20.718696" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:20.718771" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:58:20.721326" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782700,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:20.677394" elapsed="0.043963"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:20.721453" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:20.721636" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782700,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:20.674684" elapsed="0.046980"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.722718" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782700, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.722270" elapsed="0.000477"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:20.722799" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:20.722958" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782700, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:20.721904" elapsed="0.001081"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:20.723353" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:20.723170" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.724043" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:20.723726" elapsed="0.000344"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.724527" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:20.724248" elapsed="0.000322"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:58:20.724748" elapsed="0.000318"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:58:20.666473" elapsed="0.058658"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:58:16.422868" elapsed="4.302321"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:16.422431" elapsed="4.302827"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:16.417828" elapsed="4.307515"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.737129" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.736821" elapsed="0.000336"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:20.737205" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:20.737397" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:20.736437" elapsed="0.000987"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.744091" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.743837" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.744539" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.744295" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:20.753362" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:20.753431" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782700,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:20.753527" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:20.746755" elapsed="0.006818"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.744669" elapsed="0.008949"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.753800" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.753645" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.744650" elapsed="0.009246"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.759604" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782700,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.755100" elapsed="0.004580"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.754859" elapsed="0.004872"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.754840" elapsed="0.004927"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.763944" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.760194" elapsed="0.003820"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.759852" elapsed="0.004223"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.759826" elapsed="0.004289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.764955" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.764356" elapsed="0.000637"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.765479" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.765102" elapsed="0.000487"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.766462" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.765856" elapsed="0.000644"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.765626" elapsed="0.000949"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.765069" elapsed="0.001540"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.767365" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.766835" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.767857" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.767503" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.768831" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.768211" elapsed="0.000658"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.767974" elapsed="0.000946"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.767477" elapsed="0.001473"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:20.769293" elapsed="0.000724"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:20.770657" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.770196" elapsed="0.000489"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:20.770846" elapsed="0.008535"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:20.754414" elapsed="0.025041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:20.779670" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:58:20.779540" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.779520" 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-04-10T00:58:20.779921" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:20.779996" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:58:20.782570" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782700,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:20.737798" elapsed="0.044803"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:20.782656" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:20.782813" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782700,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:20.735978" elapsed="0.046862"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.783866" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782700, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.783430" elapsed="0.000465"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:20.783947" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:20.784106" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782700, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:20.783075" elapsed="0.001058"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:20.784499" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:20.784315" elapsed="0.000214"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.785318" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:20.784973" elapsed="0.000373"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.785835" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:20.785527" elapsed="0.000335"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:58:20.786043" elapsed="0.000321"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:58:20.731460" elapsed="0.054969"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:58:20.730874" elapsed="0.055609"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:20.730434" elapsed="0.056133"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:20.725504" elapsed="0.061111"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.798414" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.798102" elapsed="0.000339"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:20.798490" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:20.798664" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:20.797737" elapsed="0.000954"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.805796" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.805504" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.806332" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.806064" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:20.814697" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:20.814777" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782700,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:20.814906" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:20.808683" elapsed="0.006258"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.806466" elapsed="0.008535"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.815254" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.815039" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.806444" elapsed="0.008930"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.820800" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782700,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.817101" elapsed="0.003771"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.816755" elapsed="0.004167"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.816728" elapsed="0.004228"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.825069" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.821411" elapsed="0.003725"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.821065" elapsed="0.004121"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.821040" elapsed="0.004181"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.826024" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.825466" elapsed="0.000658"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.826450" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.826201" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.827158" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.826734" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.826536" elapsed="0.000688"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.826182" elapsed="0.001063"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.827808" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.827406" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.828145" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.827908" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.828834" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.828389" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.828227" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.827890" elapsed="0.001034"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:20.829109" elapsed="0.000527"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:20.830238" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.829810" elapsed="0.000455"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:20.830427" elapsed="0.008604"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:20.816091" elapsed="0.023017"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:20.839349" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:58:20.839235" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.839212" elapsed="0.000234"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.839676" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:20.839755" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:58:20.842424" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782700,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:20.799032" elapsed="0.043424"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:20.842510" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:20.842694" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782700,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:20.797208" elapsed="0.045516"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.843791" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782700, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.843345" elapsed="0.000477"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:20.843874" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:20.844034" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782700, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:20.842961" elapsed="0.001101"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:20.844430" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:20.844246" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.845117" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:20.844767" elapsed="0.000377"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.845604" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:20.845319" elapsed="0.000312"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:58:20.845815" elapsed="0.000326"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:58:20.792377" elapsed="0.053828"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:58:20.791798" elapsed="0.054458"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:20.791361" elapsed="0.054958"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:20.786712" elapsed="0.059640"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:16.417687" elapsed="4.428699"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.857466" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.857111" elapsed="0.000382"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:20.857539" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:58:20.857711" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:20.856712" elapsed="0.001025"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.864615" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.864347" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.865080" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.864833" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:20.871888" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:20.871946" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782700,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:20.872105" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:20.867254" elapsed="0.004878"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.865192" elapsed="0.006983"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.872357" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.872202" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.865174" elapsed="0.007269"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.875927" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782700,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.873485" elapsed="0.002490"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.873264" elapsed="0.002746"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.873246" elapsed="0.002789"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.878717" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.876312" elapsed="0.002452"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.876091" elapsed="0.002707"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.876074" elapsed="0.002749"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.879365" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.878988" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.879719" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.879461" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.880269" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.879962" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.879801" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.879444" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.880926" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.880510" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.881257" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.881023" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.881811" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.881496" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.881336" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.881005" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:20.882048" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:20.882848" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.882571" elapsed="0.000303"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:20.883030" elapsed="0.002396"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:20.872841" elapsed="0.012648"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:20.885683" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:58:20.885576" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.885555" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.885920" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:20.885991" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:58:20.888398" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782700,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:20.858088" elapsed="0.030339"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:20.888480" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:20.888650" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782700,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:20.856239" elapsed="0.032489"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:58:20.888778" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:20.888924" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782700,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 1. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:58:20.851772" elapsed="0.037178"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.890041" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782700, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.889648" elapsed="0.000425"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:20.890122" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:20.890276" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782700, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:20.889165" elapsed="0.001138"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:20.890674" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:20.890480" elapsed="0.000220"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.891157" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:58:20.890879" elapsed="0.000331"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:58:20.851308" elapsed="0.039960"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:20.846601" elapsed="0.044701"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.902301" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.901996" elapsed="0.000332"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:20.902375" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:20.902525" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:20.901578" elapsed="0.000988"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.909220" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.908963" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.909682" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.909421" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:20.919373" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:20.919440" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782700,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:20.919534" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:20.911910" elapsed="0.007669"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.909795" elapsed="0.009828"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.919806" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.919650" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.909776" elapsed="0.010115"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.923697" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782700,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.920985" elapsed="0.002764"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.920753" elapsed="0.003032"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.920733" elapsed="0.003077"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.927172" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.924097" elapsed="0.003142"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.923867" elapsed="0.003603"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.923848" elapsed="0.003669"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.928337" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.927789" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.928888" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.928477" elapsed="0.000493"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.929678" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.929230" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.929004" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.928450" elapsed="0.001345"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.930524" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.930021" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.931006" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.930681" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.931773" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.931341" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.931118" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.930656" elapsed="0.001231"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:20.932101" elapsed="0.000563"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:20.933287" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.932901" elapsed="0.000422"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:20.933537" elapsed="0.003410"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:20.920256" elapsed="0.016782"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:20.937289" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T00:58:20.937138" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.937111" 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-04-10T00:58:20.937653" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:20.937767" elapsed="0.000024"/>
</return>
<msg time="2026-04-10T00:58:20.941072" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782700,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:20.902898" elapsed="0.038217"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:20.941190" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:58:20.941406" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782700,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:20.901096" elapsed="0.040347"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:58:20.941511" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:58:20.941747" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782700,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:58:20.896699" elapsed="0.045096"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.943241" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782700, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.942669" elapsed="0.000612"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:20.943351" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:58:20.943590" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782700, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:20.942141" elapsed="0.001488"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:20.944214" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:20.943950" elapsed="0.000301"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.944987" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:58:20.944567" elapsed="0.000499"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:58:20.896223" elapsed="0.048920"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:20.891389" elapsed="0.053789"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.956022" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.955708" elapsed="0.000343"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:20.956102" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:20.956255" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:20.955338" elapsed="0.000943"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.963300" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.963034" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.963781" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.963508" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:20.971294" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:20.971367" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:20 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782700,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:20.971476" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:20.966011" elapsed="0.005494"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.963897" elapsed="0.007679"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.971786" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.971609" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.963879" elapsed="0.007999"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.975539" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782700,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.973012" elapsed="0.002601"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.972779" elapsed="0.002871"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.972760" elapsed="0.002916"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.978995" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:20.975963" elapsed="0.003101"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.975735" elapsed="0.003380"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.975717" elapsed="0.003434"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.979972" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.979404" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.980497" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.980114" elapsed="0.000504"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.981312" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.980884" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.980654" elapsed="0.000756"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.980087" elapsed="0.001356"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.982210" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.981691" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:20.982859" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:20.982424" elapsed="0.000540"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.983874" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:20.983320" elapsed="0.000600"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:20.983011" elapsed="0.000971"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.982391" elapsed="0.001630"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:20.984297" elapsed="0.000667"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:20.985781" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.985262" elapsed="0.000566"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:20.986110" elapsed="0.003975"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:20.972278" elapsed="0.017896"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:20.990415" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-10T00:58:20.990276" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:20.990248" 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-04-10T00:58:20.990757" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:20.990848" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:58:20.993873" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782700,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:20.956676" elapsed="0.037235"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:20.993979" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:58:20.994175" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782700,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:20.954866" elapsed="0.039343"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:58:20.994267" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:58:20.994453" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":1000,"timestamp":1775782700,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 3. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:58:20.950395" elapsed="0.044092"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.995847" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782700, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:20.995294" elapsed="0.000588"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:20.995942" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:58:20.996133" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 1000, 'timestamp': 1775782700, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:20.994812" elapsed="0.001355"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:20.996678" level="INFO">${value} = 1000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:20.996433" elapsed="0.000278"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:58:20.997485" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:58:20.996945" elapsed="0.000628"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 1000.</doc>
<status status="PASS" start="2026-04-10T00:58:20.949940" elapsed="0.047710"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:20.945273" elapsed="0.052421"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:20.846444" elapsed="0.151295"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:58:16.187643" elapsed="4.810169"/>
</kw>
<arg>${restart_timeout}</arg>
<arg>2s</arg>
<arg>BulkomaticKeywords.Get Bulk Flow And Verify Count In Cluster</arg>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:58:16.178739" elapsed="4.819146"/>
</kw>
<doc>1000 Flows preserved in all controller instances.</doc>
<status status="PASS" start="2026-04-10T00:58:15.060780" elapsed="5.937349"/>
</test>
<test id="s1-s3-t39" name="Start Mininet Again Connect To Follower Node2" line="286">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:58:21.002942" elapsed="0.000289"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:58:21.002592" elapsed="0.000709"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:21.004679" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:21.004503" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.004475" elapsed="0.000298"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:21.010733" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:21.010613" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.010593" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:21.011874" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:21.011441" elapsed="0.000462"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:21.012418" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:21.012067" elapsed="0.000377"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:21.012490" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:58:21.012675" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:21.011052" elapsed="0.001648"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:21.018132" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:21.018018" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.017998" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:21.019462" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:21.019356" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.019338" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:21.020051" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:21.019708" elapsed="0.000372"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:21.020497" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:21.020266" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:21.055867" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:21.021045" elapsed="0.034978"/>
</kw>
<msg time="2026-04-10T00:58:21.056322" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:21.056394" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:21.020707" elapsed="0.035739"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:21.130341" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:21.057282" elapsed="0.073214"/>
</kw>
<msg time="2026-04-10T00:58:21.130688" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:21.130735" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:21.056743" elapsed="0.074029"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.131130" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:21.130867" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.130842" elapsed="0.000518"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:21.131871" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:21.131510" elapsed="0.000512"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.132313" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:21.132093" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.132074" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:21.132426" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:21.133962" elapsed="0.000796"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:21.135044" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:21.135822" elapsed="0.000361"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:21.133311" elapsed="0.002974"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:21.132748" elapsed="0.003602"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:21.019054" elapsed="0.117396"/>
</kw>
<msg time="2026-04-10T00:58:21.136561" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:21.136610" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:21.018364" elapsed="0.118282"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:21.136830" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:21.136724" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.136705" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.137314" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.137669" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:21.137742" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:21.017668" elapsed="0.120183"/>
</kw>
<msg time="2026-04-10T00:58:21.137946" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:21.137992" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:21.013085" elapsed="0.124943"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.138353" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:21.138103" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.138086" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:21.012933" elapsed="0.125520"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:21.144060" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:21.143950" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.143931" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:21.145309" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:21.145190" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.145172" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:21.145862" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:21.145529" elapsed="0.000360"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:21.146278" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:21.146052" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:21.179832" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:21.146839" elapsed="0.033120"/>
</kw>
<msg time="2026-04-10T00:58:21.180271" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:21.180319" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:21.146464" elapsed="0.033891"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:21.259102" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:21.180954" elapsed="0.078487"/>
</kw>
<msg time="2026-04-10T00:58:21.259846" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:21.259949" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:21.180574" elapsed="0.079453"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.260512" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:21.260158" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.260126" elapsed="0.000531"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:21.261336" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:21.260876" elapsed="0.000590"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.261917" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:21.261589" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.261540" elapsed="0.000492"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:21.262084" elapsed="0.000048"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:21.264630" elapsed="0.001167"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:21.266209" elapsed="0.000717"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:21.267346" 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-04-10T00:58:21.263680" elapsed="0.004371"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:21.262504" elapsed="0.005641"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:21.144884" elapsed="0.123407"/>
</kw>
<msg time="2026-04-10T00:58:21.268427" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:21.268493" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:21.144287" elapsed="0.124301"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:21.268866" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:58:21.268706" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.268678" 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 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.269608" elapsed="0.000039"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.270114" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:21.270219" 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-04-10T00:58:21.143437" elapsed="0.126940"/>
</kw>
<msg time="2026-04-10T00:58:21.270511" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:21.270597" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:21.138749" elapsed="0.131901"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.271233" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:21.270818" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.270792" elapsed="0.000614"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:21.138605" elapsed="0.132845"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:21.277146" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:21.277037" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.277018" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:21.278356" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:21.278249" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.278231" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:21.278894" level="INFO">${karaf_connection_index} = 441</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:21.278591" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:21.279324" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:21.279082" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:21.335211" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:21.279870" elapsed="0.055468"/>
</kw>
<msg time="2026-04-10T00:58:21.335570" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:21.335620" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:21.279512" elapsed="0.056145"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:21.474634" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:21.336227" elapsed="0.138567"/>
</kw>
<msg time="2026-04-10T00:58:21.474967" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:21.475016" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:21.335851" elapsed="0.139200"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.475486" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:21.475177" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.475142" elapsed="0.000474"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:21.476123" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "a "r "t "[C "M "i "[78Cn "[A[78Ci
 "n "e "t "[C "A "g "a "i "n "[C "C "o "n "n "e "c "t "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:21.475778" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.476521" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:21.476282" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.476264" elapsed="0.000362"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:21.476664" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:21.478289" elapsed="0.000899"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:21.479487" elapsed="0.000540"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:21.480496" 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-04-10T00:58:21.477585" elapsed="0.003430"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:21.476983" elapsed="0.004097"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:21.277946" elapsed="0.203326"/>
</kw>
<msg time="2026-04-10T00:58:21.481371" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:21.481417" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:21.277370" elapsed="0.204085"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:21.481691" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:58:21.481575" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.481536" elapsed="0.000242"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.482189" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.482848" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:21.482926" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:21.276692" elapsed="0.206349"/>
</kw>
<msg time="2026-04-10T00:58:21.483143" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:21.483187" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:21.271894" elapsed="0.211327"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.483575" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:21.483299" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.483282" elapsed="0.000376"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:21.271671" elapsed="0.212011"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:21.012758" elapsed="0.470958"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:58:21.010204" elapsed="0.473571"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:58:21.004103" elapsed="0.479736"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:21.003507" elapsed="0.480379"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:58:20.999106" elapsed="0.484838"/>
</kw>
<kw name="Start Mininet Single Controller" owner="MininetKeywords">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:21.487015" level="INFO">Clear any existing mininet</msg>
<arg>Clear any existing mininet</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:21.486793" elapsed="0.000269"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:21.489811" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:21.489513" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:21.489495" elapsed="0.000399"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:21.490211" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:21.490043" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:21.490936" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:21.490495" elapsed="0.000487"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:21.491507" level="INFO">${conn_id} = 447</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:21.491139" elapsed="0.000395"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:21.492458" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:58:21.492592" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:21.492179" elapsed="0.000440"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:21.492791" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:58:21.494028" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:58:22.188989" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:58:21 UTC 2026

  System load:  0.21               Processes:             108
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:57:50 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:58:21.493676" elapsed="0.695580"/>
</kw>
<msg time="2026-04-10T00:58:22.189424" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:21.493288" elapsed="0.696320"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:58:21.491781" elapsed="0.698064"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:58:22.190826" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:58:23.326700" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:58:23.327072" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:58:23.327180" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:58:22.190325" elapsed="1.136913"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:23.327773" elapsed="0.000542"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:23.329631" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:23.328897" elapsed="0.000863"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:23.330257" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:23.329946" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:23.329894" elapsed="0.000554"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:58:23.331030" elapsed="0.000098"/>
</return>
<status status="PASS" start="2026-04-10T00:58:23.330697" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:23.330641" elapsed="0.000640"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:23.331368" elapsed="0.000046"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:23.337713" elapsed="0.000344"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:23.338234" elapsed="0.000177"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:23.338584" elapsed="0.000102"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:23.332297" elapsed="0.006444"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:58:21.488987" elapsed="1.849849"/>
</kw>
<msg time="2026-04-10T00:58:23.338893" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:21.488144" elapsed="1.850803"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:58:21.487647" elapsed="1.851383"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:23.341335" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:23.341050" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:23.341028" elapsed="0.000400"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:23.341749" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:23.341603" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:23.342444" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:23.342042" elapsed="0.000451"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:23.343047" level="INFO">${conn_id} = 449</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:23.342672" elapsed="0.000402"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:23.344011" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:58:23.344089" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:23.343725" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:23.344275" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:58:23.345533" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:58:23.716503" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:58:21 UTC 2026

  System load:  0.21               Processes:             108
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:58:22 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:58:23.345197" elapsed="0.371475"/>
</kw>
<msg time="2026-04-10T00:58:23.716753" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:23.344825" elapsed="0.372005"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:58:23.343292" elapsed="0.373657"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:58:23.717477" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:58:23.749790" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:58:23.750041" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:58:23.750140" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:58:23.717203" elapsed="0.032989"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:23.750614" elapsed="0.000461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:23.752172" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:23.751490" elapsed="0.000779"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:23.752760" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:23.752439" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:23.752392" elapsed="0.000527"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:58:23.753277" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-10T00:58:23.753036" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:23.753002" elapsed="0.000463"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:23.753539" elapsed="0.000065"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:23.759922" 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-04-10T00:58:23.760671" elapsed="0.000165"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:23.760987" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:23.754291" elapsed="0.006844"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:58:23.340422" elapsed="0.420809"/>
</kw>
<msg time="2026-04-10T00:58:23.761285" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:23.339847" elapsed="0.421488"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:58:23.339306" elapsed="0.422108"/>
</kw>
<arg>${mininet}</arg>
<status status="PASS" start="2026-04-10T00:58:21.487266" elapsed="2.274204"/>
</kw>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:23.766569" level="INFO">${tools_connection} = 451</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:23.766180" elapsed="0.000417"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:23.768402" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:58:23.768480" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:23.768121" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:23.768682" elapsed="0.000320"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:58:23.769859" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:58:24.077581" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:58:21 UTC 2026

  System load:  0.21               Processes:             108
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:58:23 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:58:23.769529" elapsed="0.308230"/>
</kw>
<msg time="2026-04-10T00:58:24.077860" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:23.769173" elapsed="0.308783"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:58:23.767629" elapsed="0.310450"/>
</kw>
<msg time="2026-04-10T00:58:24.078134" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:23.767170" elapsed="0.311012"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:58:23.766785" elapsed="0.311476"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-04-10T00:58:24.078314" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:58:24.078529" level="INFO">${mininet_conn_id} = 451</msg>
<var>${mininet_conn_id}</var>
<arg>ip_address=${mininet}</arg>
<arg>timeout=${timeout}</arg>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-04-10T00:58:23.765687" elapsed="0.312885"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:24.079323" level="INFO">${mininet_conn_id} = 451</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:24.078903" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="'${custom}' != '${EMPTY}'">
<kw name="Put File" owner="SSHLibrary">
<arg>${custom}</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.081688" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:24.079460" elapsed="0.002287"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.079437" elapsed="0.002335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:24.082234" level="INFO">Start mininet --topo tree,1 to 10.30.171.151</msg>
<arg>Start mininet ${options} to ${controller}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:24.081933" elapsed="0.000347"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:24.084681" level="INFO">sudo mn --controller 'remote,ip=10.30.171.151,port=6633' --topo tree,1 --switch ovsk,protocols=OpenFlow13</msg>
<arg>sudo mn --controller 'remote,ip=${controller},port=${ofport}' ${options} --switch ovsk,protocols=OpenFlow${ofversion}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:24.082445" elapsed="0.002295"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:58:24.275661" level="INFO">[?2004l*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2 
*** Adding switches:
s1 
*** Adding links:
(s1, h1) (s1, h2) 
*** Configuring hosts
h1 h2 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:58:24.084976" elapsed="0.190848"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:24.276582" level="INFO">Check OVS configuratiom</msg>
<arg>Check OVS configuratiom</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:24.276186" elapsed="0.000456"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:24.278042" level="INFO">sh ovs-vsctl show</msg>
<arg>sh ovs-vsctl show</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:24.276820" elapsed="0.001307"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:58:24.289927" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Bridge s1
        Controller "tcp:10.30.171.151:6633"
        Controller "ptcp:6654"
        fail_mode: secure
        Port s1-eth2
            Interface s1-eth2
        Port s1-eth1
            Interface s1-eth1
        Port s1
            Interface s1
                type: internal
    ovs_version: "2.17.11"
mininet&gt;</msg>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:58:24.278296" elapsed="0.011696"/>
</kw>
<return>
<value>${mininet_conn_id}</value>
<status status="PASS" start="2026-04-10T00:58:24.290048" elapsed="0.000086"/>
</return>
<msg time="2026-04-10T00:58:24.290327" level="INFO">${mininet_conn_id} = 451</msg>
<var>${mininet_conn_id}</var>
<arg>${TOOLS_SYSTEM_IP}</arg>
<arg>${ODL_SYSTEM_${Follower_Node_2}_IP}</arg>
<doc>Start Mininet with custom topology and connect to controller.</doc>
<status status="PASS" start="2026-04-10T00:58:21.484257" elapsed="2.806095"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:24.290952" level="INFO">${mininet_conn_id} = 451</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:24.290600" elapsed="0.000394"/>
</kw>
<doc>Start mininet with connection to follower node1.</doc>
<status status="PASS" start="2026-04-10T00:58:20.998424" elapsed="3.292690"/>
</test>
<test id="s1-s3-t40" name="Verify Flows In Switch After Follower Node2 Restart" line="293">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:58:24.295183" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:58:24.294901" elapsed="0.000568"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:24.296637" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:24.296482" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.296459" elapsed="0.000249"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:24.301833" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:24.301723" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.301703" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:24.303007" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:24.302599" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:24.303521" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:24.303211" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:24.303622" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:58:24.303788" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:24.302194" elapsed="0.001619"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:24.309612" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:24.309485" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.309466" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:24.310941" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:24.310833" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.310815" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:24.311462" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:24.311159" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:24.311927" level="INFO">${current_connection_index} = 451</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:24.311674" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:24.340928" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:24.312459" elapsed="0.028582"/>
</kw>
<msg time="2026-04-10T00:58:24.341292" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:24.341341" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:24.312115" elapsed="0.029264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:24.427527" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:24.341997" elapsed="0.085815"/>
</kw>
<msg time="2026-04-10T00:58:24.428050" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:24.428099" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:24.341589" elapsed="0.086548"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.428640" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:24.428269" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.428230" elapsed="0.000502"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:24.429285" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:24.428884" elapsed="0.000500"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.429700" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:24.429452" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.429434" elapsed="0.000375"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:24.429849" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:24.432641" elapsed="0.000185"/>
</kw>
<msg time="2026-04-10T00:58:24.432889" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:24.431470" elapsed="0.001554"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.433301" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.433666" elapsed="0.000096"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:24.430798" elapsed="0.003076"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:24.430188" elapsed="0.003751"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:24.310501" elapsed="0.123536"/>
</kw>
<msg time="2026-04-10T00:58:24.434137" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:24.434181" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:24.309841" elapsed="0.124381"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:24.434410" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:24.434300" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.434282" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.434955" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.435308" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:24.435380" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:24.309135" elapsed="0.126359"/>
</kw>
<msg time="2026-04-10T00:58:24.435615" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:24.435725" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:24.304215" elapsed="0.131551"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.436100" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:24.435844" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.435826" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:24.304058" elapsed="0.132144"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:24.442262" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:24.442147" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.442127" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:24.443493" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:24.443385" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.443368" elapsed="0.000243"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:24.444071" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:24.443763" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:24.444502" level="INFO">${current_connection_index} = 451</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:24.444257" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:24.475243" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:24.445067" elapsed="0.030327"/>
</kw>
<msg time="2026-04-10T00:58:24.475606" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:24.475655" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:24.444711" elapsed="0.030981"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:24.557393" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:24.476314" elapsed="0.081564"/>
</kw>
<msg time="2026-04-10T00:58:24.558210" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:24.558267" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:24.475906" elapsed="0.082406"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.559082" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:24.558510" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.558447" elapsed="0.000743"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:24.559948" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:24.559356" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.560365" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:24.560131" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.560108" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:24.560493" elapsed="0.000082"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:24.563612" elapsed="0.000209"/>
</kw>
<msg time="2026-04-10T00:58:24.563889" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:24.562471" elapsed="0.001574"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.564447" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.564819" elapsed="0.000077"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:24.561730" elapsed="0.003288"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:24.560977" elapsed="0.004111"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:24.443087" elapsed="0.122106"/>
</kw>
<msg time="2026-04-10T00:58:24.565302" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:24.565348" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:24.442488" elapsed="0.122922"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:24.565629" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:58:24.565496" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.565477" elapsed="0.000240"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.566166" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.566536" elapsed="0.000046"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:24.566632" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:24.441793" elapsed="0.124961"/>
</kw>
<msg time="2026-04-10T00:58:24.566863" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:24.566910" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:24.436492" elapsed="0.130456"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.567289" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:24.567032" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.567013" elapsed="0.000354"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:24.436346" elapsed="0.131048"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:24.573510" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:24.573398" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.573377" elapsed="0.000318"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:24.574872" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:24.574762" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.574744" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:24.575410" level="INFO">${karaf_connection_index} = 441</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:24.575090" elapsed="0.000348"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:24.575868" level="INFO">${current_connection_index} = 451</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:24.575617" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:24.635583" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:24.576402" elapsed="0.059291"/>
</kw>
<msg time="2026-04-10T00:58:24.635917" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:24.635964" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:24.576058" elapsed="0.059943"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:24.746443" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:24.636578" elapsed="0.110347"/>
</kw>
<msg time="2026-04-10T00:58:24.747195" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:24.747246" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:24.636187" elapsed="0.111097"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.747885" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:24.747438" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.747390" elapsed="0.000593"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:24.748625" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "F "[78Cl "[A[78Co
 "w "s "[C "I "n "[C "S "w "i "t "c "h "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:24.748140" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.749041" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:24.748797" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.748779" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:24.749165" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:24.752037" elapsed="0.000198"/>
</kw>
<msg time="2026-04-10T00:58:24.752300" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:24.750950" elapsed="0.001497"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.752763" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.753132" elapsed="0.000078"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:24.750235" elapsed="0.003096"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:24.749587" elapsed="0.003812"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:24.574429" elapsed="0.179072"/>
</kw>
<msg time="2026-04-10T00:58:24.753775" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:24.753822" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:24.573855" elapsed="0.180006"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:24.754054" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:24.753943" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.753924" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.754594" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.754956" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:24.755031" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:24.573010" elapsed="0.182145"/>
</kw>
<msg time="2026-04-10T00:58:24.755262" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:24.755309" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:24.567730" elapsed="0.187619"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:24.755707" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:24.755429" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.755411" elapsed="0.000373"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:24.567573" elapsed="0.188237"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:24.303873" elapsed="0.451982"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:58:24.301338" elapsed="0.454633"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:58:24.296159" elapsed="0.459879"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:24.295683" elapsed="0.460407"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:58:24.292339" elapsed="0.463813"/>
</kw>
<kw name="Verify Aggregate Flow From Mininet Session" owner="MininetKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:24.758495" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:24.757990" elapsed="0.000839"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.757972" elapsed="0.000883"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:24.759299" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:24.759029" elapsed="0.000297"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:24.760201" elapsed="0.000172"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:24.759981" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:24.759964" elapsed="0.000470"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:24.762851" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:24.760591" elapsed="0.002317"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:58:24.790299" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<msg time="2026-04-10T00:58:24.790398" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:58:24.763074" elapsed="0.027351"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:58:24.790476" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:58:24.790654" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=0
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 451 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:58:24.759677" elapsed="0.031005"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:58:24.791131" level="INFO">${flows} = ['0']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:58:24.790858" elapsed="0.000298"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:24.791743" level="INFO">${total_flows} = 0</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:24.791327" elapsed="0.000443"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:58:24.792256" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-04-10T00:58:24.792377" level="FAIL">0.0 != 1000.0</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="FAIL" start="2026-04-10T00:58:24.791967" elapsed="0.000505">0.0 != 1000.0</status>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="FAIL" start="2026-04-10T00:58:24.757677" elapsed="0.034938">0.0 != 1000.0</status>
</kw>
<kw name="Check Flows In Mininet" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:26.795763" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:26.795150" elapsed="0.001161"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:26.795100" elapsed="0.001273"/>
</if>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:26.797507" level="INFO">${cmd} = dpctl dump-aggregate -O OpenFlow13</msg>
<var>${cmd}</var>
<arg>dpctl dump-aggregate -O OpenFlow13</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:26.796855" elapsed="0.000754"/>
</kw>
<kw name="Send Mininet Command" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:26.799765" elapsed="0.000384"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:26.799196" elapsed="0.001035"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:26.799156" elapsed="0.001128"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:26.803494" level="INFO">dpctl dump-aggregate -O OpenFlow13</msg>
<arg>${cmd}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:26.800693" elapsed="0.002885"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:58:26.830950" level="INFO">*** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<msg time="2026-04-10T00:58:26.831056" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<var>${output}</var>
<arg>mininet&gt;</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:58:26.803750" elapsed="0.027334"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:58:26.831245" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:58:26.831429" level="INFO">${output} = *** s1 ------------------------------------------------------------------------
OFPST_AGGREGATE reply (OF1.3) (xid=0x2): packet_count=0 byte_count=0 flow_count=1000
mininet&gt;</msg>
<var>${output}</var>
<arg>${mininet_conn}</arg>
<arg>${cmd}</arg>
<doc>Sends Command dpctl dump-aggregate -O OpenFlow13 to Mininet session 451 and returns read buffer response.</doc>
<status status="PASS" start="2026-04-10T00:58:26.798346" elapsed="0.033111"/>
</kw>
<kw name="Get Regexp Matches" owner="String">
<msg time="2026-04-10T00:58:26.831923" level="INFO">${flows} = ['1000']</msg>
<var>${flows}</var>
<arg>${output}</arg>
<arg>(?&lt;=flow_count\=).*?(?=\r)</arg>
<doc>Returns a list of all non-overlapping matches in the given string.</doc>
<status status="PASS" start="2026-04-10T00:58:26.831660" elapsed="0.000288"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:26.832559" level="INFO">${total_flows} = 1000</msg>
<var>${total_flows}</var>
<arg>sum(map(int, ${flows}))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:26.832115" elapsed="0.000472"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-04-10T00:58:26.833081" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${total_flows}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to real numbers.</doc>
<status status="PASS" start="2026-04-10T00:58:26.832790" elapsed="0.000361"/>
</kw>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Sync with mininet to match exact number of flows</doc>
<status status="PASS" start="2026-04-10T00:58:26.794152" elapsed="0.039059"/>
</kw>
<arg>${time_out}</arg>
<arg>2s</arg>
<arg>MininetKeywords.Check Flows In Mininet</arg>
<arg>${mininet_conn}</arg>
<arg>${flow_count}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:58:24.756971" elapsed="2.076291"/>
</kw>
<arg>${mininet_conn_id}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${operation_timeout}</arg>
<doc>Verify flow count per switch</doc>
<status status="PASS" start="2026-04-10T00:58:24.756391" elapsed="2.076936"/>
</kw>
<doc>Verify flows are installed in switch after follower restart.</doc>
<status status="PASS" start="2026-04-10T00:58:24.291705" elapsed="2.541747"/>
</test>
<test id="s1-s3-t41" name="Stop Mininet Connected To Follower Node2" line="300">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:58:26.837686" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:58:26.837398" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:26.838988" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:26.838872" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:26.838853" elapsed="0.000205"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:26.844068" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:26.843960" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:26.843942" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:26.845197" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:26.844802" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:26.845709" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:26.845388" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:26.845779" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:26.845935" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:26.844393" elapsed="0.001566"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:26.851462" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:26.851337" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:26.851317" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:26.852803" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:26.852696" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:26.852678" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:26.853320" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:26.853018" elapsed="0.000328"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:26.853778" level="INFO">${current_connection_index} = 451</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:26.853507" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:26.886993" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:26.854374" elapsed="0.032872"/>
</kw>
<msg time="2026-04-10T00:58:26.887511" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:26.887592" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:26.853964" elapsed="0.033837"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:26.958381" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:26.888639" elapsed="0.070001"/>
</kw>
<msg time="2026-04-10T00:58:26.958894" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:26.958944" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:26.888100" elapsed="0.070884"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:26.959444" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:26.959110" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:26.959071" elapsed="0.000464"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:26.960150" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:26.959726" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:26.960538" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:26.960315" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:26.960296" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:26.960673" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:26.963512" elapsed="0.000201"/>
</kw>
<msg time="2026-04-10T00:58:26.963775" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:26.962270" elapsed="0.001642"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:26.964216" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:26.964774" elapsed="0.000083"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:26.961610" elapsed="0.003364"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:26.961007" elapsed="0.004035"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:26.852302" elapsed="0.112840"/>
</kw>
<msg time="2026-04-10T00:58:26.965239" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:26.965283" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:26.851697" elapsed="0.113626"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:26.965508" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:26.965400" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:26.965383" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:26.966033" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:26.966375" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:26.966446" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:26.850996" elapsed="0.115571"/>
</kw>
<msg time="2026-04-10T00:58:26.966665" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:26.966708" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:26.846341" elapsed="0.120406"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:26.967145" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:26.966889" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:26.966870" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:26.846194" elapsed="0.121053"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:26.972802" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:26.972692" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:26.972672" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:26.974008" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:26.973901" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:26.973884" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:26.974520" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:26.974221" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:26.974973" level="INFO">${current_connection_index} = 451</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:26.974725" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:27.009667" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:26.975499" elapsed="0.034564"/>
</kw>
<msg time="2026-04-10T00:58:27.010404" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:27.010475" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:26.975159" elapsed="0.035366"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:27.096942" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:27.011513" elapsed="0.085901"/>
</kw>
<msg time="2026-04-10T00:58:27.097816" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:27.097870" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:27.010901" elapsed="0.087011"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:27.098689" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:27.098124" elapsed="0.000640"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:27.098049" elapsed="0.000751"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:27.099533" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:27.098965" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:27.100013" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:27.099743" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:27.099723" elapsed="0.000372"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:27.100141" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:27.103177" elapsed="0.000211"/>
</kw>
<msg time="2026-04-10T00:58:27.103455" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:27.102057" elapsed="0.001584"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:27.103962" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:27.104444" elapsed="0.000079"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:27.101299" elapsed="0.003360"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:27.100599" elapsed="0.004130"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:26.973603" elapsed="0.131229"/>
</kw>
<msg time="2026-04-10T00:58:27.104943" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:27.104990" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:26.973020" elapsed="0.132010"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:27.105244" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:58:27.105118" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:27.105097" 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 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:27.105840" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:27.106206" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:27.106280" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:26.972273" elapsed="0.134121"/>
</kw>
<msg time="2026-04-10T00:58:27.106498" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:27.106559" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:26.967532" elapsed="0.139068"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:27.106948" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:27.106682" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:27.106665" elapsed="0.000361"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:26.967387" elapsed="0.139664"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:27.113255" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:27.113126" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:27.113101" elapsed="0.000235"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:27.114726" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:27.114611" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:27.114592" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:27.115307" level="INFO">${karaf_connection_index} = 441</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:27.114952" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:27.115824" level="INFO">${current_connection_index} = 451</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:27.115514" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:27.156965" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:27.116367" elapsed="0.040917"/>
</kw>
<msg time="2026-04-10T00:58:27.157602" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:27.157654" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:27.116018" elapsed="0.041675"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:27.271928" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:27.158601" elapsed="0.114235"/>
</kw>
<msg time="2026-04-10T00:58:27.273167" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:27.273350" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:27.158030" elapsed="0.115381"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:27.274102" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:27.273619" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:27.273533" elapsed="0.000702"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:27.275036" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "S "t "o "p "[C "M "i "n "[78Ci "[A[78Cn
 "e "t "[C "C "o "n "n "e "c "t "e "d "[C "T "o "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:27.274453" elapsed="0.000720"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:27.275664" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:27.275276" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:27.275249" elapsed="0.000535"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:27.275838" elapsed="0.000057"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:27.279813" elapsed="0.000271"/>
</kw>
<msg time="2026-04-10T00:58:27.280178" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:27.278177" elapsed="0.002200"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:27.280941" elapsed="0.000115"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:27.281447" elapsed="0.000132"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:27.277184" elapsed="0.004565"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:27.276300" elapsed="0.005548"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:27.114268" elapsed="0.167728"/>
</kw>
<msg time="2026-04-10T00:58:27.282138" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:27.282202" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:27.113538" elapsed="0.168722"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:27.282571" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-10T00:58:27.282379" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:27.282351" elapsed="0.000352"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:27.283310" elapsed="0.000039"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:27.283905" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:27.284017" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:27.112673" elapsed="0.171505"/>
</kw>
<msg time="2026-04-10T00:58:27.284320" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:27.284378" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:27.107375" elapsed="0.177044"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:27.284771" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:27.284497" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:27.284480" elapsed="0.000369"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:27.107211" elapsed="0.177662"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:26.846016" elapsed="0.438894"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:58:26.843598" elapsed="0.441377"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:58:26.838576" elapsed="0.446512"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:26.838113" elapsed="0.447026"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:58:26.834521" elapsed="0.450678"/>
</kw>
<kw name="Stop Mininet And Exit" owner="MininetKeywords">
<if>
<branch type="IF" condition="&quot;&quot;&quot;${mininet_conn}&quot;&quot;&quot; != &quot;&quot;">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${mininet_conn}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:27.290336" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:27.290107" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:27.290089" elapsed="0.000555"/>
</if>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:27.292646" level="INFO">exit</msg>
<arg>exit</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:27.290791" elapsed="0.001915"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<msg time="2026-04-10T00:58:27.464691" level="INFO">*** Stopping 1 controllers
c0 
*** Stopping 2 links
..
*** Stopping 1 switches
s1 
*** Stopping 2 hosts
h1 h2 
*** Done
completed in 3.321 seconds
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${TOOLS_SYSTEM_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="PASS" start="2026-04-10T00:58:27.292884" elapsed="0.172059"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:27.465337" elapsed="0.000338"/>
</kw>
<arg>${mininet_conn_id}</arg>
<doc>Stops Mininet and exits session ${mininet_conn}</doc>
<status status="PASS" start="2026-04-10T00:58:27.289809" elapsed="0.175966"/>
</kw>
<kw name="Clean Mininet System" owner="Utils">
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:27.469892" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:27.469436" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:27.469399" elapsed="0.000615"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:27.470462" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:27.470236" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:27.471471" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:27.470896" elapsed="0.000641"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:27.472743" level="INFO">${conn_id} = 452</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:27.471786" elapsed="0.000997"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:27.474168" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:58:27.474358" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:27.473770" elapsed="0.000631"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:27.474658" elapsed="0.000579"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:58:27.476324" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:58:27.788362" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:58:21 UTC 2026

  System load:  0.21               Processes:             108
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:58:24 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:58:27.475988" elapsed="0.312533"/>
</kw>
<msg time="2026-04-10T00:58:27.788626" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:27.475456" elapsed="0.313255"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:58:27.473174" elapsed="0.315656"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:58:27.789386" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-10T00:58:28.976011" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-10T00:58:28.976756" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:58:28.976904" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:58:27.789110" elapsed="1.187874"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:28.977608" elapsed="0.000545"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:28.979128" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:28.978566" elapsed="0.000664"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:28.979667" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:28.979385" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:28.979340" 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-04-10T00:58:28.980107" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-10T00:58:28.979911" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:28.979881" elapsed="0.000391"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:28.980339" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:28.985808" elapsed="0.000624"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:28.986632" elapsed="0.000177"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:28.986964" elapsed="0.000099"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:28.981000" elapsed="0.006118"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:58:27.468664" elapsed="1.518548"/>
</kw>
<msg time="2026-04-10T00:58:28.987270" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:27.467674" elapsed="1.519650"/>
</kw>
<arg>${system}</arg>
<arg>sudo mn -c</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:58:27.466876" elapsed="1.520530"/>
</kw>
<kw name="Run Command On Mininet" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:28.989627" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:28.989321" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:28.989299" elapsed="0.000410"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:28.990008" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:28.989864" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:28.990965" 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.170.218" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:28.990298" elapsed="0.000717"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:28.991567" level="INFO">${conn_id} = 454</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:28.991178" elapsed="0.000417"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:28.992733" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:58:28.992812" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:28.992407" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:28.993094" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:58:28.994293" level="INFO">Logging into '10.30.170.218:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:58:29.310396" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Fri Apr 10 00:58:21 UTC 2026

  System load:  0.21               Processes:             108
  Usage of /:   19.7% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.170.218
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:58:27 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:58:28.993976" elapsed="0.316671"/>
</kw>
<msg time="2026-04-10T00:58:29.310764" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:28.993615" elapsed="0.317255"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:58:28.992007" elapsed="0.319008"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:58:29.311687" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-10T00:58:29.344450" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-10T00:58:29.344793" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:58:29.344895" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:58:29.311347" elapsed="0.033599"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:29.345362" elapsed="0.000535"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.347020" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:29.346339" elapsed="0.000775"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.347731" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:29.347315" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.347252" elapsed="0.000674"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:58:29.348424" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-04-10T00:58:29.348120" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.348079" elapsed="0.000548"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.348688" elapsed="0.000020"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:29.355612" elapsed="0.000502"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:29.356359" elapsed="0.000255"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:29.356831" elapsed="0.000137"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:29.349151" elapsed="0.007893"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:58:28.988742" elapsed="0.368449"/>
</kw>
<msg time="2026-04-10T00:58:29.357269" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:28.988121" elapsed="0.369219"/>
</kw>
<arg>${system}</arg>
<arg>sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-10T00:58:28.987616" elapsed="0.369835"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:27.466212" elapsed="1.891316"/>
</kw>
<doc>Stop mininet and exit connection.</doc>
<status status="PASS" start="2026-04-10T00:58:26.833939" elapsed="2.523759"/>
</test>
<test id="s1-s3-t42" name="Delete All Flows From Follower Node 2" line="305">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:58:29.361915" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:58:29.361648" elapsed="0.000532"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.363711" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:29.363074" elapsed="0.000691"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.363055" elapsed="0.000734"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.368901" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:29.368793" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.368775" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.369986" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:29.369589" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.370488" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:29.370174" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:29.370575" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:29.370734" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:29.369199" elapsed="0.001560"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.376378" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:29.376269" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.376250" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.377655" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:29.377521" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.377504" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:29.378174" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:29.377872" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:29.378609" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:29.378362" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:29.427573" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:29.379135" elapsed="0.048819"/>
</kw>
<msg time="2026-04-10T00:58:29.428396" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:29.428501" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.378797" elapsed="0.049830"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:29.500417" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[C "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:29.430055" elapsed="0.070643"/>
</kw>
<msg time="2026-04-10T00:58:29.500949" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:29.500998" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.429117" elapsed="0.071920"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.501583" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:29.501182" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.501134" elapsed="0.000546"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.502269" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[C "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:29.501836" elapsed="0.000528"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.502676" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:29.502433" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.502414" elapsed="0.000423"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:29.502884" elapsed="0.000050"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:29.504609" elapsed="0.000783"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:29.505697" elapsed="0.000515"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:29.506483" 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-04-10T00:58:29.503907" elapsed="0.003071"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:29.503254" elapsed="0.003789"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:29.377220" elapsed="0.129926"/>
</kw>
<msg time="2026-04-10T00:58:29.507248" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:29.507295" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.376619" elapsed="0.130714"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:29.507525" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-10T00:58:29.507414" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.507396" elapsed="0.000233"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.508069" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.508420" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.508491" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:29.375893" elapsed="0.132730"/>
</kw>
<msg time="2026-04-10T00:58:29.508726" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:29.508771" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.371138" elapsed="0.137670"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.509143" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:29.508887" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.508869" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:29.370993" elapsed="0.138251"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.515258" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:29.515148" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.515129" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.516506" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:29.516398" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.516381" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:29.517060" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:29.516756" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:29.517472" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:29.517249" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:29.613101" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:29.518020" elapsed="0.095328"/>
</kw>
<msg time="2026-04-10T00:58:29.613623" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:29.613673" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.517680" elapsed="0.096030"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:29.634065" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[C "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:29.615774" elapsed="0.018435"/>
</kw>
<msg time="2026-04-10T00:58:29.634377" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:29.634426" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.613986" elapsed="0.020476"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.634863" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:29.634593" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.634539" elapsed="0.000409"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.635409" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[C "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:29.635097" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.635876" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:29.635630" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.635608" elapsed="0.000358"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:29.636005" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:29.637783" elapsed="0.000827"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:29.638896" elapsed="0.000478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:29.639744" elapsed="0.000363"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:29.637111" elapsed="0.003099"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:29.636340" elapsed="0.003934"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:29.516095" elapsed="0.124281"/>
</kw>
<msg time="2026-04-10T00:58:29.640477" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:29.640523" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.515484" elapsed="0.125092"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:29.640768" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:29.640658" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.640639" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.641267" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.641626" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.641700" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:29.514750" elapsed="0.127062"/>
</kw>
<msg time="2026-04-10T00:58:29.641909" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:29.641955" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.509561" elapsed="0.132433"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.642323" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:29.642071" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.642053" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:29.509389" elapsed="0.133079"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.648325" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:29.648218" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.648200" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.649527" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:29.649420" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.649403" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:29.650059" level="INFO">${karaf_connection_index} = 441</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:29.649760" elapsed="0.000326"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:29.650468" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:29.650246" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:29.687778" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:29.651011" elapsed="0.036950"/>
</kw>
<msg time="2026-04-10T00:58:29.688181" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:29.688229" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.650672" elapsed="0.037594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:29.774249" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[C "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:29.688960" elapsed="0.085572"/>
</kw>
<msg time="2026-04-10T00:58:29.774796" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:29.774844" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.688503" elapsed="0.086379"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.775381" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:29.775012" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.774972" elapsed="0.000499"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.776040" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[C "2 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:29.775642" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.776418" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:29.776201" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.776183" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:29.776538" elapsed="0.000063"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:29.778133" elapsed="0.000801"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:29.779220" elapsed="0.000533"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:29.780021" elapsed="0.000366"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:29.777465" elapsed="0.003022"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:29.776887" elapsed="0.003680"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:29.649120" elapsed="0.131550"/>
</kw>
<msg time="2026-04-10T00:58:29.780769" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:29.780813" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.648562" elapsed="0.132358"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:29.781112" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:29.781002" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.780984" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.781627" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.781978" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.782051" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:29.647868" elapsed="0.134294"/>
</kw>
<msg time="2026-04-10T00:58:29.782261" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:29.782306" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.642776" elapsed="0.139568"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.782693" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:29.782422" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.782404" elapsed="0.000367"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:29.642630" elapsed="0.140164"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:29.370818" elapsed="0.412011"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:58:29.368415" elapsed="0.414471"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:58:29.362781" elapsed="0.420166"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.362331" elapsed="0.420664"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:58:29.359053" elapsed="0.423998"/>
</kw>
<kw name="Delete Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Delete Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.794165" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:29.793856" elapsed="0.000336"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:29.794238" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:29.794388" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:29.793484" elapsed="0.000929"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.808383" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:29.808122" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.808843" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:29.808604" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.809288" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:29.809041" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.809750" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:29.809489" elapsed="0.000304"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:29.810637" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:58:29.810416" elapsed="0.000248"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:58:29.810990" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:58:29.810820" elapsed="0.000195"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:58:29.811166" elapsed="0.000498"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.812118" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:29.811860" elapsed="0.000371"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:58:29.812276" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:29.812437" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:58:29.809996" elapsed="0.002466"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:29.828248" level="INFO">POST Request : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Content-Length': '402', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:58:29.828299" level="INFO">POST Response : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:29.828410" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:29.814979" elapsed="0.013458"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:29.812535" elapsed="0.016001"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.828988" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:29.828642" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.812517" elapsed="0.016668"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.837034" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:29.831531" elapsed="0.005599"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:29.831007" elapsed="0.006200"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.830968" elapsed="0.006292"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.840634" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:29.837904" elapsed="0.002776"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:29.837381" elapsed="0.003334"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.837345" elapsed="0.003394"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.841340" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:29.840926" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.841692" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:29.841437" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.842240" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:29.841940" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:29.841774" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.841420" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.842864" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:29.842481" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.843194" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:29.842961" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.843778" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:29.843459" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:29.843297" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.842944" elapsed="0.000940"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:29.844042" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:29.844873" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:29.844581" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:29.845058" elapsed="0.002386"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:29.830008" elapsed="0.017502"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.847768" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:29.847658" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.847639" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:29.850387" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:29.847985" elapsed="0.002429"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:29.850463" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:58:29.850644" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:29.805251" elapsed="0.045418"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:29.850736" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:29.850886" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:58:29.802581" elapsed="0.048330"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:29.850961" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:29.851108" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:29.793039" elapsed="0.058094"/>
</kw>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Delete Bulk Flow in member 3 according to ${json_body_del}.</doc>
<status status="PASS" start="2026-04-10T00:58:29.788595" elapsed="0.062604"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.858234" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:29.857932" elapsed="0.000330"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:29.858308" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:29.858458" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:29.857581" elapsed="0.000902"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.865166" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:29.864916" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.865630" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:29.865370" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:29.873014" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:29.873071" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:29 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782709,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:29.873162" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:29.867808" elapsed="0.005380"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:29.865742" elapsed="0.007487"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.873409" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:29.873256" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.865723" elapsed="0.007771"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.876931" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782709,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:29.874516" elapsed="0.002463"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:29.874294" elapsed="0.002719"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.874277" elapsed="0.002760"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.879931" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:29.877314" elapsed="0.002763"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:29.877092" elapsed="0.003038"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.877076" elapsed="0.003090"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.880985" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:29.880410" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.881481" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:29.881129" elapsed="0.000459"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.882314" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:29.881871" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:29.881625" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.881103" elapsed="0.001336"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.883252" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:29.882699" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.883763" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:29.883394" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.884572" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:29.884122" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:29.883883" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.883369" elapsed="0.001327"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:29.884918" elapsed="0.000501"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:29.886085" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:29.885686" elapsed="0.000438"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:29.886355" elapsed="0.002910"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:29.873873" elapsed="0.015456"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:29.889509" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:29.889398" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.889380" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:29.889761" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.889833" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:58:29.892137" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782709,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:29.858838" elapsed="0.033327"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:29.892217" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:29.892366" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782709,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:29.857114" elapsed="0.035278"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.893371" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782709, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:29.892971" elapsed="0.000428"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:29.893447" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:29.893623" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782709, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:29.892632" elapsed="0.001017"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:29.894008" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:29.893829" elapsed="0.000204"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.894577" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:29.894252" elapsed="0.000352"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.895047" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:29.894781" elapsed="0.000291"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:58:29.895265" elapsed="0.000367"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:58:29.852475" elapsed="0.043221"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:58:29.851885" elapsed="0.043859"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 3.</doc>
<status status="PASS" start="2026-04-10T00:58:29.851449" elapsed="0.044355"/>
</kw>
<arg>${temp_json_config_del}</arg>
<arg>${Follower_Node_2}</arg>
<arg>${operation_timeout}</arg>
<doc>Delete Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:58:29.788069" elapsed="0.107788"/>
</kw>
<doc>1000 Flows deleted via Leader Node and verify it gets applied in all instances.</doc>
<status status="PASS" start="2026-04-10T00:58:29.358195" elapsed="0.537783"/>
</test>
<test id="s1-s3-t43" name="Verify No Flows In Cluster After Follower Node2 Restart" line="312">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:58:29.899330" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:58:29.899034" elapsed="0.000577"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.900601" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:29.900475" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.900457" elapsed="0.000213"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.905683" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:29.905576" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.905557" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.906737" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:29.906345" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:29.907247" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:29.906925" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:29.907317" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:29.907475" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:29.905972" elapsed="0.001530"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.913304" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:29.913196" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.913177" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:29.914611" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:29.914479" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:29.914461" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:29.915180" level="INFO">${karaf_connection_index} = 299</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:29.914828" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:29.915617" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:29.915373" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:29.944254" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:29.916146" elapsed="0.028211"/>
</kw>
<msg time="2026-04-10T00:58:29.944521" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:29.944591" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.915807" elapsed="0.028823"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:30.023896" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:29.945146" elapsed="0.078946"/>
</kw>
<msg time="2026-04-10T00:58:30.024277" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:30.024326" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.944805" elapsed="0.079559"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.024717" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.024450" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.024429" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.025262" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.024948" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.025669" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.025429" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.025411" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:30.025782" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:30.027250" elapsed="0.000795"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:30.028326" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:30.029077" elapsed="0.000357"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:30.026609" elapsed="0.002929"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:30.026045" elapsed="0.003584"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:29.914176" elapsed="0.115555"/>
</kw>
<msg time="2026-04-10T00:58:30.029825" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:30.029872" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.913526" elapsed="0.116385"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:30.030097" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:30.029990" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.029972" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.030605" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.030946" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:30.031033" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:29.912853" elapsed="0.118290"/>
</kw>
<msg time="2026-04-10T00:58:30.031238" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:30.031283" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.907897" elapsed="0.123424"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.031668" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.031399" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.031381" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:29.907753" elapsed="0.124018"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:30.037315" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:30.037207" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.037188" 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-04-10T00:58:30.038709" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:30.038599" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.038580" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:30.039241" level="INFO">${karaf_connection_index} = 303</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:30.038924" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:30.039672" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:30.039428" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:30.072804" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:30.040199" elapsed="0.032717"/>
</kw>
<msg time="2026-04-10T00:58:30.073078" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:30.073124" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:30.039860" elapsed="0.033301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:30.159655" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:30.073700" elapsed="0.086113"/>
</kw>
<msg time="2026-04-10T00:58:30.159986" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:30.160036" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:30.073334" elapsed="0.086739"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.160387" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.160157" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.160137" elapsed="0.000330"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.160932" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.160636" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.161311" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.161095" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.161077" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:30.161421" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:30.162889" elapsed="0.000766"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:30.163930" elapsed="0.000441"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:30.164649" elapsed="0.000347"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:30.162234" elapsed="0.002862"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:30.161701" elapsed="0.003458"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:30.038271" elapsed="0.126986"/>
</kw>
<msg time="2026-04-10T00:58:30.165350" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:30.165394" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:30.037694" elapsed="0.127737"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:30.165643" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:30.165513" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.165493" elapsed="0.000293"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.166183" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.166522" elapsed="0.000041"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:30.166612" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:30.036866" elapsed="0.129856"/>
</kw>
<msg time="2026-04-10T00:58:30.166846" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:30.166891" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:30.032041" elapsed="0.134887"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.167253" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.167005" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.166988" elapsed="0.000342"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:30.031897" elapsed="0.135455"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:30.172877" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:30.172769" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.172750" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:30.174188" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:30.174081" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.174064" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:30.174712" level="INFO">${karaf_connection_index} = 441</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:30.174400" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:30.175131" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:30.174914" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:30.209896" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:30.175672" elapsed="0.034326"/>
</kw>
<msg time="2026-04-10T00:58:30.210156" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:30.210203" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:30.175318" elapsed="0.034921"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:30.299267" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:30.210807" elapsed="0.088816"/>
</kw>
<msg time="2026-04-10T00:58:30.299871" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:30.299920" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:30.210411" elapsed="0.089546"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.300794" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.300098" elapsed="0.000822"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.300055" elapsed="0.000900"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.301530" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R "e "c "o "v "e "r "y "[C "B "u "l "k "F "l "o "w "[C "S "i "n "g "l "e "[C "S "w "i "t "c "h ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "2 "[C "R "e "s "t "a "r "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.301113" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.302072" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.301798" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.301780" elapsed="0.000372"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:30.302191" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:30.303941" elapsed="0.000809"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:30.305084" elapsed="0.000498"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:30.305889" elapsed="0.000376"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:30.303200" elapsed="0.003168"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:30.302530" elapsed="0.003902"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:30.173780" elapsed="0.132753"/>
</kw>
<msg time="2026-04-10T00:58:30.306661" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:30.306707" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:30.173097" elapsed="0.133648"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:30.306984" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:30.306824" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.306806" 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 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.307485" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.307879" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:30.307967" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:30.172411" elapsed="0.135671"/>
</kw>
<msg time="2026-04-10T00:58:30.308180" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:30.308224" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "H "A "[C "D "a "t "a "[C "R...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:30.167630" elapsed="0.140630"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.308606" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.308336" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.308319" elapsed="0.000365"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:30.167472" elapsed="0.141235"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:29.907575" elapsed="0.401167"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:58:29.905205" elapsed="0.403597"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:58:29.900189" elapsed="0.408718"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:29.899766" elapsed="0.409201"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:58:29.896914" elapsed="0.412112"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.321050" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:30.320625" elapsed="0.000455"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.321568" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:30.321244" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:30.321642" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:58:30.321805" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:30.320207" elapsed="0.001686"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.332715" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:30.332366" elapsed="0.000378"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:30.332795" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:58:30.332953" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:30.332006" elapsed="0.000972"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.348897" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.348559" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.349374" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.349129" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.349836" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.349592" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.350328" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.350088" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:30.351214" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:58:30.351015" elapsed="0.000224"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:58:30.351578" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:58:30.351393" elapsed="0.000211"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:58:30.351756" elapsed="0.000201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.352354" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.352112" elapsed="0.000285"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:58:30.352442" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:58:30.352626" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:58:30.350612" elapsed="0.002039"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:30.364182" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node043mupth11ofw1db2yai791kq42.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:58:30.364231" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:30.364328" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:30.354899" elapsed="0.009455"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.352731" elapsed="0.011668"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.364974" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.364426" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.352710" elapsed="0.012530"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.373305" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.367965" elapsed="0.005405"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.367399" elapsed="0.006022"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.367357" elapsed="0.006100"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.377178" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.373917" elapsed="0.003310"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.373563" elapsed="0.003700"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.373518" elapsed="0.003770"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.377938" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:30.377480" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.378370" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.378116" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.379891" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:30.379193" elapsed="0.000738"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.378454" elapsed="0.001533"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.378096" elapsed="0.001924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.380658" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:30.380205" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.381031" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.380776" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.381606" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:30.381277" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.381114" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.380751" elapsed="0.000941"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:30.381863" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:30.382750" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:30.382386" elapsed="0.000391"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:30.382938" elapsed="0.002841"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:30.366193" elapsed="0.019657"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:30.386039" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:30.385928" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.385909" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:30.388710" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:30.386261" elapsed="0.002476"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:30.388785" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:58:30.388953" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:30.343945" elapsed="0.045032"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:30.389046" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:30.389197" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:58:30.340920" elapsed="0.048302"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:30.389274" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:58:30.389422" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:30.331537" elapsed="0.057910"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:58:30.326784" elapsed="0.062729"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:30.322182" elapsed="0.067382"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.399919" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:30.399617" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:30.399990" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:30.400141" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:30.399253" elapsed="0.000996"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.413764" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.413486" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.414205" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.413967" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.414713" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.414404" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.415147" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.414911" elapsed="0.000279"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:30.416009" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:58:30.415813" elapsed="0.000221"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:58:30.416359" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:58:30.416190" elapsed="0.000193"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:58:30.416534" elapsed="0.000204"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.417149" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.416896" elapsed="0.000297"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:58:30.417234" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:30.417389" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:58:30.415389" elapsed="0.002025"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:30.430494" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0ql8ut9xe1khg1jczngik0xa230.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:58:30.430592" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:30.430717" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:30.419767" elapsed="0.010986"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.417485" elapsed="0.013332"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.431071" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.430854" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.417467" elapsed="0.013727"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.436000" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.432658" elapsed="0.003402"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.432320" elapsed="0.003788"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.432295" elapsed="0.003848"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.439754" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.436528" elapsed="0.003272"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.436220" elapsed="0.003616"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.436196" elapsed="0.003664"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.440394" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:30.440023" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.440743" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.440491" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.441289" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:30.440988" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.440827" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.440473" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.441916" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:30.441537" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.442294" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.442053" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.442875" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:30.442576" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.442378" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.442034" elapsed="0.000924"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:30.443110" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:30.443903" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:30.443634" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:30.444084" elapsed="0.002384"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:30.431716" elapsed="0.014815"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:30.446726" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:30.446622" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.446603" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:30.449319" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:30.446938" elapsed="0.002408"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:30.449393" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:30.449560" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:30.410829" elapsed="0.038757"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:30.449651" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:30.449799" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:58:30.408239" elapsed="0.041584"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:30.449873" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:58:30.450014" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:30.398808" elapsed="0.051230"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:58:30.394254" elapsed="0.055844"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:30.389677" elapsed="0.060453"/>
</iter>
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.460540" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:30.460240" elapsed="0.000348"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:30.460634" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:30.460783" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:30.459896" elapsed="0.000911"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.474716" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.474441" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.475155" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.474920" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.475609" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.475353" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.476090" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.475848" elapsed="0.000285"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:30.476945" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:58:30.476756" elapsed="0.000214"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:58:30.477292" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:58:30.477124" elapsed="0.000193"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:58:30.477468" elapsed="0.000201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.478071" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.477827" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:58:30.478156" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:30.478310" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:58:30.476330" elapsed="0.002021"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:30.488782" level="INFO">POST Request : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0gxdxny6fg6jf1iicffluo8zxu0.node0', 'Content-Length': '260', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:58:30.488848" level="INFO">POST Response : url=http://10.30.171.151:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:30.488972" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:30.480486" elapsed="0.008522"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.478424" elapsed="0.010648"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.489319" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.489108" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.478406" elapsed="0.011034"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.494455" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.490912" elapsed="0.003605"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.490603" elapsed="0.003981"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.490576" elapsed="0.004044"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.498269" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.495012" elapsed="0.003361"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.494700" elapsed="0.003723"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.494675" elapsed="0.003782"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.499222" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:30.498706" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.499713" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.499358" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.500465" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:30.500052" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.499827" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.499333" elapsed="0.001270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.501328" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:30.500826" elapsed="0.000539"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.501814" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.501462" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.502608" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:30.502152" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.501927" elapsed="0.000769"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.501437" elapsed="0.001288"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:30.502934" elapsed="0.000558"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:30.504129" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:30.503749" elapsed="0.000416"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:30.504382" elapsed="0.003435"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:30.489954" elapsed="0.017952"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:30.508156" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:30.508008" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.507982" elapsed="0.000269"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:30.511646" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:30.508460" elapsed="0.003213"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:30.511723" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:58:30.511886" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:30.471701" elapsed="0.040210"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:30.511978" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:30.512128" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:58:30.469060" elapsed="0.043092"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:30.512204" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:58:30.512349" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:30.459440" elapsed="0.052933"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:58:30.454985" elapsed="0.057450"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:30.450214" elapsed="0.062256"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:30.321959" elapsed="0.190545"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.523870" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:30.523564" elapsed="0.000333"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:30.523943" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:30.524094" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:30.523200" elapsed="0.000919"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.530937" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.530682" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.531383" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.531141" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:30.537789" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:30.537847" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:30 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782710,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:30.537940" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:30.533694" elapsed="0.004272"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.531496" elapsed="0.006563"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.538243" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.538088" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.531477" elapsed="0.006876"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.541846" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782710,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.539378" elapsed="0.002517"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.539154" elapsed="0.002775"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.539136" elapsed="0.002818"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.545527" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:30.542232" elapsed="0.003383"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.542010" elapsed="0.003654"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.541993" elapsed="0.003705"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.546483" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:30.545927" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.546980" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.546648" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.547769" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:30.547321" elapsed="0.000487"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.547096" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.546622" elapsed="0.001265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.548647" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:30.548117" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.549108" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:30.548781" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.549905" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:30.549446" elapsed="0.000496"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:30.549221" elapsed="0.000769"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.548756" elapsed="0.001264"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:30.550232" elapsed="0.000528"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:30.551385" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:30.550994" elapsed="0.000428"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:30.551688" elapsed="0.003323"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:30.538733" elapsed="0.016343"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:30.555253" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:58:30.555147" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:30.555128" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:30.555490" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:30.555578" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:58:30.557856" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782710,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:30.524462" elapsed="0.033422"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:30.557935" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:30.558086" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782710,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:30.522751" elapsed="0.035399"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.559165" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782710, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:30.558769" elapsed="0.000425"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:30.559242" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:30.559396" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782710, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:30.558396" elapsed="0.001026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:30.559797" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:30.559616" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.560306" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:30.559999" elapsed="0.000332"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.560780" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:30.560502" elapsed="0.000304"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:30.561344" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:30.560978" elapsed="0.000442">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:30.518302" elapsed="0.043255">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:31.577518" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:31.575282" elapsed="0.002353"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:31.577715" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:58:31.577910" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:31.574466" elapsed="0.003470"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:31.584623" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:31.584333" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:31.585090" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:31.584827" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:31.595112" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:31.595172" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:31 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:31 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782711,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:31.595264" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:31.587271" elapsed="0.008019"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:31.585208" elapsed="0.010124"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:31.595514" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:31.595360" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:31.585187" elapsed="0.010435"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:31.599142" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782711,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:31.596655" elapsed="0.002537"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:31.596411" elapsed="0.002816"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:31.596393" elapsed="0.002859"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:31.602310" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:31.599532" elapsed="0.002845"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:31.599309" elapsed="0.003116"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:31.599292" elapsed="0.003168"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:31.603414" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:31.602858" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:31.603912" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:31.603578" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:31.604701" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:31.604255" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:31.604027" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:31.603527" elapsed="0.001293"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:31.605614" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:31.605073" elapsed="0.000580"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:31.606080" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:31.605752" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:31.606867" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:31.606418" elapsed="0.000487"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:31.606193" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:31.605727" elapsed="0.001257"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:31.607199" elapsed="0.000505"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:31.608331" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:31.607937" elapsed="0.000430"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:31.608602" elapsed="0.003298"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:31.595988" elapsed="0.016002"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:31.612236" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:58:31.612087" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:31.612061" elapsed="0.000295"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:31.612590" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:31.612691" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:58:31.615305" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782711,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:31.578322" elapsed="0.037013"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:31.615387" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:31.615537" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782711,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:31.573406" elapsed="0.042177"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:31.616561" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782711, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:31.616146" elapsed="0.000445"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:31.616640" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:31.616795" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782711, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:31.615806" elapsed="0.001015"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:31.617202" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:31.617023" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:31.617718" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:31.617402" elapsed="0.000343"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:31.618229" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:31.617961" elapsed="0.000294"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:31.618800" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:31.618428" elapsed="0.000444">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:31.562429" elapsed="0.056554">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:32.628082" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:32.627517" elapsed="0.000609"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:32.628202" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:58:32.628408" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:32.627041" elapsed="0.001400"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:32.636368" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:32.636094" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:32.636898" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:32.636599" 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-04-10T00:58:32.645600" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:32.645679" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:32 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:32 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782712,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:32.645804" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:32.639739" elapsed="0.006099"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:32.637056" elapsed="0.008838"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:32.646115" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:32.645930" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:32.637025" elapsed="0.009181"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:32.649895" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782712,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:32.647298" elapsed="0.002650"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:32.647064" elapsed="0.002920"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:32.647045" elapsed="0.002964"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:32.653401" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:32.650308" elapsed="0.003160"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:32.650068" elapsed="0.003449"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:32.650051" elapsed="0.003522"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:32.654437" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:32.653848" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:32.654962" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:32.654606" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:32.655799" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:32.655310" elapsed="0.000530"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:32.655081" elapsed="0.000809"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:32.654578" elapsed="0.001342"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:32.656697" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:32.656147" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:32.657228" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:32.656872" elapsed="0.000530"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:32.658285" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:32.657753" elapsed="0.000577"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:32.657439" elapsed="0.000954"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:32.656843" elapsed="0.001587"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:32.658739" elapsed="0.000656"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:32.660317" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:32.659766" elapsed="0.000601"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:32.660695" elapsed="0.004214"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:32.646604" elapsed="0.018387"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:32.665211" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-10T00:58:32.665081" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:32.665057" 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-04-10T00:58:32.665509" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:32.665617" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:58:32.668580" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782712,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:32.628905" elapsed="0.039711"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:32.668688" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:58:32.668877" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782712,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:32.626321" elapsed="0.042591"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:32.670195" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782712, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:32.669718" elapsed="0.000509"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:32.670283" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:58:32.670461" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782712, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:32.669228" elapsed="0.001264"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:32.670942" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:32.670729" elapsed="0.000243"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:32.671537" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:32.671184" elapsed="0.000416"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:32.672128" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:32.671819" elapsed="0.000338"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:32.672792" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:32.672363" elapsed="0.000516">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:32.619749" elapsed="0.053263">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:33.685693" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:33.685295" elapsed="0.000431"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:33.685787" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:58:33.685962" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:33.684907" elapsed="0.001082"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:33.692756" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:33.692386" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:33.693220" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:33.692969" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:33.699987" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:33.700048" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:33 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:33 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782713,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:33.700155" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:33.695442" elapsed="0.004740"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:33.693341" elapsed="0.006886"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:33.700417" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:33.700256" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:33.693320" elapsed="0.007184"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:33.704196" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782713,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:33.701582" elapsed="0.002664"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:33.701338" elapsed="0.002944"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:33.701320" elapsed="0.002987"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:33.707220" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:33.704606" elapsed="0.002685"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:33.704364" elapsed="0.002979"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:33.704347" elapsed="0.003032"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:33.708229" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:33.707659" elapsed="0.000610"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:33.708753" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:33.708374" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:33.709593" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:33.709119" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:33.708874" elapsed="0.000814"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:33.708347" elapsed="0.001373"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:33.710521" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:33.709959" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:33.711038" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:33.710688" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:33.711877" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:33.711398" elapsed="0.000519"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:33.711159" elapsed="0.000810"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:33.710662" elapsed="0.001338"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:33.712227" elapsed="0.000534"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:33.713427" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:33.713010" elapsed="0.000456"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:33.713719" elapsed="0.003543"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:33.700906" elapsed="0.016450"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:33.717713" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-10T00:58:33.717526" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:33.717498" elapsed="0.000350"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:33.718075" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:33.718181" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:58:33.720676" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782713,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:33.686343" elapsed="0.034363"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:33.720759" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:33.720911" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782713,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:33.684271" elapsed="0.036667"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:33.721931" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782713, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:33.721512" elapsed="0.000448"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:33.722010" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:33.722165" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782713, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:33.721165" elapsed="0.001027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:33.722589" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:33.722373" elapsed="0.000243"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:33.723099" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:33.722794" elapsed="0.000330"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:33.723579" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:33.723299" elapsed="0.000307"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:33.724129" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:33.723783" elapsed="0.000419">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:33.673950" elapsed="0.050363">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.736048" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:34.735678" elapsed="0.000484"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:34.736226" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:58:34.736409" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:34.735292" elapsed="0.001145"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.743377" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.743101" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.743888" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.743628" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:34.751328" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:34.751388" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782714,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:34.751484" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:34.746156" elapsed="0.005355"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.744008" elapsed="0.007634"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.751839" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:34.751672" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.743988" elapsed="0.007938"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.755575" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782714,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.753006" elapsed="0.002622"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.752759" elapsed="0.002905"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.752740" elapsed="0.002950"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.760021" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.755978" elapsed="0.004121"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.755752" elapsed="0.004386"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.755735" elapsed="0.004428"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.760830" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.760353" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.761327" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:34.760976" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.762245" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:34.761757" elapsed="0.000530"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.761473" elapsed="0.000868"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.760949" elapsed="0.001423"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.763192" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.762634" elapsed="0.000611"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.763749" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:34.763367" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.764564" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:34.764105" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.763870" elapsed="0.000789"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.763339" elapsed="0.001351"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:34.764920" elapsed="0.000609"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:34.766075" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.765778" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:34.766259" elapsed="0.002360"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:34.752304" elapsed="0.016384"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:34.768875" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:58:34.768765" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.768746" elapsed="0.000221"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.769156" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:34.769235" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:58:34.771630" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782714,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:34.736825" elapsed="0.034837"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:34.771719" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:34.771879" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782714,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:34.734796" elapsed="0.037112"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.773088" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782714, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.772646" elapsed="0.000471"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:34.773168" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:34.773362" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782714, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:34.772233" elapsed="0.001165"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:34.773841" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:34.773609" elapsed="0.000271"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.774665" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:34.774149" elapsed="0.000557"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.775361" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:34.774968" elapsed="0.000431"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:58:34.775683" elapsed="0.000466"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:58:34.725207" elapsed="0.051034"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:58:30.517689" elapsed="4.258629"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:30.517253" elapsed="4.259156"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:30.512730" elapsed="4.263729"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.789924" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:34.789536" elapsed="0.000422"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:34.790016" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:58:34.790187" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:34.789086" elapsed="0.001126"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.797347" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.797046" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.797849" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.797583" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:34.812021" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:34.812175" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782714,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:34.812398" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:34.800106" elapsed="0.012354"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.797978" elapsed="0.014630"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.813056" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:34.812678" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.797956" elapsed="0.015308"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.822007" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782714,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.815773" elapsed="0.006310"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.815222" elapsed="0.006913"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.815178" elapsed="0.006994"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.826305" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.822706" elapsed="0.003668"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.822341" elapsed="0.004084"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.822315" elapsed="0.004146"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.827333" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.826757" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.827859" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:34.827479" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.828704" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:34.828229" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.827983" elapsed="0.000814"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.827452" elapsed="0.001377"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.829683" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.829071" elapsed="0.000653"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.830176" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:34.829828" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.830999" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:34.830536" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.830295" elapsed="0.000796"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.829802" elapsed="0.001320"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:34.831349" elapsed="0.000540"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:34.832578" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.832138" elapsed="0.000481"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:34.832854" elapsed="0.002716"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:34.814200" elapsed="0.021440"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:34.835825" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:58:34.835713" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.835695" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.836070" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:34.836143" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:58:34.838465" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782714,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:34.790586" elapsed="0.047909"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:34.838565" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:34.838721" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782714,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:34.788513" elapsed="0.050235"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.839751" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782714, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.839336" elapsed="0.000444"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:34.839828" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:34.839984" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782714, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:34.838981" elapsed="0.001030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:34.840377" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:34.840194" elapsed="0.000265"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.841147" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:34.840661" elapsed="0.000513"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.841675" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:34.841390" elapsed="0.000311"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:58:34.841876" elapsed="0.000314"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:58:34.783891" elapsed="0.058362"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:58:34.783273" elapsed="0.059032"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:34.782848" elapsed="0.059519"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:34.776618" elapsed="0.065784"/>
</iter>
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.858383" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:34.857869" elapsed="0.000562"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:34.858514" elapsed="0.000079"/>
</return>
<msg time="2026-04-10T00:58:34.858774" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:34.856921" elapsed="0.001887"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.868170" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.867808" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.868826" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.868461" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:34.878009" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:34.878089" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782714,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:34.878217" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:34.872053" elapsed="0.006201"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.868997" elapsed="0.009316"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.878586" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:34.878350" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.868968" elapsed="0.009740"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.883823" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782714,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.880141" elapsed="0.003750"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.879830" elapsed="0.004110"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.879805" elapsed="0.004169"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.887755" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.884362" elapsed="0.003458"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.884052" elapsed="0.003817"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.884028" elapsed="0.003874"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.888723" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.888152" elapsed="0.000610"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.889193" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:34.888859" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.889941" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:34.889602" elapsed="0.000441"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.889352" elapsed="0.000730"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.888834" elapsed="0.001270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.890652" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.890267" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.890985" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:34.890750" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.891526" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:34.891230" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.891067" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.890732" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:34.891783" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:34.892625" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.892304" elapsed="0.000347"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:34.892808" elapsed="0.002446"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:34.879219" elapsed="0.016100"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:34.895498" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:58:34.895390" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.895371" 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-04-10T00:58:34.895755" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:34.895827" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:58:34.898171" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782714,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:34.859305" elapsed="0.038894"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:34.898252" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:34.898402" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782714,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:34.855575" elapsed="0.042853"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.899401" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782714, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.899009" elapsed="0.000420"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:34.899478" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:34.899650" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782714, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:34.898667" elapsed="0.001010"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:34.900037" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:34.899856" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.900560" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:34.900238" elapsed="0.000350"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.901028" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:34.900764" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:58:34.901258" elapsed="0.000330"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:58:34.848318" elapsed="0.053334"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:58:34.847740" elapsed="0.053963"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:34.847307" elapsed="0.054498"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:34.842497" elapsed="0.059345"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:30.512579" elapsed="4.389301"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.912890" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:34.912583" elapsed="0.000334"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:34.912964" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:34.913112" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:34.912221" elapsed="0.000915"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.919745" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.919479" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.920187" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.919946" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:34.926865" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:34.926920" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782714,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:34.927010" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:34.922363" elapsed="0.004673"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.920297" elapsed="0.006782"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.927257" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:34.927106" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.920279" elapsed="0.007062"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.930792" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782714,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.928359" elapsed="0.002481"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.928138" elapsed="0.002737"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.928120" elapsed="0.002780"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.933533" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.931175" elapsed="0.002420"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.930955" elapsed="0.002674"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.930939" elapsed="0.002714"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.934379" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.933869" elapsed="0.000547"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.934869" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:34.934514" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.935643" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:34.935206" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.934983" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.934489" elapsed="0.001269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.936474" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.935979" elapsed="0.000532"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.936953" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:34.936629" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.937748" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:34.937317" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.937066" elapsed="0.000821"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.936603" elapsed="0.001314"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:34.938130" elapsed="0.000505"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:34.939252" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.938874" elapsed="0.000414"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:34.939505" elapsed="0.003555"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:34.927719" elapsed="0.015431"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:34.943397" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:58:34.943250" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.943223" elapsed="0.000293"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.943747" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:34.943847" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:58:34.946700" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782714,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:34.913500" elapsed="0.033230"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:34.946782" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:34.946935" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782714,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:34.911767" elapsed="0.035193"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:58:34.947009" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:34.947155" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782714,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 1. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:58:34.907168" elapsed="0.040013"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.948181" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782714, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.947782" elapsed="0.000429"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:34.948259" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:34.948413" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782714, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:34.947403" elapsed="0.001036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:34.948814" level="INFO">${value} = 0</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:34.948632" elapsed="0.000207"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.949325" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:58:34.949018" elapsed="0.000364"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 0.</doc>
<status status="PASS" start="2026-04-10T00:58:34.906726" elapsed="0.042714"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:34.902087" elapsed="0.047387"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.960269" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:34.959968" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:34.960341" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:34.960488" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:34.959613" elapsed="0.000899"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.967339" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.967088" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.967865" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.967618" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:34.975196" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:34.975323" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782714,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:34.975533" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:34.970060" elapsed="0.005563"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.967981" elapsed="0.007742"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.976157" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:34.975786" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.967962" elapsed="0.008394"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.983306" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782714,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.978700" elapsed="0.004677"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.978175" elapsed="0.005254"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.978135" elapsed="0.005330"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.987452" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:34.983908" elapsed="0.003612"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.983572" elapsed="0.004018"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.983524" elapsed="0.004103"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.988442" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.987874" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.988962" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:34.988609" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.989819" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:34.989349" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.989081" elapsed="0.000830"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.988581" elapsed="0.001361"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.990729" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.990179" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.991215" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:34.990871" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:34.992027" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:34.991592" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:34.991333" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.990846" elapsed="0.001301"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:34.992373" elapsed="0.000530"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:34.993626" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:34.993194" elapsed="0.000471"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:34.993833" elapsed="0.002358"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:34.977203" elapsed="0.019050"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:34.996480" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:58:34.996371" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:34.996351" elapsed="0.000235"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:34.996736" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:34.996808" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:58:34.999290" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782714,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:34.960867" elapsed="0.038452"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:34.999370" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:34.999521" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782714,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:34.959147" elapsed="0.040414"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:58:34.999608" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:34.999756" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782714,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:58:34.954722" elapsed="0.045060"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.000741" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782714, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:35.000334" elapsed="0.000435"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:35.000817" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:35.000969" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782714, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:34.999996" elapsed="0.000999"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:35.001368" level="INFO">${value} = 0</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.001187" elapsed="0.000206"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.002023" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:58:35.001739" elapsed="0.000338"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 0.</doc>
<status status="PASS" start="2026-04-10T00:58:34.954269" elapsed="0.047865"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:34.949583" elapsed="0.052585"/>
</iter>
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.012950" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:35.012650" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:35.013023" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:35.013198" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:35.012291" elapsed="0.000932"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.019756" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:35.019492" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.020203" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:35.019961" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:35.026562" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:35.026619" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:35 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:35 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782715,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:35.026710" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:35.022363" elapsed="0.004374"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:35.020314" elapsed="0.006500"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:35.026997" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:35.026842" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:35.020296" elapsed="0.006787"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.030597" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782715,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:35.028093" elapsed="0.002552"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:35.027871" elapsed="0.002809"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:35.027853" elapsed="0.002852"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.033322" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:35.030984" elapsed="0.002384"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:35.030763" elapsed="0.002639"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:35.030746" elapsed="0.002680"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.034105" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:35.033604" elapsed="0.000541"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:35.034617" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:35.034249" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.035414" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:35.034974" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:35.034737" elapsed="0.000767"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:35.034222" elapsed="0.001313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.036342" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:35.035795" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:35.036901" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:35.036485" elapsed="0.000506"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.037790" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:35.037282" elapsed="0.000554"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:35.037026" elapsed="0.000864"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:35.036459" elapsed="0.001462"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.038148" elapsed="0.000534"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:35.039374" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:35.038928" elapsed="0.000487"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.039678" elapsed="0.003528"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:35.027432" elapsed="0.015866"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:35.043575" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:58:35.043401" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:35.043375" elapsed="0.000326"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:35.043919" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:35.044023" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:58:35.046864" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782715,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:35.013563" elapsed="0.033330"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:35.046944" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:35.047092" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782715,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:35.011844" elapsed="0.035274"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:58:35.047201" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:35.047346" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782715,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 3. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:58:35.007468" elapsed="0.039904"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.048325" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782715, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:35.047942" elapsed="0.000411"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:35.048401" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:35.048567" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782715, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:35.047603" elapsed="0.000993"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:35.048951" level="INFO">${value} = 0</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.048774" elapsed="0.000202"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.049443" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:58:35.049166" elapsed="0.000330"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 0.</doc>
<status status="PASS" start="2026-04-10T00:58:35.007030" elapsed="0.042542"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:35.002257" elapsed="0.047351"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:34.901943" elapsed="0.147696"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_del}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:58:30.317825" elapsed="4.731872"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:29.896383" elapsed="5.153438"/>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-10T00:58:35.050737" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-10T00:58:35.050656" elapsed="0.000182"/>
</kw>
<doc>Test suite for Cluster HA with Bulk Flows - Data consistency after cluster restart, leader restart and follower restart with one switch connected</doc>
<status status="PASS" start="2026-04-10T00:54:14.655503" elapsed="260.395370"/>
</suite>
<suite id="s1-s4" name="Cluster Current Term Verification 3Node Cluster" source="/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/suites/openflowplugin/Clustering_Bulkomatic/040__Cluster_Current_Term_Verification_3Node_Cluster.robot">
<kw name="Setup_Utils_For_Setup_And_Teardown" owner="SetupUtils" type="SETUP">
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.136734" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:35.132293" elapsed="0.004495"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-10T00:58:35.132051" elapsed="0.004808"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.141816" level="INFO">${already_done} = False</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-10T00:58:35.138000" elapsed="0.003844"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-10T00:58:35.142053" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:35.141930" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:35.141907" elapsed="0.000215"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.142632" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:35.142278" elapsed="0.000398"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.143150" level="INFO">${cluster_size} = 3</msg>
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-10T00:58:35.142839" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-10T00:58:35.143705" elapsed="0.000282"/>
</kw>
<msg time="2026-04-10T00:58:35.144084" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:35.144131" level="INFO">${possibly_int_of_members} = 3</msg>
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:35.143344" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.144709" level="INFO">${int_of_members} = 3</msg>
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:35.144326" elapsed="0.000410"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.145753" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:35.145471" elapsed="0.000309"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.146186" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:35.145931" elapsed="0.000281"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.146787" level="INFO">&amp;{index_to_ip_mapping} = { }</msg>
<var>&amp;{index_to_ip_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.146469" elapsed="0.000345"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.149961" elapsed="0.000210"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.150674" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:35.150333" elapsed="0.000367"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.150858" elapsed="0.000227"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.151889" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:35.151592" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:35.151961" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:58:35.152120" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:35.151279" elapsed="0.000866"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:35.152754" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.165:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x72c8f106e350&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-10T00:58:35.152306" elapsed="0.000580"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.153063" elapsed="0.000190"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-10T00:58:35.149365" elapsed="0.003947"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:35.149176" elapsed="0.004180"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.155512" elapsed="0.000209"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.156211" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:35.155881" elapsed="0.000356"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.156393" elapsed="0.000357"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.157599" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:35.157274" elapsed="0.000353"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:35.157673" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:35.157825" level="INFO">${session_alias} = ClusterManagement__session_2</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:35.156947" elapsed="0.000904"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:35.158419" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.169:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x72c8f1252990&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-10T00:58:35.158008" elapsed="0.000516"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.158706" elapsed="0.000198"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-10T00:58:35.154947" elapsed="0.004016"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:35.153443" elapsed="0.005564"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.159850" elapsed="0.000190"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.160530" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:35.160201" elapsed="0.000373"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.160731" elapsed="0.000246"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.161789" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:35.161469" elapsed="0.000401"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:35.161918" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:35.162075" level="INFO">${session_alias} = ClusterManagement__session_3</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:35.161171" elapsed="0.000930"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:35.162681" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.171.151:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x72c8f1253bd0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-10T00:58:35.162258" elapsed="0.000527"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.162953" elapsed="0.000190"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-10T00:58:35.159275" elapsed="0.003928"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:35.159093" elapsed="0.004155"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-10T00:58:35.146871" elapsed="0.016406"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.163850" level="INFO">${ClusterManagement__member_index_list} = [1, 2, 3]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:35.163444" elapsed="0.000449"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.164441" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.165', 2: '10.30.170.169', 3: '10.30.171.151'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:35.164058" elapsed="0.000426"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.165060" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1', 'ClusterManagement__session_2', 'ClusterManagement__session_3']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:35.164665" elapsed="0.000439"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-10T00:58:35.145020" elapsed="0.020142"/>
</kw>
<arg>http_timeout=${http_timeout}</arg>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-10T00:58:35.137656" elapsed="0.027563"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:35.165405" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:35.165288" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:35.165269" elapsed="0.000205"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.168870" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:35.168460" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.169409" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:35.169098" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:35.169480" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:35.169652" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:35.168131" elapsed="0.001546"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:35.170677" level="INFO">${member_ip} = 10.30.170.165</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.170397" elapsed="0.000307"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:35.171439" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:35.171279" elapsed="0.000304"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:35.174256" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:35.173937" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:35.173918" elapsed="0.000596"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:35.174822" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:35.174690" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.176056" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.165" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:35.175131" elapsed="0.000973"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:35.176922" level="INFO">${conn_id} = 462</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.176268" elapsed="0.000705"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.178273" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:58:35.178477" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:35.177733" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.178832" elapsed="0.000600"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:58:35.181098" level="INFO">Logging into '10.30.170.165:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:58:35.521306" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:58:13 UTC 2026

  System load:  0.41               Processes:             125
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.165
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:58:13 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:58:35.180508" elapsed="0.341030"/>
</kw>
<msg time="2026-04-10T00:58:35.521679" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.179774" elapsed="0.342101"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:58:35.177195" elapsed="0.345133"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:58:35.522963" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-10T00:58:35.535995" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-10T00:58:35.536259" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:58:35.536328" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:58:35.522600" elapsed="0.013767"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:35.536704" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.538199" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:35.537352" elapsed="0.000921"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:35.538674" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:35.538394" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:35.538362" elapsed="0.000426"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:58:35.539064" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-10T00:58:35.538869" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:35.538846" elapsed="0.000348"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:35.539246" elapsed="0.000021"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.543656" elapsed="0.001368"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.545381" elapsed="0.000713"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:35.546383" elapsed="0.000329"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:35.539744" elapsed="0.007095"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:58:35.173429" elapsed="0.373639"/>
</kw>
<msg time="2026-04-10T00:58:35.547151" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.172749" elapsed="0.374481"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:58:35.172252" elapsed="0.375096"/>
</kw>
<msg time="2026-04-10T00:58:35.547410" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.171746" elapsed="0.375731"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.551639" elapsed="0.000455"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.552338" elapsed="0.000233"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:35.552841" elapsed="0.000143"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:35.547935" elapsed="0.005124"/>
</kw>
<msg time="2026-04-10T00:58:35.553193" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:58:35.170922" elapsed="0.382309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.553944" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:35.553502" elapsed="0.000485"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:58:35.554030" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:58:35.170040" elapsed="0.384117"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:35.169862" elapsed="0.384333"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:35.555125" level="INFO">${member_ip} = 10.30.170.169</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.554856" elapsed="0.000296"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:35.555878" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:35.555746" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:35.558940" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:35.558629" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:35.558609" elapsed="0.000541"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:35.559432" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:35.559304" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.560938" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.169" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:35.559759" elapsed="0.001228"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:35.561902" level="INFO">${conn_id} = 465</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.561147" elapsed="0.000783"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.563591" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:58:35.563880" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:35.562786" elapsed="0.001227"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.564346" elapsed="0.000773"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:58:35.566730" level="INFO">Logging into '10.30.170.169:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:58:35.888036" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:58:14 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:58:14 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:58:35.566301" elapsed="0.322189"/>
</kw>
<msg time="2026-04-10T00:58:35.888789" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.565478" elapsed="0.323663"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:58:35.562154" elapsed="0.327526"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:58:35.890816" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-10T00:58:35.910006" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-10T00:58:35.910488" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:58:35.910642" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:58:35.890165" elapsed="0.020541"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:35.911205" elapsed="0.000658"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.913513" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:35.912347" elapsed="0.001311"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:35.914284" elapsed="0.000064"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:35.913859" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:35.913800" elapsed="0.000736"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-10T00:58:35.915183" elapsed="0.000098"/>
</return>
<status status="PASS" start="2026-04-10T00:58:35.914765" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:35.914710" elapsed="0.000722"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:35.915601" elapsed="0.000058"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.922381" 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-04-10T00:58:35.923816" elapsed="0.000537"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:35.924605" 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-04-10T00:58:35.916625" elapsed="0.008333"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:58:35.558115" elapsed="0.366957"/>
</kw>
<msg time="2026-04-10T00:58:35.925142" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.557432" elapsed="0.367781"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:58:35.556707" elapsed="0.368601"/>
</kw>
<msg time="2026-04-10T00:58:35.925360" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.556162" elapsed="0.369250"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.928898" elapsed="0.000402"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.929689" elapsed="0.000209"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:35.930101" elapsed="0.000133"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:35.925780" elapsed="0.004518"/>
</kw>
<msg time="2026-04-10T00:58:35.930415" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:58:35.555369" elapsed="0.375077"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.931051" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:35.930730" elapsed="0.000377"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:58:35.931154" elapsed="0.000032"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:58:35.554476" elapsed="0.376842"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:35.554293" elapsed="0.377076"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:35.932751" level="INFO">${member_ip} = 10.30.171.151</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.932369" elapsed="0.000418"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:35.933824" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:35.933600" elapsed="0.000381"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:35.937302" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:35.936981" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:35.936961" elapsed="0.000541"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:35.937820" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:35.937680" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.939495" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.171.151" by user "jenkins" with keyfile pass "any" and prompt "&gt;" and password ""</msg>
<arg>Attempting to execute command "${cmd}" on remote system "${system}" by user "${user}" with keyfile pass "${keyfile_pass}" and prompt "${prompt}" and password "${password}"</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:35.938213" elapsed="0.001359"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:35.940617" level="INFO">${conn_id} = 468</msg>
<var>${conn_id}</var>
<arg>${system}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${prompt_timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:35.939777" elapsed="0.000875"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:35.942277" level="INFO">Length is 0.</msg>
<msg time="2026-04-10T00:58:35.942525" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:35.941575" elapsed="0.001033"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.942975" elapsed="0.001083"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-10T00:58:35.946295" level="INFO">Logging into '10.30.171.151:22' as 'jenkins'.</msg>
<msg time="2026-04-10T00:58:36.287448" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Fri Apr 10 00:58:14 UTC 2026

  System load:  1.27               Processes:             125
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 8%                 IPv4 address for ens3: 10.30.171.151
  Swap usage:   0%

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Fri Apr 10 00:58:14 2026 from 10.30.170.103
[?2004h[jenkins@releng-30360-173-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-10T00:58:35.945777" elapsed="0.342022"/>
</kw>
<msg time="2026-04-10T00:58:36.288172" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.944538" elapsed="0.343906"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-10T00:58:35.940921" elapsed="0.347935"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-10T00:58:36.289686" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-10T00:58:36.302355" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-10T00:58:36.302820" level="INFO">${stdout} = </msg>
<msg time="2026-04-10T00:58:36.302894" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-10T00:58:36.289198" elapsed="0.013737"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:36.303287" elapsed="0.000497"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:36.304949" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:36.304109" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:36.305413" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:36.305161" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:36.305117" 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-04-10T00:58:36.305804" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:58:36.305617" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:36.305594" elapsed="0.000343"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-10T00:58:36.305988" elapsed="0.000021"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:36.310233" elapsed="0.001111"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:36.311721" elapsed="0.000665"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:36.312665" elapsed="0.000279"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:36.306472" elapsed="0.006587"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-10T00:58:35.936404" elapsed="0.376789"/>
</kw>
<msg time="2026-04-10T00:58:36.313271" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.935468" elapsed="0.377882"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-10T00:58:35.934842" elapsed="0.378625"/>
</kw>
<msg time="2026-04-10T00:58:36.313522" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:35.934183" elapsed="0.379423"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:36.317404" elapsed="0.000459"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:36.318095" elapsed="0.000206"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:36.318497" elapsed="0.000148"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:36.314034" elapsed="0.004678"/>
</kw>
<msg time="2026-04-10T00:58:36.318842" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-10T00:58:35.933089" elapsed="0.385792"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:36.319541" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:36.319176" elapsed="0.000610"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-10T00:58:36.319848" elapsed="0.000074"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-10T00:58:35.931836" elapsed="0.388232"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:35.931483" elapsed="0.388730"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:35.169733" elapsed="1.150539"/>
</for>
<arg>iptables -I INPUT -p tcp --dport ${KARAF_SHELL_PORT} -j ACCEPT; iptables-save</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-10T00:58:35.165715" elapsed="1.154650"/>
</kw>
<kw name="Comment" owner="BuiltIn">
<arg>First connections to Karaf console may fail, so WUKS is used. TODO: Track as a Bug.</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-10T00:58:36.320615" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:36.340652" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:36.340435" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:36.340398" elapsed="0.000377"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:36.341319" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:36.341068" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:36.342181" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:36.341763" elapsed="0.000476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:36.342793" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:36.342442" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:36.343987" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-10T00:58:36.343639" elapsed="0.000507">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-10T00:58:36.344306" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:58:36.344371" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:36.343078" elapsed="0.001328"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:36.344861" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:36.344513" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:36.344487" elapsed="0.000513"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:36.346085" level="INFO">${ip_address} = 10.30.170.165</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:36.345718" elapsed="0.000404"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:58:36.346189" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:58:36.346416" level="INFO">${odl_ip} = 10.30.170.165</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:36.345301" elapsed="0.001151"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:36.346696" elapsed="0.000562"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:36.347707" level="INFO">index=471
host=10.30.170.165
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:58:36.351726" elapsed="0.282194"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:36.637795" elapsed="0.000319"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:36.638282" elapsed="0.000167"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:36.638615" elapsed="0.000101"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:36.635181" elapsed="0.003590"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:36.634451" elapsed="0.004367"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:58:36.339770" elapsed="0.299102"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:58:36.321974" elapsed="0.316947"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:36.321433" elapsed="0.317542"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:36.321226" elapsed="0.317790"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:36.652589" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:36.652458" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:36.652435" elapsed="0.000229"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:36.652958" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:36.652822" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:36.653512" level="INFO">{1: 471}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:36.653248" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:36.653977" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:36.653730" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:36.654792" level="FAIL">Dictionary does not contain key '2'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-10T00:58:36.654562" elapsed="0.000335">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-04-10T00:58:36.655004" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:58:36.655050" level="INFO">${old_connection_index} = Dictionary does not contain key '2'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:36.654183" elapsed="0.000891"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:36.655373" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:36.655149" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:36.655131" elapsed="0.000339"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:36.656253" level="INFO">${ip_address} = 10.30.170.169</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:36.655987" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:58:36.656328" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:36.656483" level="INFO">${odl_ip} = 10.30.170.169</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:36.655705" elapsed="0.000803"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:36.656680" elapsed="0.000403"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:36.657398" level="INFO">index=473
host=10.30.170.169
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:58:36.660286" elapsed="0.242974"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:36.907211" 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-04-10T00:58:36.907760" elapsed="0.000170"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:36.908083" elapsed="0.000102"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:36.904638" elapsed="0.003602"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:36.903881" elapsed="0.004407"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:58:36.652168" elapsed="0.256172"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:58:36.639694" elapsed="0.268695"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:36.639266" elapsed="0.269177"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:36.639121" elapsed="0.269364"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:36.922061" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:36.921944" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:36.921921" elapsed="0.000251"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:36.922492" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

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

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-10T00:58:36.922342" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:36.923085" level="INFO">{1: 471, 2: 473}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:36.922817" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:36.923614" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:36.923313" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:36.924420" level="FAIL">Dictionary does not contain key '3'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-10T00:58:36.924189" elapsed="0.000341">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-04-10T00:58:36.924658" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-10T00:58:36.924704" level="INFO">${old_connection_index} = Dictionary does not contain key '3'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:36.923823" elapsed="0.000904"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:36.925030" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:36.924804" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:36.924785" elapsed="0.000344"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:36.926184" level="INFO">${ip_address} = 10.30.171.151</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:36.925844" elapsed="0.000367"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-10T00:58:36.926261" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:58:36.926422" level="INFO">${odl_ip} = 10.30.171.151</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:36.925333" elapsed="0.001114"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:36.926622" elapsed="0.000409"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:36.927353" level="INFO">index=475
host=10.30.171.151
alias=None
port=8101
timeout=10 seconds
newline=

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

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

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-10T00:58:36.930238" elapsed="0.244592"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:37.178330" 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-04-10T00:58:37.178859" elapsed="0.000171"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:37.179230" elapsed="0.000105"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:37.175999" elapsed="0.003392"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:37.175288" elapsed="0.004151"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-10T00:58:36.921647" elapsed="0.257848"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:58:36.909139" elapsed="0.270423"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:36.908758" elapsed="0.270862"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:36.908610" elapsed="0.271052"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-10T00:58:36.321010" elapsed="0.858691"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-10T00:58:35.137196" elapsed="2.042568"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Test_Suite_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.182701" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.182577" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.182539" elapsed="0.000239"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.187662" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.187540" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.187522" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:37.188702" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:37.188295" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:37.189284" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:37.188972" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:37.189357" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:58:37.189523" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:37.187962" elapsed="0.001601"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.194918" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.194809" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.194789" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.196055" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.195948" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.195931" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:37.196589" level="INFO">${karaf_connection_index} = 471</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:37.196271" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.196984" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:37.196781" elapsed="0.000229"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.238649" 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 "p "e "[78Cn "[A[78Cf</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:37.197511" elapsed="0.041293"/>
</kw>
<msg time="2026-04-10T00:58:37.238936" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:37.238985" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.197171" elapsed="0.041851"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.323089" level="INFO">"l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "4 "0 "_ "_ "C "l "u "s "t "e "r "_ "C "u "r "r "e "n "t "_ "T "e "r "m "_ "V "e "r "i "f "i "c "a "t "i "o "n "_ "3 "N "o "d "e "_ "C "l "[78Cu "[A[78Cs
 "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:37.239616" elapsed="0.083858"/>
</kw>
<msg time="2026-04-10T00:58:37.323697" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:37.323748" level="INFO">${message_wait} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.239226" elapsed="0.084561"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.324355" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.323966" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.323885" elapsed="0.000567"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:37.325048" level="INFO"> "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "4 "0 "_ "_ "C "l "u "s "t "e "r "_ "C "u "r "r "e "n "t "_ "T "e "r "m "_ "V "e "r "i "f "i "c "a "t "i "o "n "_ "3 "N "o "d "e "_ "C "l "[78Cu "[A[78Cs
 "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:37.324625" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.325457" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.325234" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.325216" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:37.325594" elapsed="0.000049"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:37.327123" elapsed="0.000884"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:37.328316" elapsed="0.000517"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:37.329201" 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-04-10T00:58:37.326603" elapsed="0.002954"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:37.325966" elapsed="0.003645"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:37.195695" elapsed="0.134017"/>
</kw>
<msg time="2026-04-10T00:58:37.329810" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:37.329854" level="INFO">${message} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.195156" elapsed="0.134736"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:37.330078" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:58:37.329972" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.329953" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.330610" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.330964" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.331052" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:37.194497" elapsed="0.136665"/>
</kw>
<msg time="2026-04-10T00:58:37.331296" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:37.331341" level="INFO">${output} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.189939" elapsed="0.141440"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.331727" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.331457" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.331439" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:37.189793" elapsed="0.142036"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.337403" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.337294" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.337275" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.338519" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.338412" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.338395" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:37.339065" level="INFO">${karaf_connection_index} = 473</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:37.338752" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.339460" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:37.339253" elapsed="0.000233"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.376433" 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 "p "e "[78Cn "[A[78Cf</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:37.340009" elapsed="0.036741"/>
</kw>
<msg time="2026-04-10T00:58:37.376936" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:37.376984" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.339669" elapsed="0.037353"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.437206" level="INFO">"l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "4 "0 "_ "_ "C "l "u "s "t "e "r "_ "C "u "r "r "e "n "t "_ "T "e "r "m "_ "V "e "r "i "f "i "c "a "t "i "o "n "_ "3 "N "o "d "e "_ "C "l "[78Cu "[A[78Cs
 "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:37.377808" elapsed="0.060095"/>
</kw>
<msg time="2026-04-10T00:58:37.438135" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:37.438205" level="INFO">${message_wait} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.377296" elapsed="0.060966"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.438972" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.438447" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.438394" elapsed="0.000712"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:37.439878" level="INFO"> "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "4 "0 "_ "_ "C "l "u "s "t "e "r "_ "C "u "r "r "e "n "t "_ "T "e "r "m "_ "V "e "r "i "f "i "c "a "t "i "o "n "_ "3 "N "o "d "e "_ "C "l "[78Cu "[A[78Cs
 "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:37.439324" elapsed="0.000664"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.440276" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.440056" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.440037" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:37.440395" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:37.441856" elapsed="0.000572"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:37.442764" elapsed="0.000502"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:37.443533" elapsed="0.000218"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:37.441373" elapsed="0.002517"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:37.440766" elapsed="0.003175"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:37.338162" elapsed="0.105890"/>
</kw>
<msg time="2026-04-10T00:58:37.444162" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:37.444211" level="INFO">${message} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.337643" elapsed="0.106607"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:37.444451" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:58:37.444336" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.444316" 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 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.444984" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.447609" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.447689" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:37.336981" elapsed="0.110826"/>
</kw>
<msg time="2026-04-10T00:58:37.447901" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:37.447945" level="INFO">${output} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.332113" elapsed="0.115867"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.448313" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.448056" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.448038" elapsed="0.000353"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:37.331968" elapsed="0.116446"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.454025" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.453915" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.453897" elapsed="0.000252"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.455215" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.455109" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.455092" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:37.455733" level="INFO">${karaf_connection_index} = 475</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:37.455430" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.456127" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:37.455922" elapsed="0.000231"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.498704" 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 "p "e "[78Cn "[A[78Cf</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:37.456672" elapsed="0.042341"/>
</kw>
<msg time="2026-04-10T00:58:37.499203" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:37.499252" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.456313" elapsed="0.042977"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.581432" level="INFO">"l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "4 "0 "_ "_ "C "l "u "s "t "e "r "_ "C "u "r "r "e "n "t "_ "T "e "r "m "_ "V "e "r "i "f "i "c "a "t "i "o "n "_ "3 "N "o "d "e "_ "C "l "[78Cu "[A[78Cs
 "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:37.500095" elapsed="0.081723"/>
</kw>
<msg time="2026-04-10T00:58:37.582019" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:37.582067" level="INFO">${message_wait} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.499598" elapsed="0.082507"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.582657" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.582246" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.582200" elapsed="0.000552"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:37.583340" level="INFO"> "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "p "e "n "[78Cf "[A[78Cl
 "o "w "p "l "u "g "i "n "/ "C "l "u "s "t "e "r "i "n "g "_ "B "u "l "k "o "m "a "t "i "c "/ "0 "4 "0 "_ "_ "C "l "u "s "t "e "r "_ "C "u "r "r "e "n "t "_ "T "e "r "m "_ "V "e "r "i "f "i "c "a "t "i "o "n "_ "3 "N "o "d "e "_ "C "l "[78Cu "[A[78Cs
 "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:37.582944" elapsed="0.000509"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.583762" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.583522" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.583503" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:37.583879" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:37.585291" elapsed="0.000592"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:37.586188" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:37.586973" elapsed="0.000199"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:37.584828" elapsed="0.002475"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:37.584221" elapsed="0.003131"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:37.454838" elapsed="0.132615"/>
</kw>
<msg time="2026-04-10T00:58:37.587573" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:37.587620" level="INFO">${message} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.454307" elapsed="0.133351"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:37.587924" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:58:37.587806" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.587788" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.588445" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.588810" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.588882" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:37.453603" elapsed="0.135392"/>
</kw>
<msg time="2026-04-10T00:58:37.589095" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:37.589139" level="INFO">${output} =  "l "o "w "p "l "u "g "i "n "- "c "s "i "t "- "3 "n "o "d "e "- "c "l "u "s "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.448719" elapsed="0.140458"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.589511" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.589255" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.589237" elapsed="0.000367"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:37.448571" elapsed="0.141057"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:37.189619" elapsed="0.400048"/>
</for>
<arg>Starting suite ${SUITE_SOURCE}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:58:37.187247" elapsed="0.402484"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-10T00:58:37.180381" elapsed="0.409410"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.179934" elapsed="0.409902"/>
</kw>
<doc>Prepare both FailFast and Karaf logging, log that the caller suite has started.
This keyword is to be used in suite setup, and without it the other keywords may not work properly.</doc>
<status status="PASS" start="2026-04-10T00:58:35.131675" elapsed="2.458218"/>
</kw>
<test id="s1-s4-t1" name="Check Shard And Get Inventory" line="36">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:58:37.593678" elapsed="0.000234"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:58:37.593390" elapsed="0.000577"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.595108" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.594996" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.594978" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.600212" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.600106" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.600088" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:37.601292" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:37.600906" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:37.601807" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:37.601483" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:37.601877" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:37.602033" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:37.600511" elapsed="0.001546"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.607528" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.607421" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.607403" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.608818" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.608711" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.608693" elapsed="0.000247"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:37.609396" level="INFO">${karaf_connection_index} = 471</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:37.609094" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.609835" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:37.609604" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.645098" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:37.610366" elapsed="0.034985"/>
</kw>
<msg time="2026-04-10T00:58:37.645636" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:37.645686" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.610026" elapsed="0.035698"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.712843" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "[C "A "n "d "[C "G "e "t "[C "I "n "v "e "n "t "o "r "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:37.646480" elapsed="0.066666"/>
</kw>
<msg time="2026-04-10T00:58:37.713399" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:37.713449" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.646001" elapsed="0.067487"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.714037" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.713661" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.713613" elapsed="0.000516"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:37.714709" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "[C "A "n "d "[C "G "e "t "[C "I "n "v "e "n "t "o "r "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:37.714282" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.715129" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.714904" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.714886" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:37.715245" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:37.716882" elapsed="0.000775"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:37.717939" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:37.718701" 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-04-10T00:58:37.716182" elapsed="0.003013"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:37.715600" elapsed="0.003660"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:37.608385" elapsed="0.110977"/>
</kw>
<msg time="2026-04-10T00:58:37.719462" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:37.719507" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.607767" elapsed="0.111793"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:37.719753" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:37.719644" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.719625" 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-04-10T00:58:37.720255" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.720694" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.720768" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:37.607088" elapsed="0.113795"/>
</kw>
<msg time="2026-04-10T00:58:37.720984" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:37.721030" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.602439" elapsed="0.118629"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.721404" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.721147" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.721130" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:37.602294" elapsed="0.119212"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.727216" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.727109" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.727091" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.728431" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.728325" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.728308" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:37.728990" level="INFO">${karaf_connection_index} = 473</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:37.728681" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.729399" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:37.729177" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.785042" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:37.729940" elapsed="0.055344"/>
</kw>
<msg time="2026-04-10T00:58:37.785531" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:37.785607" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.729603" elapsed="0.056043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.840672" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "[C "A "n "d "[C "G "e "t "[C "I "n "v "e "n "t "o "r "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:37.786378" elapsed="0.054570"/>
</kw>
<msg time="2026-04-10T00:58:37.841199" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:37.841248" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.785914" elapsed="0.055371"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.841822" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.841424" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.841379" elapsed="0.000539"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:37.842481" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "[C "A "n "d "[C "G "e "t "[C "I "n "v "e "n "t "o "r "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:37.842072" elapsed="0.000519"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.842925" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.842661" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.842643" elapsed="0.000363"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:37.843045" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:37.845052" elapsed="0.000849"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:37.846188" elapsed="0.000500"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:37.846991" elapsed="0.000365"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:37.844387" elapsed="0.003073"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:37.843465" elapsed="0.004060"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:37.728024" elapsed="0.119619"/>
</kw>
<msg time="2026-04-10T00:58:37.847739" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:37.847783" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.727440" elapsed="0.120381"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:37.848006" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:37.847898" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.847880" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.848497" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.848855" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.848927" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:37.726733" elapsed="0.122303"/>
</kw>
<msg time="2026-04-10T00:58:37.849130" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:37.849174" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.721817" elapsed="0.127394"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.849536" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.849286" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.849269" elapsed="0.000361"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:37.721668" elapsed="0.127986"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.855410" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.855303" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.855284" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.856642" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:37.856510" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.856493" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:37.857246" level="INFO">${karaf_connection_index} = 475</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:37.856934" elapsed="0.000338"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.857674" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:37.857432" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.895728" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:37.858193" elapsed="0.037765"/>
</kw>
<msg time="2026-04-10T00:58:37.896191" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:37.896238" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.857860" elapsed="0.038415"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:37.966923" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "[C "A "n "d "[C "G "e "t "[C "I "n "v "e "n "t "o "r "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:37.897009" elapsed="0.070367"/>
</kw>
<msg time="2026-04-10T00:58:37.967647" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:37.967698" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.896532" elapsed="0.071205"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.968225" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.967871" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.967831" elapsed="0.000484"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:37.968884" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "[78Ca "[A[78Cr
 "d "[C "A "n "d "[C "G "e "t "[C "I "n "v "e "n "t "o "r "y "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:37.968463" elapsed="0.000686"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.969437" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.969216" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.969198" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:37.969572" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:37.971199" elapsed="0.000802"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:37.972286" elapsed="0.000506"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:37.973060" 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-04-10T00:58:37.970507" elapsed="0.003021"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:37.969918" elapsed="0.003692"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:37.856209" elapsed="0.117503"/>
</kw>
<msg time="2026-04-10T00:58:37.973810" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:37.973855" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.855646" elapsed="0.118246"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:37.974079" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:37.973971" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.973953" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.974595" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.975282" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:37.975357" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:37.854755" elapsed="0.120716"/>
</kw>
<msg time="2026-04-10T00:58:37.975583" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:37.975628" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.849932" elapsed="0.125733"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:37.975994" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:37.975741" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:37.975724" elapsed="0.000347"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:37.849789" elapsed="0.126305"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:37.602116" elapsed="0.374013"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:58:37.599741" elapsed="0.376452"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:58:37.594675" elapsed="0.381628"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:37.594122" elapsed="0.382233"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:58:37.590631" elapsed="0.385782"/>
</kw>
<kw name="Check Shards Status And Initialize Variables">
<kw name="Check OpenFlow Shards Status" owner="ClusterOpenFlow">
<kw name="Run_Keyword_If_At_Least_Phosphorus" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run_Keyword_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Remove Values From List" owner="Collections">
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:37.998483" elapsed="0.000270"/>
</kw>
<msg time="2026-04-10T00:58:37.998816" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:37.997834" elapsed="0.001045"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run Collections.Remove Values From List [['inventory', 'topology', 'default', 'entity-ownership'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:58:37.997345" elapsed="0.001613"/>
</kw>
<msg time="2026-04-10T00:58:37.999004" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run_Keyword_If_At_Least</arg>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:37.988474" elapsed="0.010574"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to vanadium and in case vanadium is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-10T00:58:37.988060" elapsed="0.011061"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:37.999627" level="INFO">['inventory', 'topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:37.999325" elapsed="0.000349"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.004983" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:38.004602" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.005471" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:38.005172" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:38.005545" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:58:38.005719" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:38.004214" elapsed="0.001530"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:58:38.005898" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.006545" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:38.006212" elapsed="0.000374"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.006986" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:38.006748" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.007394" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:38.007161" elapsed="0.000259"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.010096" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.009552" elapsed="0.000571"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:38.010168" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:38.010316" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:38.009209" elapsed="0.001132"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.081895" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.081436" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.082864" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:38.082511" elapsed="0.000535">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:38.083145" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:38.082117" elapsed="0.001053"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.083747" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:38.083339" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.084086" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:38.084262" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:38.083939" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.084719" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.084448" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.085821" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.085535" elapsed="0.000333"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.086325" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.086032" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.086712" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.086919" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.087097" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:38.086555" elapsed="0.000600"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.086408" elapsed="0.000779"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:38.087239" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:58:38.087412" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:38.085209" elapsed="0.002228"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.084855" elapsed="0.002613"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.087661" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.087495" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.084825" elapsed="0.002913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.088337" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.087886" elapsed="0.000478"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:38.088412" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:38.080742" elapsed="0.007793"/>
</kw>
<msg time="2026-04-10T00:58:38.088609" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:38.068043" elapsed="0.020622"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.101285" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.113642" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.126138" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.126406" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.126636" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.127102" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.126945" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:38.126926" 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-04-10T00:58:38.127332" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.127500" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.127711" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:38.126883" elapsed="0.000884"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.126749" elapsed="0.001047"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.127968" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.128068" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:58:38.128370" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:38.063250" elapsed="0.065168"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.130406" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:38.130106" elapsed="0.000380">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:38.130598" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:38.129709" elapsed="0.000914"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.130988" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.130719" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.131558" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.131250" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.131068" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.130699" elapsed="0.000962"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.134082" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:38.131883" elapsed="0.002226"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:38.134180" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:58:38.134487" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:38.129121" elapsed="0.005411"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.136457" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:38.136210" elapsed="0.000310">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:38.136692" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:38.135867" elapsed="0.000850"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:38.136950" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:38.136812" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.136793" elapsed="0.000242"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.137212" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.137401" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.137483" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:58:38.139721" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:38.135213" elapsed="0.004556"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.141909" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.141640" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.142375" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.142129" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:38.169458" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:38.169971" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:58:38 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:38.170385" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:38.144678" elapsed="0.025739"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.142505" elapsed="0.027976"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.170785" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.170522" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.142485" elapsed="0.028398"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.175015" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.172184" elapsed="0.003191"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.171934" elapsed="0.003478"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.171911" elapsed="0.003526"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.178106" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.175750" elapsed="0.002403"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.175496" elapsed="0.002691"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.175478" elapsed="0.002734"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.178810" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.178395" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.179147" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.178909" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.179722" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.179395" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.179229" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.178890" elapsed="0.000916"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.180329" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.179972" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.180679" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.180426" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.181215" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.180922" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.180761" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.180408" elapsed="0.000912"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:38.181473" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:38.182299" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.182007" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.182480" elapsed="0.002345"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:38.171369" elapsed="0.013523"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.185109" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:38.184998" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.184978" elapsed="0.000203"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:38.193703" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:38.185347" elapsed="0.008392"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:38.193831" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:58:38.194167" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:38.140504" elapsed="0.053711"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:38.194307" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:58:38.194651" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:38.038510" elapsed="0.156252"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.195891" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.195233" elapsed="0.000882"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.195213" elapsed="0.000983"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:38.196267" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:38.014586" elapsed="0.181832"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.010413" elapsed="0.186051"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.010394" elapsed="0.186094"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.197222" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:38.197092" elapsed="0.000176"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:58:38.197413" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:58:38.197290" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.197075" elapsed="0.000420"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.197678" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:58:38.197942" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:38.196802" elapsed="0.001173"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.198727" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.198169" elapsed="0.000585"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.199607" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.198917" elapsed="0.000719"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.206397" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.205828" elapsed="0.000675"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.207306" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.206791" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:38.220646" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:38.220798" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:38 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:38 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":163,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":163,"Leader":"member-2-shard-inventory-operational","LastIndex":164,"RaftState":"Follower","LastApplied":164,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","LastLogIndex":164,"LastLeadershipChangeTime":"2026-04-10 00:56:32.484","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"805.5 μs","CurrentTerm":6,"LastTerm":6,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":6,"StatRetrievalError":null,"CommitIndex":164,"SnapshotTerm":6,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":863468},"timestamp":1775782718,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:38.221332" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:38.210410" elapsed="0.011023"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.207565" elapsed="0.014035"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.223512" elapsed="0.000117"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.221703" elapsed="0.002057"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.207544" elapsed="0.016295"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.231701" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":163,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":163,"Leader":"member-2-shard-inventory-operational","LastIndex":164,"RaftState":"Follower","LastApplied":164,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","LastLogIndex":164,"LastLeadershipChangeTime":"2026-04-10 00:56:32.484","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"805.5 μs","CurrentTerm":6,"LastTerm":6,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":6,"StatRetrievalError":null,"CommitIndex":164,"SnapshotTerm":6,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":863468},"timestamp":1775782718,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.228865" elapsed="0.002914"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.228268" elapsed="0.003584"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.228220" elapsed="0.003694"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.234806" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.232401" elapsed="0.002454"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.232042" elapsed="0.002874"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.232002" elapsed="0.003011"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.236051" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.235398" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.236666" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.236259" elapsed="0.000490"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.237344" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.237034" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.236807" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.236219" elapsed="0.001265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.238419" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.237843" elapsed="0.000622"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.238976" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.238645" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.239675" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.239356" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.239134" elapsed="0.000628"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.238602" elapsed="0.001214"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:38.240152" elapsed="0.000553"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:38.241595" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.241066" elapsed="0.000576"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.241997" elapsed="0.002563"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:38.225790" elapsed="0.018957"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.245112" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:38.244888" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.244868" elapsed="0.000408"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:38.248843" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:38.245473" elapsed="0.003434"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:38.249073" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:58:38.249357" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:38.200706" elapsed="0.048859"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:38.249646" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:38.249804" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:38.199853" elapsed="0.049977"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.251206" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.250472" elapsed="0.000762"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:38.251283" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:38.251502" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:38.250074" elapsed="0.001457"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:38.251933" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 164, 'CommittedTransactionsCount': 0, 'CurrentTerm': 6, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.251707" elapsed="0.000254"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:38.252349" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.252117" elapsed="0.000257"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:38.252421" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:38.252620" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:38.008610" elapsed="0.244038"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:38.252708" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:38.252859" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:38.007881" elapsed="0.245006"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.253191" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.252971" elapsed="0.000447"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.253623" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.253442" elapsed="0.000238"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.253846" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.253703" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.252954" elapsed="0.000965"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:38.007683" elapsed="0.246260"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.256497" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.256002" elapsed="0.000522"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:38.256640" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:38.256794" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:38.255653" elapsed="0.001166"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.328499" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.328079" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.329370" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:38.329078" elapsed="0.000515">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:38.329695" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:38.328731" elapsed="0.000989"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.330312" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:38.329891" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.330663" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:38.330826" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:38.330501" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.331257" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.331010" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.332334" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.332073" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.332835" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.332539" elapsed="0.000322"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.333203" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.333410" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.333605" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:38.333064" elapsed="0.000601"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.332917" elapsed="0.000780"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:38.333747" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:58:38.333920" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:38.331746" elapsed="0.002198"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.331387" elapsed="0.002589"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.334188" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.334002" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.331360" elapsed="0.002905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.334867" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.334411" elapsed="0.000486"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:38.334947" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:38.327407" elapsed="0.007662"/>
</kw>
<msg time="2026-04-10T00:58:38.335123" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:38.314733" elapsed="0.020442"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.349243" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.361719" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.374090" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.374425" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.374657" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.375111" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.374959" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:38.374940" 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-04-10T00:58:38.375344" elapsed="0.000055"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.375553" elapsed="0.000037"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.375740" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:38.374899" elapsed="0.000894"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.374768" elapsed="0.001052"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.375994" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.376092" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:58:38.376390" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:38.309785" elapsed="0.066654"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.378463" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:38.378159" elapsed="0.000386">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:38.378654" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:38.377752" elapsed="0.000926"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.379045" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.378772" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.379651" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.379306" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.379125" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.378752" elapsed="0.000983"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.382102" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:38.379909" elapsed="0.002219"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:38.382201" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:58:38.382510" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:38.377158" elapsed="0.005401"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.384445" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:38.384192" elapsed="0.000316">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:38.384719" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:38.383850" elapsed="0.000895"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:38.384977" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:38.384842" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.384823" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.385238" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.385429" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.385511" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:58:38.434693" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:38.383248" elapsed="0.051510"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.437175" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.436862" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.437704" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.437435" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:38.456453" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:38.457429" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:58:38 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:38.458052" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:38.439958" elapsed="0.018159"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.437846" elapsed="0.020374"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.458700" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.458286" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.437823" elapsed="0.021055"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.464767" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.460565" elapsed="0.004701"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.460213" elapsed="0.005107"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.460183" elapsed="0.005174"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.468501" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.465806" elapsed="0.002744"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.465442" elapsed="0.003155"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.465417" elapsed="0.003206"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.469209" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.468812" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.469549" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.469307" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.470117" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.469814" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.469647" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.469288" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.470758" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.470379" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.471091" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.470854" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.471646" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.471333" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.471173" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.470837" elapsed="0.000893"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:38.471885" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:38.472711" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.472396" elapsed="0.000340"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.472892" elapsed="0.002487"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:38.459507" elapsed="0.015940"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.475692" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:38.475558" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.475536" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:38.484170" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:38.475932" elapsed="0.008269"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:38.484279" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:58:38.484636" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:38.435634" elapsed="0.049052"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:38.484779" elapsed="0.000061"/>
</return>
<msg time="2026-04-10T00:58:38.485099" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:38.285257" elapsed="0.199951"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.486300" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.485688" elapsed="0.000829"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.485668" elapsed="0.000949"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:38.486690" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:38.261118" elapsed="0.225721"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.256887" elapsed="0.230150"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.256870" elapsed="0.230195"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.487820" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:38.487690" elapsed="0.000176"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:58:38.488009" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:38.487888" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.487672" elapsed="0.000419"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.488246" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:58:38.488366" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:38.487372" elapsed="0.001019"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.489018" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.488587" elapsed="0.000458"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.489790" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.489204" elapsed="0.000616"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.496420" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.495897" elapsed="0.000627"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.497321" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.496809" 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-04-10T00:58:38.512469" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:38.512614" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:38 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:38 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":42,"SnapshotIndex":163,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":163,"Leader":"member-2-shard-inventory-operational","LastIndex":164,"RaftState":"Leader","LastApplied":164,"LastCommittedTransactionTime":"2026-04-10 00:58:28.134","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational","LastLogIndex":164,"LastLeadershipChangeTime":"2026-04-10 00:56:32.466","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.136","active":true,"matchIndex":164,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":165},{"timeSinceLastActivity":"00:00:00.137","active":true,"matchIndex":164,"voting":true,"id":"member-3-shard-inventory-operational","nextIndex":165}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.117 ms","CurrentTerm":6,"LastTerm":6,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":42,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-3-shard-inventory-operational: true","LastLogTerm":6,"StatRetrievalError":null,"CommitIndex":164,"SnapshotTerm":6,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":8,"ShardName":"member-2-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":98440},"timestamp":1775782718,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:38.512994" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:38.500449" elapsed="0.012614"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.497615" elapsed="0.015547"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.514433" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.513233" elapsed="0.001481"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.497562" elapsed="0.017212"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.522752" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":42,"SnapshotIndex":163,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":163,"Leader":"member-2-shard-inventory-operational","LastIndex":164,"RaftState":"Leader","LastApplied":164,"LastCommittedTransactionTime":"2026-04-10 00:58:28.134","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-3-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-inventory-operational","LastLogIndex":164,"LastLeadershipChangeTime":"2026-04-10 00:56:32.466","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.136","active":true,"matchIndex":164,"voting":true,"id":"member-1-shard-inventory-operational","nextIndex":165},{"timeSinceLastActivity":"00:00:00.137","active":true,"matchIndex":164,"voting":true,"id":"member-3-shard-inventory-operational","nextIndex":165}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.117 ms","CurrentTerm":6,"LastTerm":6,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":42,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-3-shard-inventory-operational: true","LastLogTerm":6,"StatRetrievalError":null,"CommitIndex":164,"SnapshotTerm":6,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":8,"ShardName":"member-2-shard-inventory-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":98440},"timestamp":1775782718,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.518629" elapsed="0.004216"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.517940" elapsed="0.004996"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.517873" elapsed="0.005149"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.526529" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.523706" elapsed="0.002887"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.523208" elapsed="0.003446"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.523149" elapsed="0.003565"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.527737" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.527086" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.528307" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.527948" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.529003" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.528689" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.528447" elapsed="0.000644"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.527906" elapsed="0.001244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.530119" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.529490" elapsed="0.000676"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.530680" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.530328" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.531347" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.531045" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.530820" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.530287" elapsed="0.001202"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:38.531846" elapsed="0.000663"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:38.533415" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.532901" elapsed="0.000559"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.533836" elapsed="0.002577"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:38.516140" elapsed="0.020394"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.536922" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:38.536695" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.536674" elapsed="0.000414"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:38.540782" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:38.537285" elapsed="0.003561"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:38.541069" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:58:38.541360" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:38.490780" elapsed="0.050608"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:38.541448" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:38.541622" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:38.490042" elapsed="0.051608"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.543122" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.542296" elapsed="0.000856"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:38.543201" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:38.543379" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:38.541897" elapsed="0.001509"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:38.543824" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 164, 'CommittedTransactionsCount': 42, 'CurrentTerm': 6, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.543582" elapsed="0.000270"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:38.544250" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.544015" elapsed="0.000261"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:38.544323" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:38.544477" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:38.255018" elapsed="0.289483"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:38.544562" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:58:38.544758" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:38.254287" elapsed="0.290495"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.545093" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.544871" elapsed="0.000278"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.545376" elapsed="0.000211"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.545172" elapsed="0.000455"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.545801" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.545651" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.544852" elapsed="0.001024"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:38.254117" elapsed="0.291786"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.548550" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.548047" elapsed="0.000546"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:38.548640" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:38.548789" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:38.547704" elapsed="0.001147"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.621115" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.620659" elapsed="0.000594"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.622097" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:38.621823" elapsed="0.000351">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:38.622270" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:38.621445" elapsed="0.000850"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.622872" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:38.622462" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.623252" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:38.623417" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:38.623063" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.623872" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.623620" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.624998" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.624721" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.625472" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.625205" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.625857" elapsed="0.000025"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.626069" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.626244" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:38.625718" elapsed="0.000583"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.625557" elapsed="0.000775"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:38.626381" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:58:38.626554" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:38.624369" elapsed="0.002224"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.624004" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.626801" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.626652" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.623979" elapsed="0.002898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.627491" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.627022" elapsed="0.000495"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:38.627568" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:38.619838" elapsed="0.007871"/>
</kw>
<msg time="2026-04-10T00:58:38.627764" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:38.607109" elapsed="0.020712"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.640629" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.653163" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.665477" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.665755" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.665968" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.666506" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.666262" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:38.666244" elapsed="0.000371"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.666760" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.666929" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.667095" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:38.666204" elapsed="0.000944"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.666079" elapsed="0.001097"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.667348" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.667446" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:58:38.667760" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:38.602234" elapsed="0.065575"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.669847" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:38.669513" elapsed="0.000413">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:38.670018" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:38.669113" elapsed="0.000930"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.670402" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.670136" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.670986" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.670684" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.670483" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.670117" elapsed="0.000951"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.673470" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:38.671240" elapsed="0.002257"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:38.673584" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:58:38.673899" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:38.668498" elapsed="0.005447"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.675937" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:38.675678" elapsed="0.000325">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:38.676096" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:38.675318" elapsed="0.000802"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:38.676351" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:38.676214" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.676194" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.676630" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.676825" elapsed="0.000039"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.676927" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:58:38.679188" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:38.674770" elapsed="0.004465"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.681379" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.681116" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.681869" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.681619" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:38.714477" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:38.715596" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01a1l7wam2dhg1d7al71x5srg20.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Thu, 09-Apr-2026 00:58:38 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:38.716176" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:38.684101" elapsed="0.032142"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.682000" elapsed="0.034365"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.716914" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.716441" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.681981" elapsed="0.035146"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.724332" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.719825" elapsed="0.004866"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.719286" elapsed="0.005443"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.719244" elapsed="0.005511"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.727383" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.725048" elapsed="0.002383"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.724814" elapsed="0.002651"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.724796" elapsed="0.002693"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.728100" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.727700" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.728444" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.728199" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.729015" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.728710" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.728525" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.728181" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.729634" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.729258" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.729962" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.729731" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.730501" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.730203" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.730043" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.729713" elapsed="0.000926"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:38.730794" elapsed="0.000460"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:38.731743" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.731426" elapsed="0.000343"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.731924" elapsed="0.002634"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:38.718206" elapsed="0.016435"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.734905" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:38.734793" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.734773" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:38.743596" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:38.735147" elapsed="0.008487"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:38.743732" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:58:38.744082" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:38.679944" elapsed="0.064186"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:38.744227" elapsed="0.000063"/>
</return>
<msg time="2026-04-10T00:58:38.744559" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:38.577441" elapsed="0.167252"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.745846" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.745172" elapsed="0.000910"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.745152" elapsed="0.001029"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:38.746251" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:38.553291" elapsed="0.193109"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.549129" elapsed="0.197317"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.548908" elapsed="0.197563"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.747271" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:38.747129" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:58:38.747458" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:38.747337" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.747110" elapsed="0.000429"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.747723" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:58:38.747844" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:38.746788" elapsed="0.001082"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.748533" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.748065" elapsed="0.000498"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.749297" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.748740" elapsed="0.000587"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.756083" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.755517" elapsed="0.000671"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.756994" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.756454" elapsed="0.000642"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:38.775327" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:38.775419" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:38 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:38 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":163,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":163,"Leader":"member-2-shard-inventory-operational","LastIndex":164,"RaftState":"Follower","LastApplied":164,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","LastLogIndex":164,"LastLeadershipChangeTime":"2026-04-10 00:58:01.717","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"4.499 ms","CurrentTerm":6,"LastTerm":6,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":6,"StatRetrievalError":null,"CommitIndex":164,"SnapshotTerm":6,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":98396},"timestamp":1775782718,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:38.775794" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:38.760132" elapsed="0.015731"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.757253" elapsed="0.018776"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.777979" elapsed="0.000089"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.776124" elapsed="0.002081"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.757232" elapsed="0.021059"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.787333" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":163,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":163,"Leader":"member-2-shard-inventory-operational","LastIndex":164,"RaftState":"Follower","LastApplied":164,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-inventory-operational, member-2-shard-inventory-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-inventory-operational","LastLogIndex":164,"LastLeadershipChangeTime":"2026-04-10 00:58:01.717","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"4.499 ms","CurrentTerm":6,"LastTerm":6,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-operational: true, member-2-shard-inventory-operational: true","LastLogTerm":6,"StatRetrievalError":null,"CommitIndex":164,"SnapshotTerm":6,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":98396},"timestamp":1775782718,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.784188" elapsed="0.003207"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.783278" elapsed="0.004184"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.783178" elapsed="0.004345"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.790400" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.788001" elapsed="0.002446"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.787673" elapsed="0.002835"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.787632" elapsed="0.002959"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.791699" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.790970" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.792255" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.791913" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.793047" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.792728" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.792394" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.791869" elapsed="0.001320"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.794136" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.793525" elapsed="0.000657"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.794695" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.794344" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.795363" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.795058" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.794836" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.794303" elapsed="0.001202"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:38.795861" elapsed="0.000523"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:38.797315" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.796801" elapsed="0.000560"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.797742" elapsed="0.002564"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:38.780400" elapsed="0.020013"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.800900" elapsed="0.000054"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:38.800559" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.800535" elapsed="0.000532"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:38.804934" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:38.801263" elapsed="0.003742"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:38.805175" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:58:38.805463" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:38.750320" elapsed="0.055171"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:38.805618" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:38.805774" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestam...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:38.749549" elapsed="0.056251"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.807228" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.806437" elapsed="0.000820"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:38.807305" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:38.807479" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:38.806042" elapsed="0.001463"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:38.807932" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 164, 'CommittedTransactionsCount': 0, 'CurrentTerm': 6, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.807692" elapsed="0.000267"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:38.808358" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.808122" elapsed="0.000261"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:38.808430" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:38.808641" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:38.547082" elapsed="0.261586"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:38.808727" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:38.808879" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:38.546261" elapsed="0.262642"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.809249" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.808991" elapsed="0.000489"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.809667" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.809505" elapsed="0.000219"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.809890" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.809746" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.808970" elapsed="0.000997"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:38.546082" elapsed="0.263909"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:38.007467" elapsed="0.802559"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:58:38.810071" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:38.810278" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:58:38.810329" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:58:38.003460" elapsed="0.806893"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.810829" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:58:38.810910" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:38.810530" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.811218" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.811003" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.810986" elapsed="0.000307"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.813642" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:58:38.811433" elapsed="0.002256"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:58:38.814087" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.813898" elapsed="0.000215"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:58:38.814160" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:58:38.000716" elapsed="0.813599"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:58:38.000461" elapsed="0.813901"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.819077" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:38.818686" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.819582" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:38.819265" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:38.819656" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:38.819809" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:38.818278" elapsed="0.001555"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:58:38.819987" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.820647" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:38.820298" elapsed="0.000375"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.821076" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:38.820832" elapsed="0.000269"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.821501" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:38.821249" elapsed="0.000277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.824175" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.823673" elapsed="0.000529"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:38.824248" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:38.824394" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:38.823313" elapsed="0.001105"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.896097" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.895639" elapsed="0.000493"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.897028" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:38.896681" elapsed="0.000424">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:38.897200" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:38.896312" elapsed="0.000913"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.897807" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:38.897393" elapsed="0.000443"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.898141" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:38.898300" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:38.898000" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.898828" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.898560" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.899985" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.899659" elapsed="0.000371"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.900469" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:38.900195" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.900855" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.901065" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.901242" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:38.900716" elapsed="0.000583"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.900553" elapsed="0.000779"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:38.901382" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:58:38.901556" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:38.899306" elapsed="0.002289"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.898956" elapsed="0.002674"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.901806" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.901656" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.898933" elapsed="0.002948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.902484" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:38.902030" elapsed="0.000481"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:38.902562" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:38.894922" elapsed="0.007781"/>
</kw>
<msg time="2026-04-10T00:58:38.902757" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:38.882217" elapsed="0.020598"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.915525" elapsed="0.000075"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.928034" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.940336" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.940614" 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-04-10T00:58:38.940830" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.941398" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.941241" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:38.941221" 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-04-10T00:58:38.941647" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.941818" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.941986" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:38.941147" elapsed="0.000892"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.941015" elapsed="0.001053"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.942240" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.942338" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:58:38.942650" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:38.877241" elapsed="0.065459"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.944696" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:38.944373" elapsed="0.000400">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:38.944866" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:38.943964" elapsed="0.000927"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.945252" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.944983" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.945861" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:38.945533" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.945354" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.944964" elapsed="0.000980"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.948282" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:38.946116" elapsed="0.002192"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:38.948378" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:58:38.948712" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:38.943374" elapsed="0.005386"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:38.950664" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:38.950388" elapsed="0.000340">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:38.950821" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:38.950047" elapsed="0.000798"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:38.951077" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:38.950939" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.950920" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.951337" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.951529" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:38.951636" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:58:38.953967" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:38.949467" elapsed="0.004547"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.956129" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.955861" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.956614" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.956350" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:38.990309" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:38.991042" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:38.991420" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:38.958985" elapsed="0.032478"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.956747" elapsed="0.034796"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:38.991919" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:38.991620" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.956727" elapsed="0.035320"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:38.998174" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.993802" elapsed="0.004896"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.993428" elapsed="0.005324"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.993398" elapsed="0.005390"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.002699" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:38.999233" elapsed="0.003535"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.998870" elapsed="0.003949"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.998844" elapsed="0.004010"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.003751" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.003156" elapsed="0.000635"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.004132" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.003888" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.004698" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.004376" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.004213" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.003868" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.005296" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.004940" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.005641" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.005392" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.006172" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.005881" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.005722" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.005374" elapsed="0.000880"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:39.006406" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:39.007256" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.006937" elapsed="0.000346"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.007438" elapsed="0.003853"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:38.992744" elapsed="0.018650"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.011658" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:39.011517" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.011498" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:39.020045" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:39.011897" elapsed="0.008181"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:39.020155" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:58:39.020479" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:38.954719" elapsed="0.065807"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.020651" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:58:39.020968" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:38.852369" elapsed="0.168705"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.022160" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.021530" elapsed="0.000848"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.021511" elapsed="0.000947"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.022529" elapsed="0.000033"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:38.828651" elapsed="0.194046"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:38.824488" elapsed="0.198254"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:38.824470" elapsed="0.198295"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.023464" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:39.023333" elapsed="0.000176"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:58:39.023674" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-10T00:58:39.023532" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.023316" elapsed="0.000467"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.023937" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:58:39.024057" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:39.023051" elapsed="0.001032"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.024723" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.024263" elapsed="0.000487"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.025457" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.024909" elapsed="0.000578"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.032092" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.031530" elapsed="0.000667"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.033006" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.032464" 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-04-10T00:58:39.047374" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:39.047504" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:39 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:39 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":18,"SnapshotIndex":56,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":56,"Leader":"member-1-shard-topology-operational","LastIndex":57,"RaftState":"Leader","LastApplied":57,"LastCommittedTransactionTime":"2026-04-10 00:58:28.103","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":57,"LastLeadershipChangeTime":"2026-04-10 00:56:32.486","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.236","active":true,"matchIndex":57,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":58},{"timeSinceLastActivity":"00:00:00.237","active":true,"matchIndex":57,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":58}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"2.634 ms","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":18,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":57,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":3800},"timestamp":1775782719,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:39.048038" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:39.036124" elapsed="0.012016"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.033261" elapsed="0.015006"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.050133" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.048358" elapsed="0.002069"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.033241" elapsed="0.017268"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.060139" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":18,"SnapshotIndex":56,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":56,"Leader":"member-1-shard-topology-operational","LastIndex":57,"RaftState":"Leader","LastApplied":57,"LastCommittedTransactionTime":"2026-04-10 00:58:28.103","PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":57,"LastLeadershipChangeTime":"2026-04-10 00:56:32.486","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.236","active":true,"matchIndex":57,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":58},{"timeSinceLastActivity":"00:00:00.237","active":true,"matchIndex":57,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":58}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"2.634 ms","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":18,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":57,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":3800},"timestamp":1775782719,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.055787" elapsed="0.004445"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.055046" elapsed="0.005280"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.054956" elapsed="0.005458"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.064977" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.061134" elapsed="0.003914"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.060628" elapsed="0.004510"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.060546" elapsed="0.004679"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.066443" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.065786" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.067021" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.066675" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.067715" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.067386" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.067161" elapsed="0.000641"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.066633" elapsed="0.001225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.068791" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.068195" elapsed="0.000641"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.069346" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.069015" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.070030" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.069722" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.069482" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.068973" elapsed="0.001197"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:39.070504" elapsed="0.000544"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:39.071937" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.071410" elapsed="0.000572"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.072336" elapsed="0.002621"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:39.052390" elapsed="0.022671"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.075426" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:39.075202" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.075182" elapsed="0.000428"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:39.079321" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:39.075811" elapsed="0.003575"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:39.079624" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:58:39.079916" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:39.026446" elapsed="0.053498"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.080004" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:39.080155" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:39.025721" elapsed="0.054460"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.081617" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757827...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.080866" elapsed="0.000781"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:39.081696" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:39.081872" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757827...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:39.080420" elapsed="0.001481"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:39.082287" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 57, 'CommittedTransactionsCount': 18, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.082063" elapsed="0.000252"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:39.082726" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.082471" elapsed="0.000281"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:39.082800" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:39.082952" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:38.822711" elapsed="0.260265"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:39.083034" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:39.083182" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:38.821972" elapsed="0.261234"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.083502" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.083287" elapsed="0.000275"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.083809" elapsed="0.000188"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.083600" elapsed="0.000434"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.084205" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.084058" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.083270" elapsed="0.001008"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:38.821801" elapsed="0.262500"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.087046" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.086521" elapsed="0.000552"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:39.087120" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:39.087268" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:39.086178" elapsed="0.001114"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.158964" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.158539" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.159918" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:39.159650" elapsed="0.000346">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:39.160090" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:39.159261" elapsed="0.000854"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.160691" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:39.160283" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.161032" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:39.161188" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:39.160883" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.161655" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.161377" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.162718" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.162435" elapsed="0.000328"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.163195" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.162927" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.163616" elapsed="0.000025"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.163828" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.164010" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:39.163419" elapsed="0.000648"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.163275" elapsed="0.000823"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:39.164146" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:58:39.164318" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:39.162108" elapsed="0.002235"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.161782" elapsed="0.002593"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.164551" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.164399" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.161759" elapsed="0.002885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.165234" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.164793" elapsed="0.000468"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.165309" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:39.157895" elapsed="0.007538"/>
</kw>
<msg time="2026-04-10T00:58:39.165487" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:39.145192" elapsed="0.020352"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.178400" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.190922" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.203368" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.203635" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.203849" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.204287" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.204133" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:39.204116" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.204514" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.204738" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.204914" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:39.204079" elapsed="0.000892"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.203956" elapsed="0.001043"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.205171" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.205267" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:58:39.205561" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:39.140131" elapsed="0.065497"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.207606" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:39.207284" elapsed="0.000401">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:39.207778" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:39.206899" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.208159" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.207896" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.208746" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.208421" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.208242" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.207876" elapsed="0.000980"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.211234" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:39.209038" elapsed="0.002223"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:39.211334" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:58:39.211667" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:39.206311" elapsed="0.005402"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.213656" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:39.213383" elapsed="0.000337">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:39.213813" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:39.213044" elapsed="0.000793"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:39.214068" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:39.213931" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.213912" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.214330" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.214522" elapsed="0.000025"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.214624" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:58:39.216875" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:39.212443" elapsed="0.004479"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.219153" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.218883" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.219647" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.219378" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:39.236449" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:39.237436" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:39.238004" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:39.221922" elapsed="0.016144"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.219779" elapsed="0.018391"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.238636" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.238234" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.219760" elapsed="0.019077"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.247355" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.241256" elapsed="0.006450"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.240764" elapsed="0.006981"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.240722" elapsed="0.007049"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.250467" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.248063" elapsed="0.002450"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.247830" elapsed="0.002718"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.247812" elapsed="0.002778"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.251180" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.250779" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.251517" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.251279" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.252090" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.251786" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.251620" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.251260" elapsed="0.000914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.252716" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.252335" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.253053" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.252814" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.253614" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.253297" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.253136" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.252796" elapsed="0.000903"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:39.253856" elapsed="0.000382"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:39.254734" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.254407" elapsed="0.000354"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.254919" elapsed="0.002531"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:39.239766" elapsed="0.017752"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.257764" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:39.257651" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.257630" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:39.266280" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:39.258006" elapsed="0.008304"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:39.266390" elapsed="0.000060"/>
</return>
<msg time="2026-04-10T00:58:39.266766" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:39.217654" elapsed="0.049159"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.266907" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:58:39.267231" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:39.115786" elapsed="0.151555"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.268440" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.267821" elapsed="0.000860"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.267801" elapsed="0.000962"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.268835" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:39.091709" elapsed="0.177354"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.087359" elapsed="0.181751"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.087342" elapsed="0.181793"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.269868" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:39.269738" elapsed="0.000176"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:58:39.270059" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:39.269936" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.269720" elapsed="0.000421"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.270291" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:58:39.270411" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:39.269432" elapsed="0.001004"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.271251" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.270660" elapsed="0.000618"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.272019" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.271437" elapsed="0.000611"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.278804" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.278228" elapsed="0.000684"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.279720" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.279182" elapsed="0.000640"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:39.291336" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:39.291429" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:39 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:39 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":56,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":56,"Leader":"member-1-shard-topology-operational","LastIndex":57,"RaftState":"Follower","LastApplied":57,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":57,"LastLeadershipChangeTime":"2026-04-10 00:56:32.474","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"665.2 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":57,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":13678},"timestamp":1775782719,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:39.291803" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:39.282824" elapsed="0.009048"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.279979" elapsed="0.011978"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.293187" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.292020" elapsed="0.001307"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.279959" elapsed="0.013420"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.301207" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":56,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":56,"Leader":"member-1-shard-topology-operational","LastIndex":57,"RaftState":"Follower","LastApplied":57,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":57,"LastLeadershipChangeTime":"2026-04-10 00:56:32.474","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"665.2 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":57,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":13678},"timestamp":1775782719,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.297196" elapsed="0.004103"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.296586" elapsed="0.004804"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.296394" elapsed="0.005084"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.305251" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.302172" elapsed="0.003126"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.301692" elapsed="0.003668"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.301632" elapsed="0.003787"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.306430" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.305806" elapsed="0.000672"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.307002" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.306661" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.307732" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.307367" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.307141" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.306619" elapsed="0.001257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.308824" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.308216" elapsed="0.000655"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.309370" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.309034" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.310059" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.309752" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.309509" elapsed="0.000638"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.308992" elapsed="0.001211"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:39.310535" elapsed="0.000538"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:39.312074" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.311434" elapsed="0.000687"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.312475" elapsed="0.002516"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:39.294674" elapsed="0.020418"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.315449" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:39.315229" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.315210" elapsed="0.000476"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:39.319188" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:39.315907" elapsed="0.003345"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:39.319419" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:58:39.319775" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:39.273042" elapsed="0.046760"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.319945" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:39.320103" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:39.272295" elapsed="0.047834"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.321465" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757827...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.320766" elapsed="0.000728"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:39.321546" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:58:39.321740" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757827...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:39.320363" elapsed="0.001404"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:39.322157" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 57, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.321930" elapsed="0.000255"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:39.322593" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.322341" elapsed="0.000280"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:39.322668" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:39.322822" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:39.085450" elapsed="0.237397"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:39.322906" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:39.323055" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:39.084705" elapsed="0.238374"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.323379" elapsed="0.000270"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.323161" elapsed="0.000527"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.323859" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.323712" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.324092" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.323937" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.323144" elapsed="0.001021"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:39.084471" elapsed="0.239719"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.326856" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.326341" elapsed="0.000541"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:39.326926" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:39.327074" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:39.325999" elapsed="0.001099"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.397975" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.397551" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.398985" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:39.398596" elapsed="0.000547">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:39.399241" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:39.398236" elapsed="0.001030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.399843" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:39.399433" elapsed="0.000437"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.400174" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:39.400332" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:39.400032" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.400781" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.400517" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.401824" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.401546" elapsed="0.000322"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.402345" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.402037" 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-04-10T00:58:39.402732" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.402939" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.403115" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:39.402589" elapsed="0.000584"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.402427" elapsed="0.000778"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:39.403255" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:58:39.403424" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:39.401220" elapsed="0.002228"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.400906" 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 variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.403676" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.403506" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.400883" elapsed="0.002871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.404343" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.403901" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.404419" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:39.396923" elapsed="0.007623"/>
</kw>
<msg time="2026-04-10T00:58:39.404620" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:39.384196" elapsed="0.020478"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.417179" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.429564" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.441985" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.442221" 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-04-10T00:58:39.442421" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.442867" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.442714" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:39.442697" 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-04-10T00:58:39.443100" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.443272" elapsed="0.000046"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.443469" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:39.442660" elapsed="0.000863"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.442522" elapsed="0.001029"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.443743" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.443839" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:58:39.444117" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:39.379464" elapsed="0.064700"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.446082" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:39.445799" elapsed="0.000356">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:39.446246" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:39.445407" elapsed="0.000863"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.446635" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.446363" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.447201" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.446899" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.446719" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.446343" elapsed="0.000943"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.449665" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:39.447475" elapsed="0.002216"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:39.449764" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:39.450068" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:39.444854" elapsed="0.005259"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.452070" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:39.451818" elapsed="0.000316">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:39.452269" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:39.451327" elapsed="0.000968"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:39.452527" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:58:39.452390" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.452370" 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-04-10T00:58:39.452811" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.453003" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.453087" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:58:39.455263" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:39.450787" elapsed="0.004523"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.457437" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.457178" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.457921" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.457674" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:39.481349" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01a1l7wam2dhg1d7al71x5srg20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:39.482376" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:39.482890" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:39.460159" elapsed="0.022796"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.458050" elapsed="0.025007"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.483534" elapsed="0.000110"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.483121" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.458031" elapsed="0.025768"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.490412" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.486042" elapsed="0.004893"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.485694" elapsed="0.005296"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.485664" elapsed="0.005363"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.494389" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.491466" elapsed="0.002970"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.491112" elapsed="0.003359"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.491087" elapsed="0.003408"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.495112" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.494697" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.495470" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.495212" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.496069" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.495746" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.495560" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.495193" elapsed="0.000961"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.496703" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.496316" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.497133" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.496884" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.497693" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.497376" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.497216" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.496861" elapsed="0.000915"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:39.497928" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:39.498754" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.498436" elapsed="0.000344"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.498934" elapsed="0.002509"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:39.484989" elapsed="0.016521"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.501749" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:39.501637" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.501616" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:39.511736" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:39.502039" elapsed="0.009729"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:39.511848" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:58:39.512216" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:39.456061" elapsed="0.056206"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.512364" elapsed="0.000066"/>
</return>
<msg time="2026-04-10T00:58:39.512734" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:39.354779" elapsed="0.158066"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.514249" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.513426" elapsed="0.001055"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.513399" elapsed="0.001182"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.514660" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:39.331426" elapsed="0.183390"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.327164" elapsed="0.187697"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.327147" elapsed="0.187739"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.515635" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:39.515483" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:58:39.515830" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:39.515705" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.515465" elapsed="0.000449"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.516077" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:58:39.516198" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:39.515183" elapsed="0.001042"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.516866" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.516403" elapsed="0.000491"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.517715" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.517052" elapsed="0.000694"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.524664" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.524100" elapsed="0.000673"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.525671" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.525045" elapsed="0.000731"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:39.538641" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:39.538717" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:39 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:39 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":56,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":56,"Leader":"member-1-shard-topology-operational","LastIndex":57,"RaftState":"Follower","LastApplied":57,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","LastLogIndex":57,"LastLeadershipChangeTime":"2026-04-10 00:58:01.506","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"648.8 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":57,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":3756},"timestamp":1775782719,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:39.539049" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:39.529167" elapsed="0.009988"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.525936" elapsed="0.013352"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.541281" elapsed="0.000103"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.539384" elapsed="0.002133"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.525915" elapsed="0.015719"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.549960" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":56,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":56,"Leader":"member-1-shard-topology-operational","LastIndex":57,"RaftState":"Follower","LastApplied":57,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","LastLogIndex":57,"LastLeadershipChangeTime":"2026-04-10 00:58:01.506","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"648.8 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":57,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":3756},"timestamp":1775782719,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.547133" elapsed="0.002894"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.546626" elapsed="0.003467"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.546493" elapsed="0.003660"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.553075" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.550756" elapsed="0.002366"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.550305" elapsed="0.002878"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.550263" elapsed="0.002981"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.554306" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.553655" elapsed="0.000739"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.554927" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.554566" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.555681" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.555295" elapsed="0.000414"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.555067" elapsed="0.000704"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.554520" elapsed="0.001307"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.556809" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.556172" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.557371" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.557021" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.558113" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.557779" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.557530" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.556979" elapsed="0.001279"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:39.558643" elapsed="0.000536"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:39.560139" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.559565" elapsed="0.000621"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.560546" elapsed="0.002659"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:39.543647" elapsed="0.019662"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.563697" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:39.563452" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.563431" elapsed="0.000434"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:39.567358" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:39.564065" elapsed="0.003358"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:39.567610" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:58:39.567902" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:39.518723" elapsed="0.049206"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.568041" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:39.568214" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:39.517966" elapsed="0.050281"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.569957" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757827...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.569178" elapsed="0.000810"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:39.570038" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:39.570229" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17757827...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:39.568530" elapsed="0.001733"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:39.570799" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 57, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.570470" elapsed="0.000432"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:39.571320" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.571072" elapsed="0.000274"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:39.571394" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:39.571554" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:39.325373" elapsed="0.246221"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:39.571654" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:39.571807" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:39.324533" elapsed="0.247298"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.572140" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.571918" elapsed="0.000452"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.572539" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.572395" elapsed="0.000280"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.572843" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.572699" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.571899" elapsed="0.001016"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:39.324362" elapsed="0.248578"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:38.821594" elapsed="0.751381"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:58:39.573020" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:39.573223" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-10T00:58:39.573269" level="INFO">${follower_list} = [2, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:58:38.817433" elapsed="0.755859"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.573764" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:58:39.573843" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:39.573468" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.574152" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.573935" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.573917" elapsed="0.000311"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.578092" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:58:39.574365" elapsed="0.003777"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:58:39.578557" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.578361" elapsed="0.000237"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:58:39.578647" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:58:38.814712" elapsed="0.764092"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:58:38.814454" elapsed="0.764397"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.583423" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:39.583011" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.583932" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:39.583628" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:39.584003" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:39.584157" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:39.582635" elapsed="0.001547"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:58:39.584335" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.585001" level="INFO">${ds_type} = operational</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:39.584667" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.585423" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:39.585187" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.585952" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:39.585614" elapsed="0.000364"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.588685" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.588160" elapsed="0.000552"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:39.588758" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:39.588907" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:39.587813" elapsed="0.001119"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.660759" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.660362" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.661619" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:39.661331" elapsed="0.000369">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:39.661794" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:39.660953" elapsed="0.000866"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.662368" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:39.661986" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.662715" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:39.662872" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:39.662561" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.663351" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.663101" 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-04-10T00:58:39.664365" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.664103" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.664862" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.664589" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.665212" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.665442" elapsed="0.000029"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.665662" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:39.665075" elapsed="0.000647"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.664937" elapsed="0.000815"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:39.665795" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:39.665956" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:39.663779" elapsed="0.002201"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.663464" elapsed="0.002548"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.666186" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.666037" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.663445" elapsed="0.002817"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.666856" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.666406" elapsed="0.000477"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.666931" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:39.659741" elapsed="0.007314"/>
</kw>
<msg time="2026-04-10T00:58:39.667109" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:39.647073" elapsed="0.020088"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.679883" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.692359" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.704914" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.705143" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.705341" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.705800" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.705651" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:39.705636" 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-04-10T00:58:39.706023" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.706193" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.706361" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:39.705604" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.705473" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.706646" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.706742" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:58:39.707002" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:39.642319" elapsed="0.064729"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.708899" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:39.708644" elapsed="0.000318">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:39.709053" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:39.708284" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.709420" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.709171" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.709996" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.709695" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.709500" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.709152" elapsed="0.000926"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.712499" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:39.710253" elapsed="0.002272"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:39.712651" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:58:39.712958" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:39.707744" elapsed="0.005261"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.714821" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:39.714539" elapsed="0.000346">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:39.714977" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:39.714200" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:39.715230" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:39.715095" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.715076" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.715489" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.715698" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.715782" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:58:39.718047" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:39.713670" elapsed="0.004424"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.720307" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.719958" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.720796" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.720529" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:39.743560" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:39.744623" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:39.745080" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:39.723117" elapsed="0.022023"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.720975" elapsed="0.024261"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.745672" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.745296" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.720909" elapsed="0.024955"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.753599" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.748242" elapsed="0.005680"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.747749" elapsed="0.006208"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.747681" elapsed="0.006302"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.756610" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.754265" elapsed="0.002393"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.754040" elapsed="0.002652"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.754023" elapsed="0.002694"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.757262" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.756881" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.757615" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.757359" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.758326" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.757861" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.757697" elapsed="0.000691"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.757341" elapsed="0.001068"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.758952" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.758585" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.759280" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.759049" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.759836" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.759519" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.759360" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.759031" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:39.760125" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:39.760943" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.760655" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.761124" elapsed="0.002326"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:39.746745" elapsed="0.016767"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.763738" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:39.763628" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.763608" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:39.772246" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:39.763977" elapsed="0.008300"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:39.772354" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:58:39.772709" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:39.718795" elapsed="0.053963"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.772850" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:58:39.773168" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:39.617236" elapsed="0.156040"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.774345" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.773754" elapsed="0.000796"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.773734" elapsed="0.000911"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.774718" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:39.593137" elapsed="0.181729"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.589001" elapsed="0.185909"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.588983" elapsed="0.185952"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.775639" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:39.775493" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:58:39.775832" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:39.775709" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.775476" elapsed="0.000439"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.776066" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:58:39.776189" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:39.775222" elapsed="0.000994"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.776883" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.776388" elapsed="0.000525"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.777670" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.777080" elapsed="0.000619"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.784264" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.783742" elapsed="0.000626"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.785265" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.784654" elapsed="0.000714"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:39.794948" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:39.795007" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:39 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:39 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":69,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":69,"Leader":"member-2-shard-default-operational","LastIndex":70,"RaftState":"Follower","LastApplied":70,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLogIndex":70,"LastLeadershipChangeTime":"2026-04-10 00:56:32.528","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"349.2 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":70,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":93715},"timestamp":1775782719,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:39.795228" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:39.788353" elapsed="0.006920"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.785525" elapsed="0.009805"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.796145" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.795371" elapsed="0.000869"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.785505" elapsed="0.010771"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.801294" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":69,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":69,"Leader":"member-2-shard-default-operational","LastIndex":70,"RaftState":"Follower","LastApplied":70,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLogIndex":70,"LastLeadershipChangeTime":"2026-04-10 00:56:32.528","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"349.2 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":70,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":2,"InMemoryJournalDataSize":93715},"timestamp":1775782719,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.798746" elapsed="0.002627"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.798373" elapsed="0.003062"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.798330" elapsed="0.003165"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.804322" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.801989" elapsed="0.002380"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.801659" elapsed="0.002772"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.801618" elapsed="0.002871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.805472" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.804848" elapsed="0.000670"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.806118" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.805784" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.806858" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.806528" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.806257" elapsed="0.000689"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.805742" elapsed="0.001260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.807937" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.807337" elapsed="0.000646"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.808478" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.808144" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.809165" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.808858" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.808636" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.808104" elapsed="0.001203"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:39.809756" elapsed="0.000518"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:39.811145" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.810655" elapsed="0.000536"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.811549" elapsed="0.002557"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:39.797144" elapsed="0.017060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.814565" elapsed="0.000064"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:39.814342" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.814322" elapsed="0.000419"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:39.818189" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:39.814938" elapsed="0.003314"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:39.818419" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:39.818711" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:39.778660" elapsed="0.040078"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.818831" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:39.818984" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:39.777918" elapsed="0.041092"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.820313" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578271...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.819618" elapsed="0.000724"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:39.820390" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:39.820581" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578271...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:39.819232" elapsed="0.001377"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:39.820997" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 70, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.820769" elapsed="0.000255"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:39.821463" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.821221" elapsed="0.000267"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:39.821536" elapsed="0.000111"/>
</return>
<msg time="2026-04-10T00:58:39.821795" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:39.587153" elapsed="0.234666"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:39.821876" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:39.822025" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:39.586402" elapsed="0.235647"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.822346" elapsed="0.000189"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.822129" elapsed="0.000465"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.822768" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.822620" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.822985" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.822844" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.822112" elapsed="0.000946"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:39.586232" elapsed="0.236849"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.825715" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.825098" elapsed="0.000644"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:39.825787" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:39.825980" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:39.824757" elapsed="0.001248"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.896738" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.896272" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.897535" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:39.897296" elapsed="0.000336">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:39.897772" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:39.896936" elapsed="0.000860"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.898344" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:39.897963" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.898696" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:39.898840" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:39.898535" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.899273" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.899025" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.900341" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.900077" elapsed="0.000310"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.900837" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.900554" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.901192" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.901398" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.901590" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:39.901054" elapsed="0.000596"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.900915" elapsed="0.000765"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:39.901726" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:39.901888" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:39.899703" elapsed="0.002210"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.899389" elapsed="0.002556"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.902118" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.901970" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.899369" elapsed="0.002825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.902790" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.902338" elapsed="0.000479"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:39.902865" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:39.895630" elapsed="0.007358"/>
</kw>
<msg time="2026-04-10T00:58:39.903042" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:39.883086" elapsed="0.020009"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.915794" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.928207" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.941148" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.941431" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.941663" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.942124" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.941968" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:39.941948" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.942350" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.942516" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.942704" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:39.941906" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.941775" elapsed="0.001013"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.942959" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.943056" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:58:39.943354" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:39.878418" elapsed="0.064985"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.945433" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:39.945099" elapsed="0.000412">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:39.945621" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:39.944698" elapsed="0.000948"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.946004" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.945740" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.946590" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.946265" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.946085" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.945720" elapsed="0.000956"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.949028" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:39.946852" elapsed="0.002202"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:39.949127" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:39.949468" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:39.944112" elapsed="0.005402"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:39.951366" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:39.951115" elapsed="0.000314">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:39.951596" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:39.950778" elapsed="0.000844"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:39.951854" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:39.951717" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.951697" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.952115" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.952306" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:39.952389" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:58:39.954726" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:39.950201" elapsed="0.004577"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.957003" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.956676" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.957597" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.957258" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:39.974791" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:39.975732" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:39.976329" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:39.959837" elapsed="0.016552"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.957744" elapsed="0.018740"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.976916" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.976548" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.957723" elapsed="0.019383"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.986832" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.980244" elapsed="0.007436"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.979591" elapsed="0.008185"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.979489" elapsed="0.008360"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.992635" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:39.988521" elapsed="0.004165"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.987985" elapsed="0.004738"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.987945" elapsed="0.004803"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.993370" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.992956" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.993736" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.993471" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.994298" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.993988" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.993821" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.993452" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.995043" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.994604" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:39.995383" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:39.995143" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:39.995955" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:39.995653" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.995466" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.995125" elapsed="0.000919"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:39.996207" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:39.997042" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:39.996746" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:39.997225" elapsed="0.002876"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:39.977983" elapsed="0.022193"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.000447" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:40.000331" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.000307" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:40.009324" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:40.000734" elapsed="0.008636"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:40.009501" elapsed="0.000059"/>
</return>
<msg time="2026-04-10T00:58:40.009906" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:39.955479" elapsed="0.054476"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:40.010053" elapsed="0.000063"/>
</return>
<msg time="2026-04-10T00:58:40.010381" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:39.853958" elapsed="0.156557"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.011841" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.011066" elapsed="0.001031"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.011043" elapsed="0.001136"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:40.012288" elapsed="0.000031"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:39.830266" elapsed="0.182178"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:39.826074" elapsed="0.186417"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:39.826057" elapsed="0.186460"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.013292" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:40.013159" elapsed="0.000179"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:58:40.013482" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:40.013361" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.013142" elapsed="0.000443"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.013763" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:58:40.013885" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:40.012840" elapsed="0.001071"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.014604" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.014107" elapsed="0.000525"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.015401" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.014792" elapsed="0.000643"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.022730" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.022044" elapsed="0.000803"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.023740" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.023129" 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-04-10T00:58:40.038401" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:40.038497" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:40 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:40 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":10,"SnapshotIndex":73,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-operational","LastIndex":75,"RaftState":"Leader","LastApplied":74,"LastCommittedTransactionTime":"2026-04-10 00:58:03.321","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":75,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.106","active":true,"matchIndex":74,"voting":true,"id":"member-1-shard-default-operational","nextIndex":75},{"timeSinceLastActivity":"00:00:00.107","active":true,"matchIndex":74,"voting":true,"id":"member-3-shard-default-operational","nextIndex":75}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"943.5 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":6,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":9,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":2219},"timestamp":1775782720,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:40.038910" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:40.027062" elapsed="0.011916"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.024015" elapsed="0.015046"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.040490" elapsed="0.000116"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.039123" elapsed="0.001613"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.023989" elapsed="0.016917"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.050471" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":10,"SnapshotIndex":73,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-operational","LastIndex":75,"RaftState":"Leader","LastApplied":74,"LastCommittedTransactionTime":"2026-04-10 00:58:03.321","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":75,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.106","active":true,"matchIndex":74,"voting":true,"id":"member-1-shard-default-operational","nextIndex":75},{"timeSinceLastActivity":"00:00:00.107","active":true,"matchIndex":74,"voting":true,"id":"member-3-shard-default-operational","nextIndex":75}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"943.5 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":6,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":9,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":3,"InMemoryJournalDataSize":2219},"timestamp":1775782720,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.046224" elapsed="0.004312"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.045487" elapsed="0.005126"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.045399" elapsed="0.005275"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.053613" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.051121" elapsed="0.002539"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.050802" elapsed="0.002918"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.050762" elapsed="0.003015"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.054767" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.054138" elapsed="0.000676"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.055307" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.054972" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.055995" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.055685" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.055445" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.054931" elapsed="0.001251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.057177" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.056533" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.057773" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.057400" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.058439" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.058135" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.057912" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.057345" elapsed="0.001253"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:40.058962" elapsed="0.000549"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:40.060463" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.059930" elapsed="0.000593"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:40.060920" elapsed="0.002552"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:40.042816" elapsed="0.020773"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.063962" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:40.063735" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.063714" elapsed="0.000413"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:40.067781" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:40.064328" elapsed="0.003526"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:40.068062" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:58:40.068351" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:40.016508" elapsed="0.051871"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:40.068466" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:40.068728" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:40.015676" elapsed="0.053078"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.070099" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578272...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.069357" elapsed="0.000772"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:40.070178" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:40.070361" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578272...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:40.068986" elapsed="0.001402"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:40.070798" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 74, 'CommittedTransactionsCount': 6, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:40.070551" elapsed="0.000275"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:40.071221" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:40.070985" elapsed="0.000262"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:40.071295" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:40.071448" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:39.824142" elapsed="0.247331"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:40.071531" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:40.071704" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:39.823411" elapsed="0.248318"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.072101" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.071876" elapsed="0.000282"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:40.072392" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.072182" elapsed="0.000577"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.072934" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.072783" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.071856" elapsed="0.001152"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:39.823242" elapsed="0.249790"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.075608" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.075092" elapsed="0.000544"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:40.075683" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:40.075832" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:40.074743" elapsed="0.001113"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.147355" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.146973" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:40.148227" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:40.147965" elapsed="0.000342">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:40.148401" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:40.147620" elapsed="0.000806"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.148999" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:40.148611" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:40.149329" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:40.149503" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:40.149189" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.149955" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.149706" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.151046" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.150781" elapsed="0.000310"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.151523" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:40.151256" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.151902" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.152107" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.152282" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:40.151765" elapsed="0.000574"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.151622" elapsed="0.000746"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:40.152413" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:40.152591" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:40.150381" elapsed="0.002237"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.150076" elapsed="0.002574"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.152822" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.152674" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.150056" elapsed="0.002841"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.153470" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.153041" elapsed="0.000456"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:40.153548" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:40.146339" elapsed="0.007350"/>
</kw>
<msg time="2026-04-10T00:58:40.153744" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:40.133708" elapsed="0.020088"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.167969" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.180418" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.192802" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.193022" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.193349" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.193767" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.193621" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:40.193605" 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-04-10T00:58:40.193988" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.194157" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.194323" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:40.193554" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.193445" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.194587" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.194681" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:58:40.194929" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:40.129025" elapsed="0.065948"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:40.196810" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:40.196549" elapsed="0.000327">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:40.196967" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:40.196202" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.197328" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.197083" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.197894" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.197595" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.197409" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.197064" elapsed="0.000918"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.200364" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:40.198153" elapsed="0.002238"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:40.200463" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:40.200833" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:40.195669" elapsed="0.005209"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:40.202742" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:40.202473" elapsed="0.000332">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:40.202897" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:40.202134" elapsed="0.000788"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:40.203149" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:40.203014" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.202995" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.203407" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.203625" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.203731" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:58:40.205910" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:40.201601" elapsed="0.004356"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.208111" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.207843" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.208607" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.208331" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:40.227522" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01a1l7wam2dhg1d7al71x5srg20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:40.228527" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:40.229041" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:40.210804" elapsed="0.018299"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.208739" elapsed="0.020460"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.229635" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.229258" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.208720" elapsed="0.021108"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.237668" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.232186" elapsed="0.005820"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.231689" elapsed="0.006354"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.231645" elapsed="0.006422"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.240722" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.238352" elapsed="0.002416"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.238125" elapsed="0.002678"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.238107" elapsed="0.002720"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.241382" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.240993" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.241735" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.241479" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.242280" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.241982" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.241817" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.241460" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.242904" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.242523" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.243326" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.242999" elapsed="0.000390"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.243894" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.243597" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.243413" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.242981" elapsed="0.000997"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:40.244126" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:40.244967" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.244652" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:40.245148" elapsed="0.002318"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:40.230711" elapsed="0.016818"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.247749" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:40.247641" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.247620" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:40.256331" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:40.247989" elapsed="0.008372"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:40.256436" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:40.256773" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:40.206643" elapsed="0.050177"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:40.256911" elapsed="0.000061"/>
</return>
<msg time="2026-04-10T00:58:40.257263" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:40.104199" elapsed="0.153172"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.258436" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.257847" elapsed="0.000805"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.257827" elapsed="0.000906"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:40.258803" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:40.080167" elapsed="0.178783"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.075923" elapsed="0.183072"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.075906" elapsed="0.183113"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.259720" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:40.259590" elapsed="0.000176"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-10T00:58:40.259908" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:40.259788" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.259558" elapsed="0.000432"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.260136" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:58:40.260254" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:40.259303" elapsed="0.000977"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.260873" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.260447" elapsed="0.000453"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.261655" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.261061" elapsed="0.000621"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.268208" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.267688" elapsed="0.000625"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.269116" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.268597" 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-04-10T00:58:40.280696" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:40.280755" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:40 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:40 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-operational","LastIndex":74,"RaftState":"Follower","LastApplied":74,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:58:01.716","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"514.9 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":2135},"timestamp":1775782720,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:40.280980" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:40.272300" elapsed="0.008726"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.269391" elapsed="0.011691"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.281986" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.281122" elapsed="0.000960"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.269371" elapsed="0.012747"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.287073" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-2-shard-default-operational","LastIndex":74,"RaftState":"Follower","LastApplied":74,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-10 00:58:01.716","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"514.9 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":2135},"timestamp":1775782720,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.284443" elapsed="0.002691"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.284123" elapsed="0.003073"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.284083" elapsed="0.003172"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.290097" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.287727" elapsed="0.002417"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.287382" elapsed="0.002822"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.287342" elapsed="0.002920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.291207" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.290620" elapsed="0.000633"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.291872" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.291412" elapsed="0.000541"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.292547" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.292235" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.292015" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.291372" elapsed="0.001330"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.293634" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.293037" elapsed="0.000643"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.294184" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.293838" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.294867" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.294545" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.294321" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.293797" elapsed="0.001213"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:40.295337" elapsed="0.000545"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:40.296743" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.296244" elapsed="0.000544"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:40.297137" elapsed="0.003052"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:40.282961" elapsed="0.017361"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.300717" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:40.300475" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.300445" elapsed="0.000448"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:40.304401" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:40.301114" elapsed="0.003352"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:40.304645" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:58:40.304920" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:40.262632" elapsed="0.042316"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:40.305046" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:40.305200" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:40.261897" elapsed="0.043329"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.306588" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578272...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.305837" elapsed="0.000782"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:40.306668" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:40.306843" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177578272...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:40.305449" elapsed="0.001421"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:40.307252" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 74, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:40.307027" elapsed="0.000252"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:40.307729" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:40.307436" elapsed="0.000319"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:40.307803" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:40.307956" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:40.074118" elapsed="0.233865"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:40.308042" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:40.308187" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:40.073378" elapsed="0.234833"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:40.308507" elapsed="0.000208"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.308290" elapsed="0.000463"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.308923" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.308777" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.309255" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.309001" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.308273" elapsed="0.001055"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:40.073206" elapsed="0.236146"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:39.586030" elapsed="0.723351"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:58:40.309423" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:40.309643" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:58:40.309690" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:58:39.581904" elapsed="0.727809"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.310159" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:58:40.310235" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:40.309892" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.310580" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.310348" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.310330" elapsed="0.000329"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.312963" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:58:40.310796" elapsed="0.002215"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:58:40.313414" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:40.313222" elapsed="0.000218"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:58:40.313487" elapsed="0.000029"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:58:39.579245" elapsed="0.734418"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:58:39.578946" elapsed="0.734766"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:58:38.000320" elapsed="2.313424"/>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:58:37.999915" elapsed="2.313886"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.319009" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:40.318619" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.319508" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:40.319200" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:40.319600" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:40.319760" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:40.318135" elapsed="0.001650"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:58:40.319943" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.320612" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:40.320260" elapsed="0.000380"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.321048" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:40.320800" elapsed="0.000274"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.321461" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:40.321224" elapsed="0.000263"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.324403" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.323718" elapsed="0.000712"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:40.324477" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:40.324654" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:40.323355" elapsed="0.001324"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.395876" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.395479" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:40.396725" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:40.396446" elapsed="0.000357">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:40.396899" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:40.396071" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.397479" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:40.397097" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:40.397831" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:40.398053" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:40.397688" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.398487" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.398240" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.399516" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.399254" elapsed="0.000323"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.400015" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:40.399743" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.400368" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.400617" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.400795" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:40.400229" elapsed="0.000624"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.400092" elapsed="0.000792"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:40.400928" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:40.401090" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:40.398929" elapsed="0.002187"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.398630" elapsed="0.002517"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.401322" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.401173" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.398600" elapsed="0.002797"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.401997" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.401545" elapsed="0.000480"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:40.402073" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:40.394863" elapsed="0.007335"/>
</kw>
<msg time="2026-04-10T00:58:40.402258" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:40.382327" elapsed="0.019987"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.414916" elapsed="0.000028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.427402" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.439978" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.440200" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.440433" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.440858" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.440711" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:40.440696" 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-04-10T00:58:40.441239" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.441409" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.441622" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:40.440664" elapsed="0.001014"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.440529" elapsed="0.001176"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.441875" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.441969" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:58:40.442218" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:40.377520" elapsed="0.064743"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:40.444103" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:40.443851" elapsed="0.000318">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:40.444261" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:40.443487" elapsed="0.000799"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.444641" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.444377" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.445200" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.444899" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.444722" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.444359" elapsed="0.000923"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.447705" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:40.445453" elapsed="0.002278"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:40.447802" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:40.448105" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:40.442951" elapsed="0.005198"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:40.450042" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:40.449780" elapsed="0.000327">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:40.450198" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:40.449377" elapsed="0.000845"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:40.450450" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:40.450315" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.450296" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.450731" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.450924" elapsed="0.000147"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.451144" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:58:40.453349" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:40.448819" elapsed="0.004577"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.455619" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.455344" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.456091" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.455843" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:40.477237" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:40.478203" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:40.478774" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:40.458357" elapsed="0.020479"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.456221" elapsed="0.022714"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.479357" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.478998" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.456202" elapsed="0.023355"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.487559" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.482011" elapsed="0.005891"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.481474" elapsed="0.006464"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.481431" elapsed="0.006532"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.490589" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.488256" elapsed="0.002382"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.488026" elapsed="0.002666"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.488006" elapsed="0.002711"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.491298" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.490897" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.491651" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.491396" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.492194" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.491894" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.491732" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.491378" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.492815" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.492436" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.493142" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.492912" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.493688" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.493379" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.493221" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.492894" elapsed="0.000877"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:40.493924" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:40.494743" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.494431" elapsed="0.000373"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:40.494961" elapsed="0.002446"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:40.480462" elapsed="0.017010"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.497703" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:40.497591" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.497553" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:40.506106" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:40.497938" elapsed="0.008198"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:40.506211" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:58:40.506531" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:40.454212" elapsed="0.052393"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:40.506701" elapsed="0.000063"/>
</return>
<msg time="2026-04-10T00:58:40.507021" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:40.352908" elapsed="0.154243"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.508227" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:40.507628" elapsed="0.000806"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.507607" elapsed="0.000907"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:40.508602" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:40.329076" elapsed="0.179677"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.324749" elapsed="0.184051"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.324731" elapsed="0.184094"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:58:40.509523" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:58:40.509396" elapsed="0.000204"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:40.509661" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:40.509624" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.509379" elapsed="0.000343"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:40.509870" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:58:40.509992" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:40.509117" elapsed="0.000901"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.510621" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:40.510187" elapsed="0.000462"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.511397" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:40.510807" elapsed="0.000619"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.517948" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.517403" elapsed="0.000648"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:40.518847" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:40.518314" 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-04-10T00:58:42.805924" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:42.806163" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:42 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:42 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":213714,"InMemoryJournalLogSize":394,"ReplicatedToAllIndex":213714,"Leader":"member-2-shard-inventory-config","LastIndex":214108,"RaftState":"Follower","LastApplied":214108,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":214108,"LastLeadershipChangeTime":"2026-04-10 00:56:32.528","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"2.274 s","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":214108,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":592773},"timestamp":1775782722,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:42.806865" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:40.522001" elapsed="2.284973"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:40.519098" elapsed="2.288050"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.810981" elapsed="0.000240"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:42.807278" elapsed="0.004147"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:40.519079" elapsed="2.292457"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:42.820836" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":213714,"InMemoryJournalLogSize":394,"ReplicatedToAllIndex":213714,"Leader":"member-2-shard-inventory-config","LastIndex":214108,"RaftState":"Follower","LastApplied":214108,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":214108,"LastLeadershipChangeTime":"2026-04-10 00:56:32.528","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"2.274 s","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":214108,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":592773},"timestamp":1775782722,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:42.816231" elapsed="0.004848"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:42.815597" elapsed="0.005578"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:42.815498" elapsed="0.005770"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:42.825892" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:42.822102" elapsed="0.003862"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:42.821460" elapsed="0.004596"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:42.821399" elapsed="0.004742"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:42.827855" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:42.826859" elapsed="0.001065"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.828845" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:42.828249" elapsed="0.000751"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:42.829723" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:42.829365" elapsed="0.000385"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:42.829108" elapsed="0.000704"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:42.828179" elapsed="0.001689"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:42.830826" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:42.830210" elapsed="0.000663"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.831379" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:42.831035" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:42.832093" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:42.831770" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:42.831520" elapsed="0.000699"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:42.830993" elapsed="0.001292"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:42.832679" elapsed="0.000544"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:42.834150" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:42.833614" elapsed="0.000584"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:42.834631" elapsed="0.002622"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:42.813550" elapsed="0.023816"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:42.837847" elapsed="0.000056"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:42.837512" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:42.837491" elapsed="0.000525"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:42.841840" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:42.838245" elapsed="0.003662"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:42.842101" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:58:42.842426" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:40.512403" elapsed="2.330053"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:42.842584" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:42.842769" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:40.511683" elapsed="2.331119"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:42.844239" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782722, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:42.843460" elapsed="0.000810"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:42.844341" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:42.844591" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782722, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:42.843048" elapsed="0.001573"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:42.845035" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 214108, 'CommittedTransactionsCount': 0, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerIni...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:42.844784" elapsed="0.000279"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:42.845522" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:42.845242" elapsed="0.000312"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:42.845641" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:42.845803" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:40.322746" elapsed="2.523086"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:42.846032" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:42.846200" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:40.321955" elapsed="2.524271"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:42.846579" elapsed="0.000204"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:42.846312" elapsed="0.000509"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.847019" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:42.846846" elapsed="0.000257"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.847284" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:42.847131" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:42.846295" elapsed="0.001063"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:40.321765" elapsed="2.525619"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:42.850401" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:42.849857" elapsed="0.000571"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:42.850474" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:58:42.850675" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:42.849414" elapsed="0.001286"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:42.930234" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:42.929732" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:42.931140" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:42.930836" elapsed="0.000419">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:42.931514" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:42.930456" elapsed="0.001101"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:42.932426" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:42.931827" elapsed="0.000640"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:42.932949" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:42.933176" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:42.932737" elapsed="0.000477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:42.933847" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:42.933450" 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-04-10T00:58:42.935560" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:42.935159" elapsed="0.000490"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:42.936320" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:42.935894" 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-04-10T00:58:42.936901" 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-04-10T00:58:42.937226" 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-04-10T00:58:42.937491" elapsed="0.000032"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:42.936690" elapsed="0.000912"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:42.936443" elapsed="0.001209"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:42.937731" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:58:42.937995" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:42.934663" elapsed="0.003375"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:42.934119" elapsed="0.003967"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.938411" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:42.938124" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:42.934027" elapsed="0.004501"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:42.939332" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:42.938769" elapsed="0.000591"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:42.939409" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:42.928965" elapsed="0.010624"/>
</kw>
<msg time="2026-04-10T00:58:42.939652" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:42.914834" elapsed="0.024877"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.952739" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.966141" elapsed="0.000101"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.979902" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.980268" 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-04-10T00:58:42.980488" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.981113" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:42.980898" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:42.980868" 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-04-10T00:58:42.981374" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.981544" elapsed="0.000038"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.981733" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:42.980817" elapsed="0.000969"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:42.980656" elapsed="0.001162"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.982053" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:42.982170" elapsed="0.000024"/>
</return>
<msg time="2026-04-10T00:58:42.982514" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:42.909925" elapsed="0.072672"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:42.985157" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:42.984803" elapsed="0.000446">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:42.985348" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:42.984328" elapsed="0.001049"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.985828" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:42.985484" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:42.986459" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:42.986145" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:42.985945" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:42.985463" elapsed="0.001085"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:42.989058" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:42.986743" elapsed="0.002343"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:42.989166" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:58:42.989498" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:42.983600" elapsed="0.005948"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:42.991537" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:42.991254" elapsed="0.000377">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:42.991823" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:42.990868" elapsed="0.000988"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:42.992116" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:58:42.991960" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:42.991938" elapsed="0.000265"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.992386" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:42.992635" elapsed="0.000029"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:42.992735" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:58:42.997028" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:42.990276" elapsed="0.006837"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.000006" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:42.999645" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.000719" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.000427" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:43.016229" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:43.017276" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:43.017874" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:43.003164" elapsed="0.014774"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.000877" elapsed="0.017174"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.018608" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.018123" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.000847" elapsed="0.017981"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.025983" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.021455" elapsed="0.004905"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.020935" elapsed="0.005472"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.020890" elapsed="0.005546"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.029267" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.026798" elapsed="0.002516"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.026510" elapsed="0.002839"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.026487" elapsed="0.002886"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.030019" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.029594" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.030367" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.030123" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.030945" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.030635" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.030450" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.030104" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.031574" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.031191" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.031960" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.031676" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.032524" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.032219" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.032051" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.031657" elapsed="0.000972"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:43.032790" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:43.033642" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.033314" elapsed="0.000355"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.033829" elapsed="0.002425"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:43.019892" elapsed="0.016435"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.036593" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:43.036456" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.036436" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:43.045375" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:43.036837" elapsed="0.008570"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:43.045483" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:58:43.045834" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:42.998290" elapsed="0.047591"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.045972" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:58:43.046292" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:42.880449" elapsed="0.165952"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.047491" elapsed="0.000087"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.046880" elapsed="0.000836"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.046860" elapsed="0.000936"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.047868" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:42.855508" elapsed="0.192509"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:42.850772" elapsed="0.197289"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:42.850754" elapsed="0.197331"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:58:43.048874" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:43.048745" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.048995" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:43.048958" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.048727" elapsed="0.000330"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.049206" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:58:43.049325" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:43.048434" elapsed="0.000917"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.049948" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.049520" elapsed="0.000455"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.050699" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.050133" elapsed="0.000594"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.057534" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.057009" elapsed="0.000653"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.058452" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.057932" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:43.070478" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:43.070543" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:43 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":5003,"SnapshotIndex":214107,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":214107,"Leader":"member-2-shard-inventory-config","LastIndex":214108,"RaftState":"Leader","LastApplied":214108,"LastCommittedTransactionTime":"2026-04-10 00:58:29.866","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":214108,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.260","active":true,"matchIndex":214108,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":214109},{"timeSinceLastActivity":"00:00:00.187","active":true,"matchIndex":214108,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":214109}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"547.0 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":3,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":214108,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10006,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":592773},"timestamp":1775782723,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:43.070786" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:43.061635" elapsed="0.009198"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.058730" elapsed="0.012164"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.071717" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.070936" elapsed="0.000877"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.058710" elapsed="0.013176"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.078735" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":5003,"SnapshotIndex":214107,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":214107,"Leader":"member-2-shard-inventory-config","LastIndex":214108,"RaftState":"Leader","LastApplied":214108,"LastCommittedTransactionTime":"2026-04-10 00:58:29.866","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":214108,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.260","active":true,"matchIndex":214108,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":214109},{"timeSinceLastActivity":"00:00:00.187","active":true,"matchIndex":214108,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":214109}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"547.0 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":3,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":214108,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10006,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":592773},"timestamp":1775782723,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.074941" elapsed="0.003887"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.074463" elapsed="0.004454"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.074405" elapsed="0.004595"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.082662" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.079660" elapsed="0.003058"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.079179" elapsed="0.003603"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.079122" elapsed="0.003722"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.083848" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.083202" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.084418" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.084066" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.085206" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.084811" elapsed="0.000424"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.084577" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.084022" elapsed="0.001334"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.086365" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.085725" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.086981" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.086603" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.087714" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.087353" elapsed="0.000389"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.087127" elapsed="0.000679"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.086539" elapsed="0.001325"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:43.088206" elapsed="0.000556"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:43.089757" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.089211" elapsed="0.000596"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.090184" elapsed="0.002654"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:43.072894" elapsed="0.020068"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.093425" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:43.093161" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.093139" elapsed="0.000476"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:43.097334" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:43.093818" elapsed="0.003585"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:43.097633" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:58:43.097922" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:43.051691" elapsed="0.046262"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.098028" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:58:43.098204" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:43.050943" elapsed="0.047291"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.099676" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782723, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.098895" elapsed="0.000812"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:43.099758" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:43.099943" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782723, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:43.098497" elapsed="0.001474"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:43.100554" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 214108, 'CommittedTransactionsCount': 3, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.100132" elapsed="0.000512"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:43.101054" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.100810" elapsed="0.000271"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:43.101129" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:43.101329" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:42.848754" elapsed="0.252604"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:43.101428" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:43.101609" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:42.847791" elapsed="0.253844"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.101942" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.101719" elapsed="0.000281"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.102239" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.102024" elapsed="0.000446"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.102662" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.102495" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.101701" elapsed="0.001039"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:42.847613" elapsed="0.255151"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.105626" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.104923" elapsed="0.000732"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:43.105703" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:43.105855" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:43.104502" elapsed="0.001377"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.179903" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.179449" elapsed="0.000488"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.180874" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:43.180605" elapsed="0.000347">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:43.181046" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:43.180235" elapsed="0.000837"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.181647" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:43.181240" elapsed="0.000434"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.181988" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:43.182197" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:43.181842" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.182701" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.182389" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.183854" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.183581" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.184334" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.184064" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.184722" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.184928" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.185106" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:43.184581" elapsed="0.000582"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.184418" elapsed="0.000777"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:43.185245" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:58:43.185412" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:43.183184" elapsed="0.002254"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.182836" elapsed="0.002634"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.185660" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.185495" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.182810" elapsed="0.002927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.186320" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.185883" elapsed="0.000465"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.186395" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:43.178724" elapsed="0.007795"/>
</kw>
<msg time="2026-04-10T00:58:43.186595" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:43.165676" elapsed="0.021014"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.199627" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.212094" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.224669" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.224924" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.225127" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.225532" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.225383" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:43.225368" elapsed="0.000274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.225785" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.225954" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.226120" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:43.225336" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.225227" elapsed="0.000972"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.226369" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.226463" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:58:43.226745" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:43.160771" elapsed="0.066020"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.228773" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:43.228488" elapsed="0.000356">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:43.228937" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:43.228136" elapsed="0.000825"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.229313" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.229055" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.229893" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.229591" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.229394" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.229035" elapsed="0.000940"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.232361" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:43.230150" elapsed="0.002238"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:43.232460" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:43.232787" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:43.227573" elapsed="0.005260"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.234756" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:43.234445" elapsed="0.000376">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:43.234914" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:43.234104" elapsed="0.000834"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:43.235169" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:43.235032" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.235012" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.235536" elapsed="0.000066"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.235793" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.235876" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:58:43.238095" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:43.233540" elapsed="0.004606"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.240282" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.240019" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.240775" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.240505" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:43.264235" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01a1l7wam2dhg1d7al71x5srg20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:43.264692" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:43.264907" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:43.243019" elapsed="0.021915"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.240907" elapsed="0.024072"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.265164" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.265006" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.240887" elapsed="0.024362"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.269054" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.266324" elapsed="0.003064"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.266100" elapsed="0.003325"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.266078" elapsed="0.003372"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.272239" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.269756" elapsed="0.002530"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.269508" elapsed="0.002813"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.269491" elapsed="0.002855"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.272931" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.272521" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.273440" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.273198" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.274013" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.273709" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.273522" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.273177" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.274636" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.274257" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.274967" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.274734" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.275503" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.275208" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.275047" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.274716" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:43.275757" elapsed="0.000375"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:43.276616" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.276300" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.276800" elapsed="0.002442"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:43.265665" elapsed="0.013642"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.279511" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:43.279403" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.279383" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:43.288167" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:43.279773" elapsed="0.008425"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:43.288303" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:58:43.288660" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:43.238874" elapsed="0.049834"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.288801" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:58:43.289121" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:43.135393" elapsed="0.153837"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.290323" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.289712" elapsed="0.000824"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.289692" elapsed="0.000944"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.290710" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:43.110523" elapsed="0.180341"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.105948" elapsed="0.184961"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.105931" elapsed="0.185003"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:58:43.291655" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:43.291508" elapsed="0.000208"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.291777" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:43.291740" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.291490" elapsed="0.000349"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.291992" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:58:43.292117" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:43.291226" elapsed="0.000917"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.292795" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.292319" elapsed="0.000503"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.293529" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.292980" elapsed="0.000603"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.300106" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.299554" elapsed="0.000654"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.301067" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.300525" 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-04-10T00:58:43.312533" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:43.312747" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:43 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":214107,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":214107,"Leader":"member-2-shard-inventory-config","LastIndex":214108,"RaftState":"Follower","LastApplied":214108,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","LastLogIndex":214108,"LastLeadershipChangeTime":"2026-04-10 00:58:02.216","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"686.9 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":214108,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":581775},"timestamp":1775782723,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:43.313060" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:43.304160" elapsed="0.008963"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.301327" elapsed="0.011877"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.314345" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.313260" elapsed="0.001217"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.301307" elapsed="0.013220"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.321555" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":214107,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":214107,"Leader":"member-2-shard-inventory-config","LastIndex":214108,"RaftState":"Follower","LastApplied":214108,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","LastLogIndex":214108,"LastLeadershipChangeTime":"2026-04-10 00:58:02.216","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"686.9 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":214108,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":581775},"timestamp":1775782723,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.317885" elapsed="0.003989"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.317416" elapsed="0.004545"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.317360" elapsed="0.004685"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.325752" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.322705" elapsed="0.003093"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.322225" elapsed="0.003635"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.322167" elapsed="0.003752"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.326941" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.326272" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.327488" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.327150" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.328184" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.327872" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.327646" elapsed="0.000625"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.327108" elapsed="0.001221"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.329305" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.328687" elapsed="0.000665"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.329866" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.329513" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.330530" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.330228" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.330006" elapsed="0.000627"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.329472" elapsed="0.001216"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:43.331023" elapsed="0.000515"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:43.332470" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.331975" elapsed="0.000541"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.332890" elapsed="0.002518"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:43.315708" elapsed="0.019798"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.335894" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:43.335672" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.335651" elapsed="0.000404"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:43.339538" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:43.336257" elapsed="0.003364"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:43.339786" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:58:43.340062" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:43.294520" elapsed="0.045570"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.340199" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:43.340354" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:43.293803" elapsed="0.046577"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.341837" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782723, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.340992" elapsed="0.000874"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:43.341915" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:43.342089" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782723, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:43.340624" elapsed="0.001493"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:43.342502" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 214108, 'CommittedTransactionsCount': 0, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerIni...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.342274" elapsed="0.000255"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:43.342941" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.342705" elapsed="0.000262"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:43.343014" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:43.343166" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:43.103899" elapsed="0.239291"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:43.343247" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:58:43.343395" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:43.103140" elapsed="0.240279"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.343736" elapsed="0.000191"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.343499" elapsed="0.000467"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.344135" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.343989" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.344354" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.344212" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.343482" elapsed="0.000944"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:43.102963" elapsed="0.241487"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:40.321537" elapsed="3.022946"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:58:43.344528" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:43.344752" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:58:43.344798" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:58:40.317401" elapsed="3.027421"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.345289" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:58:43.345367" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:43.344999" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.345693" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.345459" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.345442" elapsed="0.000330"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.347992" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:58:43.345909" elapsed="0.002131"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:58:43.348450" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.348261" elapsed="0.000215"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:58:43.348523" 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="PASS" start="2026-04-10T00:58:40.314835" elapsed="3.033864"/>
</kw>
<var name="${shard_name}">inventory</var>
<status status="PASS" start="2026-04-10T00:58:40.314613" elapsed="3.034134"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.353153" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:43.352773" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.353686" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:43.353365" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:43.353757" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:43.353912" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:43.352384" elapsed="0.001552"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:58:43.354091" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.354757" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:43.354407" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.355180" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:43.354943" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.355604" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:43.355353" elapsed="0.000278"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.358251" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.357763" elapsed="0.000515"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:43.358324" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:43.358471" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:43.357373" elapsed="0.001123"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.430671" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.430201" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.431699" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:43.431337" elapsed="0.000465">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:43.431917" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:43.430913" elapsed="0.001034"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.432578" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:43.432159" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.432969" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:43.433151" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:43.432788" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.433723" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.433455" 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-04-10T00:58:43.434862" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.434556" elapsed="0.000351"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.435345" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.435073" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.435730" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.435943" elapsed="0.000031"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.436132" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:43.435589" elapsed="0.000612"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.435427" elapsed="0.000806"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:43.436284" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:58:43.436455" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:43.434228" elapsed="0.002252"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.433919" elapsed="0.002593"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.436720" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.436537" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.433893" elapsed="0.002906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.437389" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.436948" elapsed="0.000468"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.437463" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:43.429577" elapsed="0.008030"/>
</kw>
<msg time="2026-04-10T00:58:43.437663" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:43.416389" elapsed="0.021326"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.450366" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.462930" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.475543" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.475789" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.476004" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.476410" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.476260" elapsed="0.000249"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:43.476245" elapsed="0.000290"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.476707" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.476881" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.477050" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:43.476214" elapsed="0.000889"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.476106" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.477300" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.477396" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:58:43.477675" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:43.411641" elapsed="0.066080"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.479666" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:43.479324" elapsed="0.000412">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:43.479829" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:43.478975" elapsed="0.000878"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.480222" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.479956" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.480813" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.480487" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.480305" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.479931" elapsed="0.000966"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.483245" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:43.481069" elapsed="0.002203"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:43.483345" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:43.483705" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:43.478403" elapsed="0.005359"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.485831" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:43.485527" elapsed="0.000369">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:43.485989" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:43.485171" elapsed="0.000842"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:43.486246" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:43.486108" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.486089" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.486508" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.486753" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.486838" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:58:43.489079" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:43.484463" elapsed="0.004719"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.491278" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.491018" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.491818" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.491498" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:43.512304" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:43.513261" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:43.513741" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:43.494038" elapsed="0.019765"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.491951" elapsed="0.021950"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.514307" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.513960" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.491931" elapsed="0.022567"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.520825" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.516965" elapsed="0.004312"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.516437" elapsed="0.004890"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.516394" elapsed="0.004967"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.525058" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.521773" elapsed="0.003350"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.521438" elapsed="0.003722"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.521415" elapsed="0.003769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.525756" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.525353" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.526089" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.525853" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.526649" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.526330" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.526170" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.525834" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.527250" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.526890" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.527595" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.527346" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.528130" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.527837" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.527677" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.527328" elapsed="0.001124"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:43.528628" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:43.529435" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.529144" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.529634" elapsed="0.003965"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:43.515377" elapsed="0.018287"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.533888" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:43.533778" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.533757" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:43.542202" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:43.534123" elapsed="0.008110"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:43.542308" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:58:43.542653" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:43.489897" elapsed="0.052806"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.542796" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:58:43.543116" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:43.386681" elapsed="0.156544"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.544300" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.543703" elapsed="0.000839"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.543684" elapsed="0.000954"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.544710" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:43.362711" elapsed="0.182147"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.358591" elapsed="0.186310"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.358551" elapsed="0.186374"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:58:43.545769" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:43.545640" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.545890" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:43.545852" elapsed="0.000077"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.545623" elapsed="0.000328"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.546099" elapsed="0.000023"/>
</kw>
<msg time="2026-04-10T00:58:43.546220" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:43.545205" elapsed="0.001041"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.546849" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.546418" elapsed="0.000459"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.547611" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.547035" elapsed="0.000606"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.554182" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.553662" elapsed="0.000623"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.555076" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.554552" 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-04-10T00:58:43.564766" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:43.564872" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:43 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:56:42.525","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"614.3 μs","CurrentTerm":7,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782723,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:43.565095" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:43.558275" elapsed="0.006892"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.555327" elapsed="0.009920"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.566368" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.565303" elapsed="0.001196"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.555307" elapsed="0.011246"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.573442" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:56:42.525","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"614.3 μs","CurrentTerm":7,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782723,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.569817" elapsed="0.003780"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.569352" elapsed="0.004343"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.569296" elapsed="0.004499"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.576734" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.574333" elapsed="0.002447"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.573973" elapsed="0.002866"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.573917" elapsed="0.002980"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.577877" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.577259" elapsed="0.000665"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.578420" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.578082" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.579270" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.578954" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.578637" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.578043" elapsed="0.001372"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.580356" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.579774" elapsed="0.000628"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.580916" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.580579" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.581652" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.581330" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.581053" elapsed="0.000686"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.580521" elapsed="0.001273"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:43.582132" elapsed="0.000553"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:43.583542" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.583049" elapsed="0.000557"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.583962" elapsed="0.002575"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:43.567729" elapsed="0.019003"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.587112" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:43.586882" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.586859" elapsed="0.000416"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:43.590993" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:43.587486" elapsed="0.003570"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:43.591217" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:58:43.591496" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:43.548626" elapsed="0.042898"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.591603" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:43.591755" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:43.547857" elapsed="0.043924"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.593139" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782723, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.592414" elapsed="0.000753"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:43.593295" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:43.593478" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782723, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:43.592019" elapsed="0.001487"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:43.593915" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.593686" elapsed="0.000257"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:43.594337" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.594102" elapsed="0.000261"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:43.594410" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:43.594623" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:43.356778" elapsed="0.237872"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:43.594708" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:43.594856" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:43.356052" elapsed="0.238828"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.595179" elapsed="0.000191"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.594961" elapsed="0.000446"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.595595" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.595431" elapsed="0.000219"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.595818" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.595674" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.594943" elapsed="0.000947"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:43.355883" elapsed="0.240031"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.598704" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.598001" elapsed="0.000731"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:43.598778" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:43.598924" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:43.597656" elapsed="0.001293"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.686313" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.685891" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.687278" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:43.686960" elapsed="0.000415">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:43.687488" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:43.686535" elapsed="0.000982"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.688110" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:43.687710" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.688473" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:43.688661" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:43.688302" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.689183" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.688913" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.690301" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.690003" elapsed="0.000345"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.690811" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.690515" elapsed="0.000323"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.691253" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.691463" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.691660" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:43.691110" elapsed="0.000609"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.690955" elapsed="0.000796"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:43.691799" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:58:43.691969" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:43.689660" elapsed="0.002334"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.689312" elapsed="0.002714"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.692205" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.692051" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.689287" elapsed="0.002996"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.692910" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.692429" elapsed="0.000510"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.692990" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:43.685224" elapsed="0.007896"/>
</kw>
<msg time="2026-04-10T00:58:43.693175" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:43.671355" elapsed="0.021875"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.706860" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.721185" elapsed="0.000131"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.739955" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.740221" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.740430" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.741105" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.740944" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:43.740924" elapsed="0.000267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.741338" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.741508" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.741702" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:43.740878" elapsed="0.000879"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.740740" elapsed="0.001047"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.741961" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.742062" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:58:43.742379" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:43.666351" elapsed="0.076077"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.744577" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:43.744228" elapsed="0.000438">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:43.744763" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:43.743787" 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-04-10T00:58:43.745158" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.744882" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.745750" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.745425" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.745238" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.744862" elapsed="0.000972"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.748238" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:43.746007" elapsed="0.002257"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:43.748336" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:58:43.748668" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:43.743144" elapsed="0.005570"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.750517" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:43.750273" elapsed="0.000325">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:43.750695" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:43.749935" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:43.750948" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:43.750812" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.750792" elapsed="0.000240"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.751210" elapsed="0.000151"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.751532" elapsed="0.000025"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.751671" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:58:43.753910" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:43.749376" elapsed="0.004580"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.756115" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.755812" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.756603" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.756337" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:43.777413" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:43.778366" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:43.778836" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:43.758885" elapsed="0.020013"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.756735" elapsed="0.022260"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.779402" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.779054" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.756716" elapsed="0.022914"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.786511" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.782048" elapsed="0.004808"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.781515" elapsed="0.005377"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.781474" elapsed="0.005442"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.789549" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.787198" elapsed="0.002411"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.786973" elapsed="0.002671"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.786956" elapsed="0.002712"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.790217" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.789832" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.790554" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.790314" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.791111" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.790811" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.790650" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.790296" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.791730" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.791352" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.792156" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.791826" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.792798" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.792405" elapsed="0.000420"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.792241" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.791808" elapsed="0.001075"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:43.793034" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:43.793866" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.793552" elapsed="0.000340"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.794047" elapsed="0.002499"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:43.780528" elapsed="0.016733"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.797468" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:43.797359" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.797339" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:43.805972" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:43.797728" elapsed="0.008274"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:43.806077" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:58:43.806388" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:43.754666" elapsed="0.051769"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.806525" elapsed="0.000089"/>
</return>
<msg time="2026-04-10T00:58:43.806874" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:43.628886" elapsed="0.178100"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.808053" elapsed="0.000072"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.807443" elapsed="0.000829"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.807423" elapsed="0.000930"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.808424" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:43.603274" elapsed="0.205319"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.599016" elapsed="0.209624"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.598998" elapsed="0.209667"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:58:43.809525" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:58:43.809395" elapsed="0.000211"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.809668" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:43.809630" elapsed="0.000077"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.809377" elapsed="0.000352"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.809878" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:58:43.809998" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:43.809004" elapsed="0.001020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.810617" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.810195" elapsed="0.000450"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.811349" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.810802" elapsed="0.000577"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.817958" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.817418" elapsed="0.000643"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.818862" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.818327" 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-04-10T00:58:43.829946" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:43.830025" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:43 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:56:42.508","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.168","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.168","active":true,"matchIndex":-1,"voting":true,"id":"member-3-shard-topology-config","nextIndex":0}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.108 ms","CurrentTerm":7,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782723,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:43.830332" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:43.821956" elapsed="0.008441"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.819117" elapsed="0.011362"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.831843" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.830534" elapsed="0.001467"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.819098" elapsed="0.012960"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.839174" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Leader","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:56:42.508","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.168","active":true,"matchIndex":-1,"voting":true,"id":"member-1-shard-topology-config","nextIndex":0},{"timeSinceLastActivity":"00:00:00.168","active":true,"matchIndex":-1,"voting":true,"id":"member-3-shard-topology-config","nextIndex":0}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.108 ms","CurrentTerm":7,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":0},"timestamp":1775782723,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.835478" elapsed="0.003780"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.835027" elapsed="0.004317"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.834970" elapsed="0.004456"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.843173" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.840076" elapsed="0.003144"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.839626" elapsed="0.003657"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.839550" elapsed="0.003792"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.844304" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.843706" elapsed="0.000646"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.844868" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.844513" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.845581" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.845229" elapsed="0.000380"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.845006" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.844472" elapsed="0.001253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.846780" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.846155" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.847332" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.846999" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.848011" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.847711" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.847470" elapsed="0.000627"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.846957" elapsed="0.001196"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:43.848485" elapsed="0.000540"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:43.850035" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.849426" elapsed="0.000656"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.850435" elapsed="0.002495"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:43.833369" elapsed="0.019658"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.853387" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:43.853172" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.853152" elapsed="0.000481"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:43.857073" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:43.853841" elapsed="0.003295"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:43.857472" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:43.857880" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:43.812350" elapsed="0.045559"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.857970" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:43.858120" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:43.811629" elapsed="0.046517"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.859433" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782723, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.858755" elapsed="0.000706"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:43.859510" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:43.859702" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782723, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:43.858370" elapsed="0.001359"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:43.860113" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.859888" elapsed="0.000252"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:43.860527" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.860296" elapsed="0.000261"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:43.860618" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:43.860772" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:43.596992" elapsed="0.263805"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:43.860854" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:43.861003" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:43.596252" elapsed="0.264775"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.861324" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.861108" elapsed="0.000273"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.861718" elapsed="0.000199"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.861404" elapsed="0.000550"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.862126" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.861978" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.861091" elapsed="0.001108"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:43.596082" elapsed="0.266141"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.864740" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.864237" elapsed="0.000531"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:43.864813" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:43.864958" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:43.863899" elapsed="0.001083"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.935505" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.935130" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.936335" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:43.936100" elapsed="0.000308">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:43.936502" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:43.935718" elapsed="0.000808"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.937095" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:43.936713" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.937424" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:43.937592" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:43.937284" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.938019" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.937777" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.939125" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.938772" elapsed="0.000400"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.939630" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:43.939338" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.939989" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.940195" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.940371" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:43.939851" elapsed="0.000576"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.939710" elapsed="0.000746"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:43.940500" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:43.940676" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:43.938428" elapsed="0.002274"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.938133" elapsed="0.002602"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.940909" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.940759" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.938114" elapsed="0.002870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.941572" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:43.941126" elapsed="0.000476"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:43.941650" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:43.934476" elapsed="0.007297"/>
</kw>
<msg time="2026-04-10T00:58:43.941827" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:43.921946" elapsed="0.019932"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.954609" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.966913" elapsed="0.000090"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.979170" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.979582" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.979816" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.980207" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.980062" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:43.980048" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.980429" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.980618" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.980789" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:43.980017" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.979912" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.981035" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.981128" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:58:43.981376" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:43.917180" elapsed="0.064241"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.983228" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:43.982985" elapsed="0.000307">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:43.983384" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:43.982645" elapsed="0.000763"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.983792" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:43.983500" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.984334" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:43.984037" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.983873" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.983481" elapsed="0.000934"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.986762" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:43.984608" elapsed="0.002180"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:43.986859" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:43.987155" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:43.982094" elapsed="0.005105"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:43.989087" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:43.988848" elapsed="0.000301">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:43.989241" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:43.988470" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:43.989492" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:43.989358" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.989339" elapsed="0.000256"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.989772" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:43.989964" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:43.990046" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:58:43.992336" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:43.987936" elapsed="0.004446"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.994466" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.994205" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:43.994949" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:43.994702" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:44.018919" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01a1l7wam2dhg1d7al71x5srg20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:44.019850" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:44.020364" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:43.997206" elapsed="0.023223"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.995078" elapsed="0.025448"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.020966" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.020618" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.995059" elapsed="0.026103"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.029384" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.023508" elapsed="0.006213"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.023012" elapsed="0.006745"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.022970" elapsed="0.006812"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.032381" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.030064" elapsed="0.002364"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.029838" elapsed="0.002627"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.029821" elapsed="0.002695"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.033071" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.032699" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.033402" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.033168" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.033959" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.033661" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.033483" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.033150" elapsed="0.000891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.034570" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.034201" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.034901" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.034669" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.035433" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.035141" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.034982" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.034651" elapsed="0.000864"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:44.035680" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:44.036477" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.036202" elapsed="0.000301"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.036705" elapsed="0.002429"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:44.022044" elapsed="0.017153"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.039395" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:44.039291" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.039271" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:44.047775" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:44.039667" elapsed="0.008138"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:44.047878" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:44.048184" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:43.993106" elapsed="0.055123"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.048318" elapsed="0.000059"/>
</return>
<msg time="2026-04-10T00:58:44.048655" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:43.892487" elapsed="0.156310"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.049842" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.049245" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.049225" elapsed="0.000891"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.050186" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:43.869224" elapsed="0.181110"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:43.865049" elapsed="0.185329"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:43.865032" elapsed="0.185370"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:58:44.051094" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:44.050968" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.051213" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:44.051177" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.050951" elapsed="0.000324"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.051420" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:58:44.051538" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:44.050703" elapsed="0.000878"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.052151" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.051751" elapsed="0.000427"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.052928" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.052332" elapsed="0.000624"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.059551" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.059030" elapsed="0.000642"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.060450" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.059937" 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-04-10T00:58:44.070651" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:44.070733" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:44 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:58:01.719","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"564.7 μs","CurrentTerm":7,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782724,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:44.071049" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:44.063603" elapsed="0.007510"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.060766" elapsed="0.010426"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.072326" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.071247" elapsed="0.001210"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.060746" elapsed="0.011760"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.079144" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":-1,"InMemoryJournalLogSize":0,"ReplicatedToAllIndex":-1,"Leader":"member-2-shard-topology-config","LastIndex":-1,"RaftState":"Follower","LastApplied":-1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-topology-config","LastLogIndex":-1,"LastLeadershipChangeTime":"2026-04-10 00:58:01.719","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"564.7 μs","CurrentTerm":7,"LastTerm":-1,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":-1,"StatRetrievalError":null,"CommitIndex":-1,"SnapshotTerm":-1,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":0},"timestamp":1775782724,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.075912" elapsed="0.003336"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.075443" elapsed="0.003869"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.075386" elapsed="0.003985"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.082196" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.079842" elapsed="0.002400"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.079500" elapsed="0.002802"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.079459" elapsed="0.002902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.083403" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.082812" elapsed="0.000638"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.083967" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.083631" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.084656" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.084331" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.084104" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.083589" elapsed="0.001208"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.085775" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.085135" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.086315" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.085984" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.086991" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.086692" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.086453" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.085943" elapsed="0.001189"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:44.087459" elapsed="0.000558"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:44.088882" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.088380" elapsed="0.000548"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.089287" elapsed="0.002513"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:44.073830" elapsed="0.018070"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.092267" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:44.092039" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.092019" elapsed="0.000407"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:44.095924" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:44.092750" elapsed="0.003238"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:44.096149" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:44.096421" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:44.053923" elapsed="0.042525"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.096506" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:44.096737" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775782...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:44.053174" elapsed="0.043590"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.098071" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782724, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.097346" elapsed="0.000753"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:44.098182" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:44.098360" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782724, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:44.096984" elapsed="0.001403"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:44.098783" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': -1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.098546" elapsed="0.000265"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:44.099200" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.098966" elapsed="0.000260"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:44.099273" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:44.099423" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:43.863288" elapsed="0.236159"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:44.099503" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:44.099670" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:43.862577" elapsed="0.237118"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.099988" elapsed="0.000194"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.099774" elapsed="0.000446"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.100389" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.100243" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.100660" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.100465" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.099757" elapsed="0.000979"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:43.862390" elapsed="0.238370"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:43.355682" elapsed="0.745108"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:58:44.100832" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:44.101036" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:58:44.101082" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:58:43.351678" elapsed="0.749427"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.101790" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:58:44.101866" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:44.101472" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.102171" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.101959" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.101941" elapsed="0.000306"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.106007" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:58:44.102525" elapsed="0.003530"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:58:44.106412" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.106224" elapsed="0.000213"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:58:44.106483" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:58:43.349064" elapsed="0.757590"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-10T00:58:43.348839" elapsed="0.757862"/>
</iter>
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.111127" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:44.110744" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.111697" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:44.111365" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:44.111768" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:44.111922" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:44.110353" elapsed="0.001593"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:58:44.112102" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.112766" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:44.112416" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.113187" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:44.112951" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.113609" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:44.113360" elapsed="0.000276"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.116248" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.115756" elapsed="0.000518"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:44.116320" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:44.116617" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:44.115397" elapsed="0.001246"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.187452" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.187069" elapsed="0.000411"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.188226" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:44.188000" elapsed="0.000296">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:44.188388" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:44.187666" elapsed="0.000746"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.188976" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:44.188595" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.189298" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:44.189440" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.189165" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.189881" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.189638" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.190878" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.190621" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.191394" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.191126" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.191754" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.191957" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.192130" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:44.191617" elapsed="0.000606"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.191468" elapsed="0.000786"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:44.192297" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:44.192455" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:44.190282" elapsed="0.002198"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.189994" elapsed="0.002517"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.192702" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.192535" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.189975" elapsed="0.002803"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.193346" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.192921" elapsed="0.000452"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.193421" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:44.186415" elapsed="0.007133"/>
</kw>
<msg time="2026-04-10T00:58:44.193617" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:44.173773" elapsed="0.019896"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.206227" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.218773" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.231413" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.231684" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.231883" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.232271" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.232126" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:44.232112" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.232489" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.232677" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.232844" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:44.232082" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.231976" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.233100" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.233230" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:58:44.233483" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:44.169104" elapsed="0.064425"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.235351" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:44.235111" elapsed="0.000304">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:44.235506" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:44.234769" 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-04-10T00:58:44.235910" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.235660" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.236454" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.236159" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.235992" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.235640" elapsed="0.000896"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.238891" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:44.236730" elapsed="0.002188"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:44.238989" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:44.239290" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:44.234216" elapsed="0.005119"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.241177" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:44.240938" elapsed="0.000302">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:44.241332" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:44.240599" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:44.241602" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:44.241449" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.241429" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.241864" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.242055" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.242140" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:58:44.244371" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:44.240036" elapsed="0.004382"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.246523" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.246269" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.247016" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.246767" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:44.266044" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:44.267079" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:44.267518" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:44.249301" elapsed="0.018310"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.247146" elapsed="0.020563"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.268149" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.267768" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.247126" elapsed="0.021220"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.274828" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.270759" elapsed="0.004411"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.270228" elapsed="0.004978"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.270186" elapsed="0.005045"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.277876" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.275516" elapsed="0.002406"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.275288" elapsed="0.002668"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.275271" elapsed="0.002709"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.278520" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.278145" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.278874" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.278637" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.279421" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.279118" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.278956" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.278618" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.280040" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.279681" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.280410" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.280136" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.280964" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.280668" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.280492" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.280118" elapsed="0.000927"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:44.281194" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:44.281996" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.281719" elapsed="0.000302"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.282181" elapsed="0.002347"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:44.269256" elapsed="0.015358"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.284816" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:44.284709" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.284688" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:44.293269" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:44.285050" elapsed="0.008249"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:44.293373" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:44.293710" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:44.245156" elapsed="0.048601"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.293849" elapsed="0.000060"/>
</return>
<msg time="2026-04-10T00:58:44.294171" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:44.144509" elapsed="0.149770"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.295337" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.294752" elapsed="0.000784"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.294733" elapsed="0.000905"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.295710" elapsed="0.000030"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:44.120859" elapsed="0.174999"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.116714" elapsed="0.179189"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.116696" elapsed="0.179231"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:58:44.296666" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:44.296512" elapsed="0.000215"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.296788" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:44.296751" elapsed="0.000078"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.296493" elapsed="0.000358"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.296999" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:58:44.297119" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:44.296210" elapsed="0.000934"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.297768" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.297312" elapsed="0.000483"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.298503" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.297954" elapsed="0.000577"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.305018" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.304461" elapsed="0.000659"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.305922" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.305383" elapsed="0.000639"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:44.316933" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:44.317015" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:44 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":227,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":227,"Leader":"member-2-shard-default-config","LastIndex":228,"RaftState":"Follower","LastApplied":228,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLogIndex":228,"LastLeadershipChangeTime":"2026-04-10 00:56:32.607","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"487.0 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":228,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":16355},"timestamp":1775782724,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:44.317318" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:44.308985" elapsed="0.008396"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.306173" elapsed="0.011288"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.318606" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.317516" elapsed="0.001222"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.306153" elapsed="0.012635"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.325598" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":227,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":227,"Leader":"member-2-shard-default-config","LastIndex":228,"RaftState":"Follower","LastApplied":228,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLogIndex":228,"LastLeadershipChangeTime":"2026-04-10 00:56:32.607","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"487.0 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":228,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":16355},"timestamp":1775782724,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.322021" elapsed="0.003774"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.321576" elapsed="0.004307"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.321499" elapsed="0.004466"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.330018" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.326721" elapsed="0.003362"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.326141" elapsed="0.004026"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.326085" elapsed="0.004163"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.331783" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.330938" elapsed="0.000912"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.332735" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.332074" elapsed="0.000781"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.333804" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.333306" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.332937" elapsed="0.000989"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.332017" elapsed="0.001987"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.335003" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.334394" elapsed="0.000656"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.335550" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.335211" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.336251" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.335927" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.335704" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.335170" elapsed="0.001222"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:44.336740" elapsed="0.000685"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:44.338324" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.337840" elapsed="0.000531"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.338747" elapsed="0.002541"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:44.319939" elapsed="0.021449"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.341847" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:44.341529" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.341508" elapsed="0.000499"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:44.345387" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757827...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:44.342208" elapsed="0.003243"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:44.345725" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:58:44.346002" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757827...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:44.299478" elapsed="0.046552"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.346088" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:44.346238" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757827...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:44.298765" elapsed="0.047499"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.347572" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782724, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.346869" elapsed="0.000734"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:44.347703" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:44.347884" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782724, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:44.346485" elapsed="0.001426"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:44.348293" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 228, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.348069" elapsed="0.000252"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:44.348732" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.348478" elapsed="0.000280"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:44.348806" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:44.348958" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:44.114800" elapsed="0.234182"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:44.349039" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:44.349192" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:44.114076" elapsed="0.235175"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.349607" elapsed="0.000194"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.349338" elapsed="0.000501"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.350010" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.349863" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.350228" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.350086" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.349318" elapsed="0.000983"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:44.113909" elapsed="0.236421"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.352863" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.352348" elapsed="0.000542"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:44.352935" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:44.353080" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:44.352001" elapsed="0.001104"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.423952" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.423569" elapsed="0.000411"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.424754" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:44.424487" elapsed="0.000341">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:44.424920" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:44.424151" elapsed="0.000793"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.425490" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:44.425110" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.425842" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:44.426037" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.425698" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.426536" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.426264" elapsed="0.000343"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.427575" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.427293" elapsed="0.000330"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.428051" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.427785" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.428406" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.428630" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.428806" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:44.428270" elapsed="0.000593"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.428129" elapsed="0.000764"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:44.428937" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:44.429096" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:44.426971" elapsed="0.002150"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.426679" elapsed="0.002473"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.429324" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.429176" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.426660" elapsed="0.002739"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.429982" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.429541" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.430057" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:44.422938" elapsed="0.007242"/>
</kw>
<msg time="2026-04-10T00:58:44.430233" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:44.410234" elapsed="0.020211"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.443154" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.455643" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.467978" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.468197" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.468394" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.468863" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.468715" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:44.468699" 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-04-10T00:58:44.469086" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.469256" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.469424" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:44.468668" elapsed="0.000808"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.468531" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.469692" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.469787" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:58:44.470036" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:44.405538" elapsed="0.064543"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.471961" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:44.471710" elapsed="0.000315">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:44.472116" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:44.471346" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.472503" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.472258" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.473072" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.472776" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.472607" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.472239" elapsed="0.000914"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.475580" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:44.473324" elapsed="0.002284"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:44.475680" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:44.475981" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:44.470759" elapsed="0.005267"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.477943" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:44.477702" elapsed="0.000303">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:44.478098" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:44.477341" elapsed="0.000782"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:44.478350" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-10T00:58:44.478215" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.478196" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.478636" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.478829" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.478949" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:58:44.481176" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:44.476690" elapsed="0.004534"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.483317" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.483035" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.483868" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.483538" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:44.500236" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:44.501188" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:44.501664" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:44.486056" elapsed="0.015672"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.484001" elapsed="0.017827"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.502239" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.501888" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.483982" elapsed="0.018450"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.510006" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.504893" elapsed="0.005561"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.504361" elapsed="0.006144"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.504319" elapsed="0.006221"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.514311" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.510961" elapsed="0.003416"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.510646" elapsed="0.003780"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.510621" elapsed="0.003840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.515238" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.514713" elapsed="0.000563"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.515772" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.515375" elapsed="0.000483"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.516436" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.516120" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.515892" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.515350" elapsed="0.001170"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.517056" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.516698" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.517383" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.517152" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.517937" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.517643" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.517464" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.517134" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:44.518174" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:44.518980" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.518702" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.519159" elapsed="0.002608"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:44.503326" elapsed="0.018506"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.522037" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:44.521929" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.521909" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:44.530445" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:44.522275" elapsed="0.008201"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:44.530553" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:58:44.530883" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:44.481917" elapsed="0.049013"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.531021" elapsed="0.000061"/>
</return>
<msg time="2026-04-10T00:58:44.531433" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:44.381078" elapsed="0.150470"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.532661" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.532057" elapsed="0.000804"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.532037" elapsed="0.000904"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.533011" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:44.357461" elapsed="0.175697"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.353173" elapsed="0.180029"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.353155" elapsed="0.180073"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:58:44.533922" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:44.533796" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.534041" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:44.534004" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.533779" elapsed="0.000322"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.534246" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:58:44.534364" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:44.533510" elapsed="0.000879"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.534977" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.534572" elapsed="0.000431"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.535731" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.535162" elapsed="0.000598"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.542298" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.541784" elapsed="0.000617"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.543198" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.542683" 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-04-10T00:58:44.555414" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:44.555473" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:44 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":4,"SnapshotIndex":227,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":227,"Leader":"member-2-shard-default-config","LastIndex":228,"RaftState":"Leader","LastApplied":228,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":228,"LastLeadershipChangeTime":"2026-04-10 00:56:32.591","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.391","active":true,"matchIndex":228,"voting":true,"id":"member-1-shard-default-config","nextIndex":229},{"timeSinceLastActivity":"00:00:00.391","active":true,"matchIndex":228,"voting":true,"id":"member-3-shard-default-config","nextIndex":229}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"800.6 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":228,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":18,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":16355},"timestamp":1775782724,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:44.555780" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:44.546418" elapsed="0.009408"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.543609" elapsed="0.012274"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.556718" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.555922" elapsed="0.000889"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.543538" elapsed="0.013308"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.566342" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":4,"SnapshotIndex":227,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":227,"Leader":"member-2-shard-default-config","LastIndex":228,"RaftState":"Leader","LastApplied":228,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":228,"LastLeadershipChangeTime":"2026-04-10 00:56:32.591","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.391","active":true,"matchIndex":228,"voting":true,"id":"member-1-shard-default-config","nextIndex":229},{"timeSinceLastActivity":"00:00:00.391","active":true,"matchIndex":228,"voting":true,"id":"member-3-shard-default-config","nextIndex":229}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"800.6 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":228,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":18,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":16355},"timestamp":1775782724,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.561839" elapsed="0.004564"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.561098" elapsed="0.005366"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.561008" elapsed="0.005512"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.569348" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.566981" elapsed="0.002414"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.566664" elapsed="0.002791"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.566625" elapsed="0.002887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.570456" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.569867" elapsed="0.000634"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.571013" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.570680" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.571694" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.571371" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.571151" elapsed="0.000629"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.570640" elapsed="0.001195"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.572811" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.572174" elapsed="0.000684"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.573344" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.573016" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.574086" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.573735" elapsed="0.000379"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.573479" elapsed="0.000696"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.572976" elapsed="0.001253"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:44.574570" elapsed="0.000513"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:44.575934" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.575439" elapsed="0.000541"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.576327" elapsed="0.002542"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:44.558419" elapsed="0.020548"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.579324" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:44.579106" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.579086" elapsed="0.000394"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:44.583094" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757827...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:44.579703" elapsed="0.003454"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:44.583322" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:44.583647" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757827...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:44.536745" elapsed="0.046930"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.583734" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:44.583883" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757827...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:44.536011" elapsed="0.047898"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.585236" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782724, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.584496" elapsed="0.000768"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:44.585312" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:44.585490" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782724, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:44.584132" elapsed="0.001385"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:44.585986" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 228, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.585756" elapsed="0.000257"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:44.586402" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.586170" elapsed="0.000258"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:44.586474" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:44.586644" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:44.351388" elapsed="0.235282"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:44.586727" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:44.586875" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:44.350675" elapsed="0.236225"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.587196" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.586980" elapsed="0.000272"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.587481" elapsed="0.000205"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.587275" elapsed="0.000448"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.587893" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.587747" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.586963" elapsed="0.001004"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:44.350489" elapsed="0.237501"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.590612" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.590100" elapsed="0.000541"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:44.590685" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:44.590840" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:44.589758" elapsed="0.001106"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.661615" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.661220" elapsed="0.000426"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.662488" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:44.662240" elapsed="0.000342">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:44.662679" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:44.661850" elapsed="0.000853"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.663253" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:44.662869" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.663598" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:44.663747" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.663443" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.664172" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.663929" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.665180" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.664917" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.665670" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.665386" 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-04-10T00:58:44.666056" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.666262" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.666438" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:44.665918" elapsed="0.000577"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.665749" elapsed="0.000776"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:44.666586" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:44.666746" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:44.664598" elapsed="0.002172"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.664285" elapsed="0.002517"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.666973" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.666826" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.664266" elapsed="0.002781"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.667639" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.667196" elapsed="0.000471"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.667715" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:44.660601" elapsed="0.007236"/>
</kw>
<msg time="2026-04-10T00:58:44.667890" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:44.647666" elapsed="0.020276"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.681872" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.694275" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.706649" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.706869" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.707065" elapsed="0.000022"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.707461" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.707316" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:44.707302" 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-04-10T00:58:44.707709" elapsed="0.000022"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.707880" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.708047" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:44.707272" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.707159" 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>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.708293" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.708387" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:58:44.708653" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:44.642998" elapsed="0.065700"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.710512" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:44.710237" elapsed="0.000356">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:44.710687" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:44.709897" elapsed="0.000814"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.711050" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.710804" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.711635" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.711304" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.711132" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.710784" elapsed="0.000934"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.714073" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:44.711890" elapsed="0.002209"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:44.714174" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:44.714489" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:44.709349" elapsed="0.005186"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.716414" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:44.716172" elapsed="0.000304">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:44.716586" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:44.715833" elapsed="0.000779"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:44.716842" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:44.716706" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.716686" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.717104" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.717297" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.717379" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:58:44.719626" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:44.715235" elapsed="0.004438"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.721729" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.721455" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.722199" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.721949" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:44.740167" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01a1l7wam2dhg1d7al71x5srg20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:44.741111" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:44.741611" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:44.724466" elapsed="0.017208"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.722330" elapsed="0.019441"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.742184" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.741830" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.722310" elapsed="0.020067"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.748057" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.744263" elapsed="0.004245"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.743953" elapsed="0.004626"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.743927" elapsed="0.004688"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.752274" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.749032" elapsed="0.003288"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.748695" elapsed="0.003659"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.748672" elapsed="0.003705"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.752937" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.752546" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.753272" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.753034" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.753838" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.753517" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.753354" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.753016" elapsed="0.000905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.754611" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.754080" elapsed="0.000559"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.754948" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.754710" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.755538" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.755240" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.755029" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.754692" elapsed="0.000949"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:44.755793" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:44.756599" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.756300" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.756787" elapsed="0.002322"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:44.743330" elapsed="0.015874"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.759514" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:44.759299" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.759279" elapsed="0.000330"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:44.768191" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:44.759779" elapsed="0.008442"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:44.768296" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:44.768641" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:44.720344" elapsed="0.048344"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.768778" elapsed="0.000061"/>
</return>
<msg time="2026-04-10T00:58:44.769093" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:44.618430" elapsed="0.150769"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.770255" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.769671" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.769652" elapsed="0.000883"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.770625" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:44.595138" elapsed="0.175634"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.590931" elapsed="0.179885"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.590914" elapsed="0.179925"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:58:44.771580" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:58:44.771436" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.771702" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:44.771665" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.771418" elapsed="0.000345"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.771910" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:58:44.772029" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:44.771121" elapsed="0.000933"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.772643" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.772222" elapsed="0.000448"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.773376" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.772828" elapsed="0.000576"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.779956" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.779397" elapsed="0.000661"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.780869" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.780331" elapsed="0.000640"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:44.790920" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:44.790979" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:44 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":227,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":227,"Leader":"member-2-shard-default-config","LastIndex":228,"RaftState":"Follower","LastApplied":228,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLogIndex":228,"LastLeadershipChangeTime":"2026-04-10 00:58:01.719","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"520.3 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":228,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":16355},"timestamp":1775782724,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:44.791201" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:44.784005" elapsed="0.007242"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.781124" elapsed="0.010180"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.792150" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.791345" elapsed="0.000946"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.781105" elapsed="0.011236"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.799234" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":227,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":227,"Leader":"member-2-shard-default-config","LastIndex":228,"RaftState":"Follower","LastApplied":228,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLogIndex":228,"LastLeadershipChangeTime":"2026-04-10 00:58:01.719","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"520.3 μs","CurrentTerm":5,"LastTerm":5,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":5,"StatRetrievalError":null,"CommitIndex":228,"SnapshotTerm":5,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":16355},"timestamp":1775782724,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.795711" elapsed="0.003652"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.795224" elapsed="0.004225"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.795166" elapsed="0.004365"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.802631" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.800209" elapsed="0.002470"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.799771" elapsed="0.002967"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.799676" elapsed="0.003120"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.803733" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.803131" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.804344" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.804008" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.805091" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.804785" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.804482" elapsed="0.000696"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.803968" elapsed="0.001264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.806162" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.805582" elapsed="0.000628"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.806715" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.806369" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.807374" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.807072" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.806852" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.806329" elapsed="0.001185"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:44.807892" elapsed="0.000514"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:44.809282" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.808799" elapsed="0.000528"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.809694" elapsed="0.002514"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:44.793509" elapsed="0.018798"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.812736" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:44.812445" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.812425" elapsed="0.000468"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:44.816268" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757827...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:44.813088" elapsed="0.003243"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:44.816492" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:44.816893" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757827...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:44.774357" elapsed="0.042563"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.816978" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:44.817127" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17757827...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:44.773644" elapsed="0.043509"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.818448" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782724, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.817754" elapsed="0.000723"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:44.818584" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:44.818764" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782724, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:44.817373" elapsed="0.001418"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:44.819174" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 228, 'CommittedTransactionsCount': 0, 'CurrentTerm': 5, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.818950" elapsed="0.000251"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:44.819611" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.819358" elapsed="0.000279"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:44.819684" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:44.819837" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:44.589085" elapsed="0.230776"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:44.819917" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:44.820104" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:44.588327" elapsed="0.231805"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.820430" elapsed="0.000246"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.820213" elapsed="0.000501"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.820886" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.820738" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.821106" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.820963" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.820195" elapsed="0.000984"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:44.588154" elapsed="0.233050"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:44.113685" elapsed="0.707549"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:58:44.821275" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:44.821475" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:58:44.821522" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:58:44.109605" elapsed="0.711943"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.822004" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:58:44.822079" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:44.821739" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.822387" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.822171" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.822154" elapsed="0.000309"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.824732" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:58:44.822617" elapsed="0.002162"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:58:44.825132" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.824945" elapsed="0.000212"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:58:44.825203" elapsed="0.000027"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:58:44.107010" elapsed="0.718345"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-10T00:58:44.106789" elapsed="0.718611"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-10T00:58:40.314462" elapsed="4.510969"/>
</for>
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="PASS" start="2026-04-10T00:58:40.314044" elapsed="4.511444"/>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:58:37.977001" elapsed="6.848605"/>
</kw>
<kw name="Set DPN And Flow Count In Json Add" owner="BulkomaticKeywords">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.826442" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_add_bulk_flow_config.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_add_bulk_flow_config.json&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:44.826601" level="INFO">${body} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true",...</msg>
<var>${body}</var>
<arg>/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/openflowplugin/${json_config}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.826296" elapsed="0.000332"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.827063" level="INFO">${get_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.826806" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.827553" level="INFO">${put_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "${dpn_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.827262" elapsed="0.000367"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.828075" level="INFO">${str} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true",...</msg>
<var>${str}</var>
<arg>${body}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.827810" elapsed="0.000291"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.828574" level="INFO">${get_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "1000"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.828305" elapsed="0.000297"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.829063" level="INFO">${put_string} = "sal-bulk-flow:flows-per-dpn" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.828776" elapsed="0.000312"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.829520" level="INFO">${json_body_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true"...</msg>
<var>${json_body_add}</var>
<arg>${str}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.829264" elapsed="0.000286"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.829992" level="INFO">${get_string} = "sal-bulk-flow:batch-size" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:batch-size" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.829743" elapsed="0.000274"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.830472" level="INFO">${put_string} = "sal-bulk-flow:batch-size" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:batch-size" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.830188" elapsed="0.000309"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.830949" level="INFO">${json_body_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "t...</msg>
<var>${json_body_add}</var>
<arg>${json_body_add}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.830689" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.831386" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${json_body_add}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.831148" elapsed="0.000284"/>
</kw>
<return>
<value>${json_body_add}</value>
<status status="PASS" start="2026-04-10T00:58:44.831474" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:44.831648" level="INFO">${temp_json_config_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "t...</msg>
<var>${temp_json_config_add}</var>
<arg>${orig_json_config_add}</arg>
<arg>${switch_count}</arg>
<arg>${flow_count_per_switch}</arg>
<doc>Set new DPN count and flows count per DPN in the Bulkomatic Add json file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.825880" elapsed="0.005794"/>
</kw>
<kw name="Set DPN And Flow Count In Json Get" owner="BulkomaticKeywords">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.832513" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_get_bulk_flow_config.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_get_bulk_flow_config.json&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:44.832658" level="INFO">${body} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-t...</msg>
<var>${body}</var>
<arg>/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/openflowplugin/${json_config}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.832372" elapsed="0.000313"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.833117" level="INFO">${get_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.832860" elapsed="0.000282"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.833689" level="INFO">${put_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "${dpn_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.833376" elapsed="0.000340"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.834150" level="INFO">${str} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:start-t...</msg>
<var>${str}</var>
<arg>${body}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.833893" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.834623" level="INFO">${get_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "1000"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.834353" elapsed="0.000295"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.835107" level="INFO">${put_string} = "sal-bulk-flow:flows-per-dpn" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.834821" elapsed="0.000311"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.835578" level="INFO">${json_body_get} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-...</msg>
<var>${json_body_get}</var>
<arg>${str}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.835306" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.836021" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${json_body_get}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.835780" elapsed="0.000286"/>
</kw>
<return>
<value>${json_body_get}</value>
<status status="PASS" start="2026-04-10T00:58:44.836107" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:44.836301" level="INFO">${temp_json_config_get} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-...</msg>
<var>${temp_json_config_get}</var>
<arg>${orig_json_config_get}</arg>
<arg>${switch_count}</arg>
<arg>${flow_count_after_add}</arg>
<doc>Set new DPN count and flows count per DPN in the Bulkomatic Get json file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.831935" elapsed="0.004395"/>
</kw>
<kw name="Set DPN And Flow Count In Json Del" owner="BulkomaticKeywords">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.837178" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_del_bulk_flow_config.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_del_bulk_flow_config.json&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:44.837309" level="INFO">${body} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true"...</msg>
<var>${body}</var>
<arg>/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/openflowplugin/${json_config}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.837038" elapsed="0.000297"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.837787" level="INFO">${get_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.837511" elapsed="0.000301"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.838271" level="INFO">${put_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "${dpn_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.837985" elapsed="0.000312"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.838744" level="INFO">${str} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true"...</msg>
<var>${str}</var>
<arg>${body}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.838471" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.839198" level="INFO">${get_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "1000"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.838948" elapsed="0.000275"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.839874" level="INFO">${put_string} = "sal-bulk-flow:flows-per-dpn" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.839398" elapsed="0.000502"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.840371" level="INFO">${json_body_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true...</msg>
<var>${json_body_del}</var>
<arg>${str}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.840079" elapsed="0.000320"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.840849" level="INFO">${get_string} = "sal-bulk-flow:batch-size" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:batch-size" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.840595" elapsed="0.000280"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.841332" level="INFO">${put_string} = "sal-bulk-flow:batch-size" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:batch-size" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.841047" elapsed="0.000310"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.841856" level="INFO">${json_body_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "...</msg>
<var>${json_body_del}</var>
<arg>${json_body_del}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.841592" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.842296" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${json_body_del}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.842056" elapsed="0.000286"/>
</kw>
<return>
<value>${json_body_del}</value>
<status status="PASS" start="2026-04-10T00:58:44.842384" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:44.842706" level="INFO">${temp_json_config_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "...</msg>
<var>${temp_json_config_del}</var>
<arg>${orig_json_config_del}</arg>
<arg>${switch_count}</arg>
<arg>${flow_count_per_switch}</arg>
<doc>Set new DPN count and flows count per DPN in the Bulkomatic Del json file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.836629" elapsed="0.006103"/>
</kw>
<kw name="Set DPN And Flow Count In Json Del" owner="BulkomaticKeywords">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.843569" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_del_bulk_flow_config.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_del_bulk_flow_config.json&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:44.843694" level="INFO">${body} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true"...</msg>
<var>${body}</var>
<arg>/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/openflowplugin/${json_config}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.843413" elapsed="0.000307"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.844146" level="INFO">${get_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.843893" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.844673" level="INFO">${put_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "${dpn_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.844346" elapsed="0.000352"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.845125" level="INFO">${str} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true"...</msg>
<var>${str}</var>
<arg>${body}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.844873" elapsed="0.000278"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.845591" level="INFO">${get_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "1000"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.845326" elapsed="0.000292"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.846074" level="INFO">${put_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.845790" elapsed="0.000309"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.846525" level="INFO">${json_body_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true"...</msg>
<var>${json_body_del}</var>
<arg>${str}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.846271" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.846994" level="INFO">${get_string} = "sal-bulk-flow:batch-size" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:batch-size" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.846744" elapsed="0.000275"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.847477" level="INFO">${put_string} = "sal-bulk-flow:batch-size" : "1000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:batch-size" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.847195" elapsed="0.000308"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.847950" level="INFO">${json_body_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "tr...</msg>
<var>${json_body_del}</var>
<arg>${json_body_del}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.847692" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.848386" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${json_body_del}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.848148" elapsed="0.000320"/>
</kw>
<return>
<value>${json_body_del}</value>
<status status="PASS" start="2026-04-10T00:58:44.848511" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:44.848692" level="INFO">${temp_json_config_del_ten_percent} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "tr...</msg>
<var>${temp_json_config_del_ten_percent}</var>
<arg>${orig_json_config_del}</arg>
<arg>${switch_count}</arg>
<arg>${flow_count_per_switch_ten_percent}</arg>
<doc>Set new DPN count and flows count per DPN in the Bulkomatic Del json file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.843004" elapsed="0.005747"/>
</kw>
<kw name="Set DPN And Flow Count In Json Add" owner="BulkomaticKeywords">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.849605" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_add_bulk_flow_config.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/sal_add_bulk_flow_config.json&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:44.849729" level="INFO">${body} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true",...</msg>
<var>${body}</var>
<arg>/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/openflowplugin/${json_config}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.849448" elapsed="0.000308"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.850188" level="INFO">${get_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.849930" elapsed="0.000284"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.850695" level="INFO">${put_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "${dpn_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.850393" elapsed="0.000328"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.851145" level="INFO">${str} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true",...</msg>
<var>${str}</var>
<arg>${body}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.850894" elapsed="0.000278"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.851619" level="INFO">${get_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "1000"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.851347" elapsed="0.000299"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.852101" level="INFO">${put_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.851815" elapsed="0.000311"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.852618" level="INFO">${json_body_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1",
   "sal-bulk-flow:seq" : "true",...</msg>
<var>${json_body_add}</var>
<arg>${str}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.852301" elapsed="0.000345"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.853073" level="INFO">${get_string} = "sal-bulk-flow:batch-size" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:batch-size" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.852824" elapsed="0.000275"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.853574" level="INFO">${put_string} = "sal-bulk-flow:batch-size" : "1000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:batch-size" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.853269" elapsed="0.000333"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.854035" level="INFO">${json_body_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "tru...</msg>
<var>${json_body_add}</var>
<arg>${json_body_add}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.853777" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.854471" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${json_body_add}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.854234" elapsed="0.000283"/>
</kw>
<return>
<value>${json_body_add}</value>
<status status="PASS" start="2026-04-10T00:58:44.854575" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:44.854736" level="INFO">${temp_json_config_add_ten_percent} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "tru...</msg>
<var>${temp_json_config_add_ten_percent}</var>
<arg>${orig_json_config_add}</arg>
<arg>${switch_count}</arg>
<arg>${flow_count_per_switch_ten_percent}</arg>
<doc>Set new DPN count and flows count per DPN in the Bulkomatic Add json file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.849037" elapsed="0.005725"/>
</kw>
<kw name="Set DPN And Flow Count In Json Add" owner="BulkomaticKeywords">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.855751" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/add_table.json"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/openflowplugin/add_table.json&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:44.855917" level="INFO">${body} = {
  "input" :
    {
      "sal-bulk-flow:operation" : "add",
      "sal-bulk-flow:dpn-count" : "2",
      "sal-bulk-flow:start-table-id" : "0",
      "sal-bulk-flow:end-table-id" : "9"
    }
}
</msg>
<var>${body}</var>
<arg>/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/openflowplugin/${json_config}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.855609" elapsed="0.000334"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.856379" level="INFO">${get_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.856119" elapsed="0.000285"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.856954" level="INFO">${put_string} = "sal-bulk-flow:dpn-count" : "1"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:dpn-count" : "${dpn_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.856664" elapsed="0.000316"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.857408" level="INFO">${str} = {
  "input" :
    {
      "sal-bulk-flow:operation" : "add",
      "sal-bulk-flow:dpn-count" : "2",
      "sal-bulk-flow:start-table-id" : "0",
      "sal-bulk-flow:end-table-id" : "9"
    }
}
</msg>
<var>${str}</var>
<arg>${body}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.857155" elapsed="0.000279"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.857878" level="INFO">${get_string} = "sal-bulk-flow:flows-per-dpn" : "1000"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "1000"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.857626" elapsed="0.000277"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.858362" level="INFO">${put_string} = "sal-bulk-flow:flows-per-dpn" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:flows-per-dpn" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.858074" elapsed="0.000313"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.858834" level="INFO">${json_body_add} = {
  "input" :
    {
      "sal-bulk-flow:operation" : "add",
      "sal-bulk-flow:dpn-count" : "2",
      "sal-bulk-flow:start-table-id" : "0",
      "sal-bulk-flow:end-table-id" : "9"
    }
}
</msg>
<var>${json_body_add}</var>
<arg>${str}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.858578" elapsed="0.000283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.859291" level="INFO">${get_string} = "sal-bulk-flow:batch-size" : "1"</msg>
<var>${get_string}</var>
<arg>"sal-bulk-flow:batch-size" : "1"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.859038" elapsed="0.000278"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.859791" level="INFO">${put_string} = "sal-bulk-flow:batch-size" : "10000"</msg>
<var>${put_string}</var>
<arg>"sal-bulk-flow:batch-size" : "${flows_count}"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.859487" elapsed="0.000329"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-10T00:58:44.860243" level="INFO">${json_body_add} = {
  "input" :
    {
      "sal-bulk-flow:operation" : "add",
      "sal-bulk-flow:dpn-count" : "2",
      "sal-bulk-flow:start-table-id" : "0",
      "sal-bulk-flow:end-table-id" : "9"
    }
}
</msg>
<var>${json_body_add}</var>
<arg>${json_body_add}</arg>
<arg>${get_string}</arg>
<arg>${put_string}</arg>
<doc>Replaces ``pattern`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.859989" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.860711" level="INFO">{
  "input" :
    {
      "sal-bulk-flow:operation" : "add",
      "sal-bulk-flow:dpn-count" : "2",
      "sal-bulk-flow:start-table-id" : "0",
      "sal-bulk-flow:end-table-id" : "9"
    }
}
</msg>
<arg>${json_body_add}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.860439" elapsed="0.000316"/>
</kw>
<return>
<value>${json_body_add}</value>
<status status="PASS" start="2026-04-10T00:58:44.860796" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:44.860951" level="INFO">${temp_json_config_table} = {
  "input" :
    {
      "sal-bulk-flow:operation" : "add",
      "sal-bulk-flow:dpn-count" : "2",
      "sal-bulk-flow:start-table-id" : "0",
      "sal-bulk-flow:end-table-id" : "9"
    }
}
</msg>
<var>${temp_json_config_table}</var>
<arg>${orig_json_config_table_add}</arg>
<arg>${switch_count}</arg>
<arg>${flow_count_per_switch}</arg>
<doc>Set new DPN count and flows count per DPN in the Bulkomatic Add json file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.855032" elapsed="0.005944"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.861503" level="INFO">${temp_json_config_add} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "t...</msg>
<arg>${temp_json_config_add}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:44.861166" elapsed="0.000384"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.862059" level="INFO">${temp_json_config_get} = {
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-...</msg>
<arg>${temp_json_config_get}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:44.861743" elapsed="0.000358"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.862611" level="INFO">${temp_json_config_del} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "...</msg>
<arg>${temp_json_config_del}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:44.862281" elapsed="0.000374"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.863154" level="INFO">${temp_json_config_del_ten_percent} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "tr...</msg>
<arg>${temp_json_config_del_ten_percent}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:44.862831" elapsed="0.000365"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.863809" level="INFO">${temp_json_config_add_ten_percent} = {
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "tru...</msg>
<arg>${temp_json_config_add_ten_percent}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:44.863467" elapsed="0.000384"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.864340" level="INFO">${temp_json_config_table} = {
  "input" :
    {
      "sal-bulk-flow:operation" : "add",
      "sal-bulk-flow:dpn-count" : "2",
      "sal-bulk-flow:start-table-id" : "0",
      "sal-bulk-flow:end-table-id" : "9"
    }
}
</msg>
<arg>${temp_json_config_table}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:44.864026" elapsed="0.000355"/>
</kw>
<doc>Check Status for all shards in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:58:37.976664" elapsed="6.887818"/>
</kw>
<kw name="Get Inventory Follower">
<kw name="Get InventoryConfig Shard Status" owner="ClusterOpenFlow">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.872174" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:44.871796" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.872682" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:44.872362" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:44.872752" elapsed="0.000072"/>
</return>
<msg time="2026-04-10T00:58:44.872952" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:44.871406" elapsed="0.001570"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="PASS" start="2026-04-10T00:58:44.873129" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.873788" level="INFO">${ds_type} = config</msg>
<var>${ds_type}</var>
<arg>'${shard_type}' != 'config'</arg>
<arg>operational</arg>
<arg>config</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:44.873443" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.874207" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:44.873972" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.874632" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:44.874379" elapsed="0.000279"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.877117" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.876767" elapsed="0.000378"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:44.877190" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:44.877338" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:44.876405" elapsed="0.000958"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.930877" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.930483" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.931638" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:44.931403" elapsed="0.000304">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:44.931799" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:44.931070" elapsed="0.000754"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.932376" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:44.931993" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.932715" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:44.932837" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:44.932579" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.933261" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.933021" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.934292" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.934039" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.934785" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:44.934498" elapsed="0.000346"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.935172" elapsed="0.000025"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.935379" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.935568" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:44.935036" elapsed="0.000594"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.934898" elapsed="0.000762"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:44.935703" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:44.935863" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:44.933709" elapsed="0.002179"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.933372" elapsed="0.002548"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.936096" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.935945" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.933353" elapsed="0.002819"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.936762" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:44.936315" elapsed="0.000473"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:44.936836" elapsed="0.000028"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:44.929870" elapsed="0.007089"/>
</kw>
<msg time="2026-04-10T00:58:44.937013" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:44.916899" elapsed="0.020210"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.950240" elapsed="0.000053"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.963160" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.976116" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.976516" elapsed="0.000069"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.976927" elapsed="0.000046"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.977479" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.977331" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:44.977315" 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-04-10T00:58:44.977721" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.977889" elapsed="0.000053"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.978093" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:44.977271" elapsed="0.000894"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.977083" elapsed="0.001117"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.978585" elapsed="0.000048"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.978717" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:44.978910" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:44.910885" elapsed="0.068065"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.981355" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:44.981109" elapsed="0.000309">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:44.981632" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:44.980704" elapsed="0.000974"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.982102" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:44.981788" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.982816" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:44.982494" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.982232" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.981757" elapsed="0.001193"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.985685" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:44.983282" elapsed="0.002450"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:44.985808" elapsed="0.000064"/>
</return>
<msg time="2026-04-10T00:58:44.986102" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:44.979833" elapsed="0.006308"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:44.988716" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:44.988459" elapsed="0.000320">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:44.988957" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:44.988061" elapsed="0.000940"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:44.989314" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:58:44.989111" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.989081" 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-04-10T00:58:44.989903" elapsed="0.000047"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:44.990284" elapsed="0.000046"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:44.990402" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:44.992650" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:44.987007" elapsed="0.005684"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.996738" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.996410" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:44.997507" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:44.997198" elapsed="0.000515"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:45.017201" level="INFO">GET Request : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:45.018150" level="INFO">GET Response : url=http://10.30.170.165:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:45.018619" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:45.000041" elapsed="0.018642"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.997823" elapsed="0.021013"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.019442" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.018982" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.997791" elapsed="0.021990"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.028677" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.022967" elapsed="0.006058"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.022403" elapsed="0.006659"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.022358" elapsed="0.006728"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.031794" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.029369" elapsed="0.002471"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.029144" elapsed="0.002730"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.029126" elapsed="0.002773"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.032435" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.032065" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.032794" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.032531" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.033342" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.033036" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.032875" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.032513" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.033955" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.033600" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.034282" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.034050" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.034831" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.034522" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.034362" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.034033" elapsed="0.000879"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:45.035061" elapsed="0.000375"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:45.035891" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.035618" elapsed="0.000299"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.036084" elapsed="0.002505"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:45.021210" elapsed="0.017510"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.039001" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.038831" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.038799" elapsed="0.000314"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:45.047854" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:45.039456" elapsed="0.008447"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:45.047980" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T00:58:45.048296" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:44.993678" elapsed="0.054660"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:45.048579" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:45.048812" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:44.886030" elapsed="0.162809"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.049183" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.048925" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.048908" elapsed="0.000781"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:45.049725" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:44.881672" elapsed="0.168181"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:44.877430" elapsed="0.172466"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:44.877412" elapsed="0.172508"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:58:45.050521" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:58:45.050415" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.050662" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.050624" elapsed="0.000077"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.050397" elapsed="0.000326"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.050870" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:58:45.050990" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:45.050148" elapsed="0.000867"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.051598" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.051185" elapsed="0.000441"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.052242" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.051784" elapsed="0.000486"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.058461" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.057988" elapsed="0.000536"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.059187" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.058718" elapsed="0.000527"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:45.071803" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:45.071889" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":214107,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":214107,"Leader":"member-2-shard-inventory-config","LastIndex":214108,"RaftState":"Follower","LastApplied":214108,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":214108,"LastLeadershipChangeTime":"2026-04-10 00:56:32.528","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"309.1 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":214108,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":592773},"timestamp":1775782725,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:45.072049" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:45.064493" elapsed="0.007596"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.059327" elapsed="0.012889"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.072428" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.072245" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.059309" elapsed="0.013643"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.079276" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":214107,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":214107,"Leader":"member-2-shard-inventory-config","LastIndex":214108,"RaftState":"Follower","LastApplied":214108,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":214108,"LastLeadershipChangeTime":"2026-04-10 00:56:32.528","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"309.1 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":214108,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-inventory-config","LeadershipChangeCount":2,"InMemoryJournalDataSize":592773},"timestamp":1775782725,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.074858" elapsed="0.004607"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.074323" elapsed="0.005214"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.074281" elapsed="0.005380"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.084182" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.080678" elapsed="0.003587"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.079893" elapsed="0.004421"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.079828" elapsed="0.004554"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.085920" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.085101" elapsed="0.000920"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.086718" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.086162" elapsed="0.000655"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.087719" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.087260" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.086886" elapsed="0.000930"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.086119" elapsed="0.001788"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.089339" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.088481" elapsed="0.000958"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.090134" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.089597" elapsed="0.000641"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.091132" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.090698" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.090306" elapsed="0.000921"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.089539" elapsed="0.001755"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:45.091605" elapsed="0.000661"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:45.093204" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.092550" elapsed="0.000948"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.093785" elapsed="0.002748"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:45.073411" elapsed="0.023394"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.097062" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.096905" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.096885" elapsed="0.000312"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:45.100816" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:45.097346" elapsed="0.003500"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:45.100947" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:45.101109" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:45.053227" elapsed="0.047909"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:45.101226" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:45.101380" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:45.052485" elapsed="0.048921"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.102460" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782725, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.101993" elapsed="0.000496"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:45.102538" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:58:45.102736" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782725, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:45.101646" elapsed="0.001118"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:45.103121" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 214108, 'CommittedTransactionsCount': 0, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerIni...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.102921" elapsed="0.000226"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:45.103502" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.103305" elapsed="0.000222"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:45.103591" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:45.103745" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:44.875804" elapsed="0.227965"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:45.103825" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:45.103969" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:44.875083" elapsed="0.228910"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.104311" elapsed="0.000187"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.104070" elapsed="0.000465"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.104762" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.104611" elapsed="0.000206"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.104982" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.104840" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.104054" elapsed="0.000999"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:44.874914" elapsed="0.230163"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.107527" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.107092" elapsed="0.000480"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:45.107618" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:45.107767" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:45.106749" elapsed="0.001043"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.161447" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.161072" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:45.162243" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:45.161991" elapsed="0.000321">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:45.162452" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:45.161656" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.163044" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:45.162659" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:45.163372" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:45.163517" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:45.163238" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.163962" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.163719" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.165042" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.164715" elapsed="0.000376"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.165530" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.165258" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.165900" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.166102" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.166276" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:45.165765" elapsed="0.000567"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.165629" elapsed="0.000733"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:45.166405" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:45.166579" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:45.164369" elapsed="0.002236"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.164075" elapsed="0.002562"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.166809" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.166662" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.164056" elapsed="0.002829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.167451" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.167028" elapsed="0.000451"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:45.167526" elapsed="0.000048"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:45.160387" elapsed="0.007286"/>
</kw>
<msg time="2026-04-10T00:58:45.167726" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:45.147309" elapsed="0.020516"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.181012" elapsed="0.000053"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.193913" elapsed="0.000052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.206923" elapsed="0.000051"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.207316" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.207732" elapsed="0.000047"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.208286" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.208139" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:45.208122" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.208507" elapsed="0.000020"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.208695" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.208861" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:45.208076" elapsed="0.000856"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.207890" elapsed="0.001077"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.209293" elapsed="0.000183"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.209615" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:45.209822" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:45.141299" elapsed="0.068564"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:45.212271" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:45.212018" elapsed="0.000317">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:45.212512" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:45.211614" elapsed="0.000992"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.213037" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.212724" elapsed="0.000392"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.213720" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.213383" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.213163" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.212692" elapsed="0.001159"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.216523" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:45.214182" elapsed="0.002445"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:45.216708" elapsed="0.000064"/>
</return>
<msg time="2026-04-10T00:58:45.217005" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:45.210740" elapsed="0.006305"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:45.219503" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:45.219263" elapsed="0.000321">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:45.219799" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:45.218864" elapsed="0.000982"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:45.220160" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T00:58:45.219957" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.219926" 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-04-10T00:58:45.220743" elapsed="0.000047"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.221121" elapsed="0.000046"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.221239" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:45.223493" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:45.217986" elapsed="0.005549"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.227421" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.227108" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.228168" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.227858" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:45.243939" level="INFO">GET Request : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:45.244360" level="INFO">GET Response : url=http://10.30.170.169:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:45.244585" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:45.230655" elapsed="0.013959"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.228352" elapsed="0.016331"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.244940" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.244734" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.228321" elapsed="0.016750"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.249254" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.246504" elapsed="0.003090"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.246280" elapsed="0.003350"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.246260" elapsed="0.003394"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.252352" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.249938" elapsed="0.002460"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.249712" elapsed="0.002721"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.249694" elapsed="0.002762"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.253010" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.252636" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.253343" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.253108" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.253903" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.253603" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.253424" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.253089" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.254520" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.254160" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.254885" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.254652" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.255414" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.255123" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.254965" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.254634" elapsed="0.000862"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:45.255683" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:45.256464" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.256192" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.256661" elapsed="0.002533"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:45.245730" elapsed="0.013596"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.259630" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.259436" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.259405" elapsed="0.000337"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:45.268464" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:45.260063" elapsed="0.008450"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:45.268627" elapsed="0.000067"/>
</return>
<msg time="2026-04-10T00:58:45.268952" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:45.224311" elapsed="0.044683"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:45.269226" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:45.269462" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:45.116637" elapsed="0.152853"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.269853" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.269593" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.269574" elapsed="0.000795"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:45.270405" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:45.112205" elapsed="0.158330"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.107859" elapsed="0.162738"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.107842" elapsed="0.162779"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:58:45.271223" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:45.271118" elapsed="0.000165"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.271342" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.271305" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.271101" elapsed="0.000301"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.271551" elapsed="0.000035"/>
</kw>
<msg time="2026-04-10T00:58:45.271685" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:45.270851" elapsed="0.000859"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.272247" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.271880" elapsed="0.000394"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.272916" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.272432" elapsed="0.000511"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.279211" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.278730" elapsed="0.000544"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.279945" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.279447" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:45.293074" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:45.293158" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":5003,"SnapshotIndex":214107,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":214107,"Leader":"member-2-shard-inventory-config","LastIndex":214108,"RaftState":"Leader","LastApplied":214108,"LastCommittedTransactionTime":"2026-04-10 00:58:29.866","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":214108,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.330","active":true,"matchIndex":214108,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":214109},{"timeSinceLastActivity":"00:00:00.331","active":true,"matchIndex":214108,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":214109}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"625.7 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":3,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":214108,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10006,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":592773},"timestamp":1775782725,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:45.293331" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:45.285355" elapsed="0.008017"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.280091" elapsed="0.013408"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.293732" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.293529" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.280072" elapsed="0.013926"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.298644" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":5003,"SnapshotIndex":214107,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":214107,"Leader":"member-2-shard-inventory-config","LastIndex":214108,"RaftState":"Leader","LastApplied":214108,"LastCommittedTransactionTime":"2026-04-10 00:58:29.866","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":214108,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.330","active":true,"matchIndex":214108,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":214109},{"timeSinceLastActivity":"00:00:00.331","active":true,"matchIndex":214108,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":214109}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"625.7 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":3,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":214108,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10006,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":592773},"timestamp":1775782725,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.295968" elapsed="0.002774"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.295431" elapsed="0.003361"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.295389" elapsed="0.003472"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.301997" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.299522" elapsed="0.002553"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.298997" elapsed="0.003127"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.298955" elapsed="0.003236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.303612" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.302809" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.305433" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.303854" elapsed="0.001683"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.306482" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.306002" elapsed="0.000526"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.305623" elapsed="0.000974"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.303812" elapsed="0.002851"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.308106" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.307277" elapsed="0.000929"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.308945" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.308351" elapsed="0.000690"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.310055" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.309618" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.309106" elapsed="0.001044"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.308307" elapsed="0.001907"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:45.310505" elapsed="0.000682"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:45.312185" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.311465" elapsed="0.000818"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.312552" elapsed="0.002688"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:45.294468" elapsed="0.020884"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.315748" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.315452" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.315432" elapsed="0.000444"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:45.319451" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:45.316027" elapsed="0.003454"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:45.319750" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:58:45.319917" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:45.273907" elapsed="0.046037"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:45.320002" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:45.320157" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:45.273156" elapsed="0.047028"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.321263" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782725, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.320783" elapsed="0.000509"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:45.321347" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:45.321528" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782725, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:45.320419" elapsed="0.001152"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:45.321936" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 214108, 'CommittedTransactionsCount': 3, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.321733" elapsed="0.000230"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:45.322325" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.322119" elapsed="0.000231"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:45.322397" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:45.322552" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:45.106137" elapsed="0.216454"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:45.322649" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:45.322803" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:45.105408" elapsed="0.217420"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.323155" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.322908" elapsed="0.000306"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.323446" elapsed="0.000272"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.323237" elapsed="0.000519"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.323933" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.323780" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.322891" elapsed="0.001118"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:45.105240" elapsed="0.218792"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.326461" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.326137" elapsed="0.000351"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:45.326533" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:58:45.326699" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:45.325795" elapsed="0.000928"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.380517" level="INFO">${file_path_stream} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.380136" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:45.381407" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:45.381113" elapsed="0.000368">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:45.381597" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:45.380772" elapsed="0.000851"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.382175" level="INFO">${file_path} = /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:45.381792" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-10T00:58:45.382501" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-10T00:58:45.382669" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-10T00:58:45.382366" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.383102" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.382855" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.384132" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.383879" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.384624" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.384339" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.384976" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.385179" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.385356" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-10T00:58:45.384841" elapsed="0.000572"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.384704" elapsed="0.000739"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-10T00:58:45.385486" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:45.385659" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-10T00:58:45.383506" elapsed="0.002179"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.383215" elapsed="0.002502"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.385889" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.385741" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.383196" elapsed="0.002769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.386531" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.386109" elapsed="0.000466"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-10T00:58:45.386624" 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/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-10T00:58:45.379421" elapsed="0.007326"/>
</kw>
<msg time="2026-04-10T00:58:45.386802" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:45.366344" elapsed="0.020556"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.400106" elapsed="0.000056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.413005" elapsed="0.000052"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.425838" elapsed="0.000052"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.426236" 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-04-10T00:58:45.426642" elapsed="0.000047"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.427201" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.427049" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-10T00:58:45.427033" 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-04-10T00:58:45.427424" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.427613" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.427783" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-10T00:58:45.426988" elapsed="0.000865"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.426801" elapsed="0.001086"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.428212" elapsed="0.000072"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.428370" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:45.428591" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-10T00:58:45.360344" elapsed="0.068289"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:45.431169" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:45.430926" elapsed="0.000307">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:45.431409" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:45.430489" elapsed="0.000965"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.431938" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.431617" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.432623" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.432280" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.432065" elapsed="0.000644"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.431533" elapsed="0.001222"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.435412" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:45.433083" elapsed="0.002375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-10T00:58:45.435534" elapsed="0.000124"/>
</return>
<msg time="2026-04-10T00:58:45.435892" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:45.429504" elapsed="0.006427"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-10T00:58:45.438538" level="FAIL">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-10T00:58:45.438138" elapsed="0.000480">File '/w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-10T00:58:45.438797" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-10T00:58:45.437722" elapsed="0.001120"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-10T00:58:45.439154" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:58:45.438953" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.438922" 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-04-10T00:58:45.439732" elapsed="0.000048"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.440112" elapsed="0.000045"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.440230" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:45.442453" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/openflowplugin-csit-3node-clustering-bulkomatic-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-10T00:58:45.436839" elapsed="0.005656"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.446360" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.446049" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.447100" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.446791" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:45.468387" level="INFO">GET Request : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01a1l7wam2dhg1d7al71x5srg20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:45.468879" level="INFO">GET Response : url=http://10.30.171.151:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-10T00:58:45.469089" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:45.449592" elapsed="0.019524"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.447285" elapsed="0.021901"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.469655" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.469244" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.447254" elapsed="0.022534"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.473964" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"opendaylight-flow-table-statistics_2013-12-15","revision":"2013-12-15","schema":"/rests/modules/opendaylight-flow-table-statistics?revision=2013-12-15","namespace":"urn:opendaylight:flow:table:statistics","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","hidden-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"batch-common_2016-03-22","revision":"2016-03-22","schema":"/rests/modules/batch-common?revision=2016-03-22","namespace":"urn:opendaylight:service:batch:common","conformance-type":"import"},{"name":"lldp-speaker_2014-10-23","revision":"2014-10-23","schema":"/rests/modules/lldp-speaker?revision=2014-10-23","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker","conformance-type":"import"},{"name":"openflowplugin-extension-general_2014-07-14","revision":"2014-07-14","schema":"/rests/modules/openflowplugin-extension-general?revision=2014-07-14","namespace":"urn:opendaylight:openflowplugin:extension:general","conformance-type":"import"},{"name":"opendaylight-port-statistics_2013-12-14","revision":"2013-12-14","schema":"/rests/modules/opendaylight-port-statistics?revision=2013-12-14","namespace":"urn:opendaylight:port:statistics","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"topology-lldp-discovery-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/topology-lldp-discovery-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:topology-lldp-discovery:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"frm-reconciliation_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/frm-reconciliation?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:frm-reconciliation:service","conformance-type":"import"},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","local-user-auth-hostbased","ssh-server-keepalives"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"sal-bulk-flow_2015-06-08","revision":"2015-06-08","schema":"/rests/modules/sal-bulk-flow?revision=2015-06-08","namespace":"urn:opendaylight:bulk-flow:service","conformance-type":"import"},{"name":"sal-experimenter-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-message:service","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"sal-flow_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/sal-flow?revision=2013-08-19","namespace":"urn:opendaylight:flow:service","conformance-type":"import"},{"name":"sal-port_2013-11-07","revision":"2013-11-07","schema":"/rests/modules/sal-port?revision=2013-11-07","namespace":"urn:opendaylight:port:service","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"flow-topology-discovery_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-topology-discovery?revision=2013-08-19","namespace":"urn:opendaylight:flow:topology:discovery","conformance-type":"import"},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"opendaylight-queue-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-queue-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:queue","conformance-type":"import"},{"name":"sal-echo_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-echo?revision=2015-03-05","namespace":"urn:opendaylight:echo:service","conformance-type":"import"},{"name":"statistics-manager-control_2015-08-12","revision":"2015-08-12","schema":"/rests/modules/statistics-manager-control?revision=2015-08-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:sm:control","conformance-type":"import"},{"name":"barrier-common_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/barrier-common?revision=2016-03-15","namespace":"urn:opendaylight:service:barrier:common","conformance-type":"import"},{"name":"flow-capable-transaction_2015-03-04","revision":"2015-03-04","schema":"/rests/modules/flow-capable-transaction?revision=2015-03-04","namespace":"urn:opendaylight:flow:transaction","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"opendaylight-topology-inventory_2013-10-30","revision":"2013-10-30","schema":"/rests/modules/opendaylight-topology-inventory?revision=2013-10-30","namespace":"urn:opendaylight:model:topology:inventory","conformance-type":"import"},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["client-ident-hostbased","ssh-client-keepalives","client-ident-publickey","client-ident-password"]},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"opendaylight-meter-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-meter-statistics?revision=2013-11-11","namespace":"urn:opendaylight:meter:statistics","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-x509-cert","client-auth-supported"]},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-statistics-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-statistics-types?revision=2013-09-25","namespace":"urn:opendaylight:model:statistics:types","conformance-type":"import"},{"name":"openflow-switch-connection-config_2016-05-06","revision":"2016-05-06","schema":"/rests/modules/openflow-switch-connection-config?revision=2016-05-06","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:switch:connection:config","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"openflowplugin-experimenter-types_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/openflowplugin-experimenter-types?revision=2015-10-20","namespace":"urn:opendaylight:openflowplugin:experimenter:types","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"node-config_2014-10-15","revision":"2014-10-15","schema":"/rests/modules/node-config?revision=2014-10-15","namespace":"urn:opendaylight:module:config","conformance-type":"import"},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"sal-group_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-group?revision=2013-09-18","namespace":"urn:opendaylight:group:service","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"},{"name":"sal-meter_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/sal-meter?revision=2013-09-18","namespace":"urn:opendaylight:meter:service","conformance-type":"import"},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"opendaylight-flow-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-flow-types?revision=2013-10-26","namespace":"urn:opendaylight:flow:types","conformance-type":"import"},{"name":"lldp-speaker-config_2016-05-12","revision":"2016-05-12","schema":"/rests/modules/lldp-speaker-config?revision=2016-05-12","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:applications:lldp-speaker:config","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"openflow-action_2015-02-03","revision":"2015-02-03","schema":"/rests/modules/openflow-action?revision=2015-02-03","namespace":"urn:opendaylight:openflow:common:action","conformance-type":"import"},{"name":"openflow-approved-extensions_2016-08-02","revision":"2016-08-02","schema":"/rests/modules/openflow-approved-extensions?revision=2016-08-02","namespace":"urn:opendaylight:openflow:approved:extensions","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"openflow-instruction_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-instruction?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:instruction","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"opendaylight-group-statistics_2013-11-11","revision":"2013-11-11","schema":"/rests/modules/opendaylight-group-statistics?revision=2013-11-11","namespace":"urn:opendaylight:group:statistics","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"opendaylight-flow-statistics_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-flow-statistics?revision=2013-08-19","namespace":"urn:opendaylight:flow:statistics","conformance-type":"import"},{"name":"opendaylight-table-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-table-types?revision=2013-10-26","namespace":"urn:opendaylight:table:types","conformance-type":"import"},{"name":"forwarding-rules-manager-config_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/forwarding-rules-manager-config?revision=2016-05-11","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager:config","conformance-type":"import"},{"name":"odl-srm-types_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-types?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:types","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"flow-node-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/flow-node-inventory?revision=2013-08-19","namespace":"urn:opendaylight:flow:inventory","conformance-type":"import"},{"name":"flow-errors_2013-11-16","revision":"2013-11-16","schema":"/rests/modules/flow-errors?revision=2013-11-16","namespace":"urn:opendaylight:flow:errors","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","confirmed-commit","startup","candidate","writable-running"]},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"openflow-augments_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-augments?revision=2015-02-25","namespace":"urn:opendaylight:openflow:augments","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"opendaylight-group-types_2013-10-18","revision":"2013-10-18","schema":"/rests/modules/opendaylight-group-types?revision=2013-10-18","namespace":"urn:opendaylight:group:types","conformance-type":"import"},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"opendaylight-ipv6-arbitrary-bitmask-fields_2016-02-24","revision":"2016-02-24","schema":"/rests/modules/opendaylight-ipv6-arbitrary-bitmask-fields?revision=2016-02-24","namespace":"urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields","conformance-type":"import"},{"name":"sal-flows-batch_2016-03-14","revision":"2016-03-14","schema":"/rests/modules/sal-flows-batch?revision=2016-03-14","namespace":"urn:opendaylight:flows:service","conformance-type":"import"},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"openflow-types_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-types?revision=2013-07-31","namespace":"urn:opendaylight:openflow:common:types","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"odl-srm-ops_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-ops?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:ops","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"node-ssl-connection-error_2019-07-23","revision":"2019-07-23","schema":"/rests/modules/node-ssl-connection-error?revision=2019-07-23","namespace":"urn:opendaylight:node-ssl-connection-error:service","conformance-type":"import"},{"name":"openflow-protocol_2013-07-31","revision":"2013-07-31","schema":"/rests/modules/openflow-protocol?revision=2013-07-31","namespace":"urn:opendaylight:openflow:protocol","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"system-notifications_2013-09-27","revision":"2013-09-27","schema":"/rests/modules/system-notifications?revision=2013-09-27","namespace":"urn:opendaylight:openflow:system","conformance-type":"import"},{"name":"sal-flat-batch_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/sal-flat-batch?revision=2016-03-21","namespace":"urn:opendaylight:flat-batch:service","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"opendaylight-multipart-types_2017-01-12","revision":"2017-01-12","schema":"/rests/modules/opendaylight-multipart-types?revision=2017-01-12","namespace":"urn:opendaylight:multipart:types","conformance-type":"import"},{"name":"opendaylight-inventory_2013-08-19","revision":"2013-08-19","schema":"/rests/modules/opendaylight-inventory?revision=2013-08-19","namespace":"urn:opendaylight:inventory","conformance-type":"import"},{"name":"sal-queue_2015-03-05","revision":"2015-03-05","schema":"/rests/modules/sal-queue?revision=2015-03-05","namespace":"urn:opendaylight:queue:service","conformance-type":"import"},{"name":"sal-groups-batch_2016-03-15","revision":"2016-03-15","schema":"/rests/modules/sal-groups-batch?revision=2016-03-15","namespace":"urn:opendaylight:groups:service","conformance-type":"import"},{"name":"arbitrator-reconcile_2018-02-27","revision":"2018-02-27","schema":"/rests/modules/arbitrator-reconcile?revision=2018-02-27","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:app:arbitrator-reconcile:service","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"opendaylight-arbitrary-bitmask-fields_2016-01-30","revision":"2016-01-30","schema":"/rests/modules/opendaylight-arbitrary-bitmask-fields?revision=2016-01-30","namespace":"urn:opendaylight:arbitrary:bitmask:fields","conformance-type":"import"},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"opendaylight-meter-types_2013-09-18","revision":"2013-09-18","schema":"/rests/modules/opendaylight-meter-types?revision=2013-09-18","namespace":"urn:opendaylight:meter:types","conformance-type":"import"},{"name":"opendaylight-action-types_2013-11-12","revision":"2013-11-12","schema":"/rests/modules/opendaylight-action-types?revision=2013-11-12","namespace":"urn:opendaylight:action:types","conformance-type":"import"},{"name":"sal-role_2015-07-27","revision":"2015-07-27","schema":"/rests/modules/sal-role?revision=2015-07-27","namespace":"urn:opendaylight:role:service","conformance-type":"import"},{"name":"openflow-provider-config_2016-05-10","revision":"2016-05-10","schema":"/rests/modules/openflow-provider-config?revision=2016-05-10","namespace":"urn:opendaylight:params:xml:ns:yang:openflow:provider:config","conformance-type":"import"},{"name":"odl-serviceutils-upgrade_2018-07-02","revision":"2018-07-02","schema":"/rests/modules/odl-serviceutils-upgrade?revision=2018-07-02","namespace":"urn:opendaylight:serviceutils:upgrade","conformance-type":"import"},{"name":"opendaylight-match-types_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/opendaylight-match-types?revision=2013-10-26","namespace":"urn:opendaylight:model:match:types","conformance-type":"import"},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"reconciliation-result-state_2017-07-13","revision":"2017-07-13","schema":"/rests/modules/reconciliation-result-state?revision=2017-07-13","namespace":"urn:opendaylight:params:xml:ns:yang:openflowplugin:rf:state","conformance-type":"import"},{"name":"onf-extensions_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/onf-extensions?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf","conformance-type":"import"},{"name":"sal-table_2013-10-26","revision":"2013-10-26","schema":"/rests/modules/sal-table?revision=2013-10-26","namespace":"urn:opendaylight:table:service","conformance-type":"import"},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"opendaylight-direct-statistics_2016-05-11","revision":"2016-05-11","schema":"/rests/modules/opendaylight-direct-statistics?revision=2016-05-11","namespace":"urn:opendaylight:direct:statistics","conformance-type":"import"},{"name":"opendaylight-port-types_2013-09-25","revision":"2013-09-25","schema":"/rests/modules/opendaylight-port-types?revision=2013-09-25","namespace":"urn:opendaylight:flow:types:port","conformance-type":"import"},{"name":"sal-async-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/sal-async-config?revision=2017-06-19","namespace":"urn:opendaylight:async-config:service","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"opendaylight-queue-statistics_2013-12-16","revision":"2013-12-16","schema":"/rests/modules/opendaylight-queue-statistics?revision=2013-12-16","namespace":"urn:opendaylight:queue:statistics","conformance-type":"import"},{"name":"sal-bundle_2017-01-24","revision":"2017-01-24","schema":"/rests/modules/sal-bundle?revision=2017-01-24","namespace":"urn:opendaylight:openflowplugin:extension:onf:bundle:service","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"sal-meters-batch_2016-03-16","revision":"2016-03-16","schema":"/rests/modules/sal-meters-batch?revision=2016-03-16","namespace":"urn:opendaylight:meters:service","conformance-type":"import"},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"sal-experimenter-mp-message_2015-10-20","revision":"2015-10-20","schema":"/rests/modules/sal-experimenter-mp-message?revision=2015-10-20","namespace":"urn:opendaylight:experimenter-mp-message:service","conformance-type":"import"},{"name":"packet-processing_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/packet-processing?revision=2013-07-09","namespace":"urn:opendaylight:packet:service","conformance-type":"import"},{"name":"openflow-configuration_2014-06-30","revision":"2014-06-30","schema":"/rests/modules/openflow-configuration?revision=2014-06-30","namespace":"urn:opendaylight:openflow:config","conformance-type":"import"},{"name":"odl-srm-rpcs_2018-06-26","revision":"2018-06-26","schema":"/rests/modules/odl-srm-rpcs?revision=2018-06-26","namespace":"urn:opendaylight:serviceutils:srm:rpc","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"openflow-extensible-match_2015-02-25","revision":"2015-02-25","schema":"/rests/modules/openflow-extensible-match?revision=2015-02-25","namespace":"urn:opendaylight:openflow:oxm","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.471194" elapsed="0.003100"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.470968" elapsed="0.003362"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.470948" elapsed="0.003406"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.477044" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.474661" elapsed="0.002429"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.474411" elapsed="0.002714"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.474394" elapsed="0.002755"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.477725" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.477322" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.478056" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.477822" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.478652" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.478298" elapsed="0.000381"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.478137" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.477804" elapsed="0.000932"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.479259" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.478895" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.479682" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.479356" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.480217" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.479926" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.479766" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.479338" elapsed="0.000961"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:45.480449" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:45.481284" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.481002" elapsed="0.000308"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.481471" elapsed="0.002505"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:45.470422" elapsed="0.013689"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.484398" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.484226" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.484192" elapsed="0.000319"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:45.493401" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:45.485025" elapsed="0.008426"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:45.493530" elapsed="0.000098"/>
</return>
<msg time="2026-04-10T00:58:45.493870" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:45.443282" elapsed="0.050629"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:45.494138" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:45.494368" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-10T00:58:45.335478" elapsed="0.158917"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.494758" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.494481" elapsed="0.000718"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.494463" elapsed="0.000765"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:45.495264" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-10T00:58:45.331120" elapsed="0.164271"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.326790" elapsed="0.168645"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.326772" elapsed="0.168687"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:58:45.496082" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:45.495977" elapsed="0.000166"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.496203" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.496166" elapsed="0.000077"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.495959" elapsed="0.000306"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.496412" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:58:45.496531" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:45.495709" elapsed="0.000864"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.497107" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.496743" elapsed="0.000412"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.497805" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.497318" elapsed="0.000514"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.504014" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.503512" elapsed="0.000565"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.504743" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.504249" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:45.518689" level="INFO">GET Request : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:45.518772" level="INFO">GET Response : url=http://10.30.171.151:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":214107,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":214107,"Leader":"member-2-shard-inventory-config","LastIndex":214108,"RaftState":"Follower","LastApplied":214108,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","LastLogIndex":214108,"LastLeadershipChangeTime":"2026-04-10 00:58:02.216","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"266.7 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":214108,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":581775},"timestamp":1775782725,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:45.518930" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:45.510072" elapsed="0.008898"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.504886" elapsed="0.014208"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.519310" elapsed="0.000073"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.519124" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.504867" elapsed="0.014673"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.524094" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":214107,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":214107,"Leader":"member-2-shard-inventory-config","LastIndex":214108,"RaftState":"Follower","LastApplied":214108,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-2-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.169:2550\/user\/shardmanager-config\/member-2-shard-inventory-config","LastLogIndex":214108,"LastLeadershipChangeTime":"2026-04-10 00:58:02.216","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"266.7 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":null,"SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-2-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":214108,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-inventory-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":581775},"timestamp":1775782725,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.521423" elapsed="0.002797"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.520917" elapsed="0.003352"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.520876" elapsed="0.003461"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.527589" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.525000" elapsed="0.002668"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.524471" elapsed="0.003245"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.524430" elapsed="0.003353"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.529160" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.528352" elapsed="0.000905"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.529965" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.529396" elapsed="0.000666"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.530952" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.530494" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.530129" elapsed="0.000920"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.529355" elapsed="0.001759"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.532548" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.531754" elapsed="0.000920"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.533353" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.532815" elapsed="0.000637"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.534391" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.533950" elapsed="0.000487"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.533520" elapsed="0.000967"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.532775" elapsed="0.001794"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:45.534866" elapsed="0.000627"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:45.536495" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.535866" elapsed="0.000891"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.537029" elapsed="0.002701"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:45.520010" elapsed="0.019830"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.540091" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.539937" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.539917" elapsed="0.000302"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:45.543751" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:45.540365" elapsed="0.003415"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:45.543881" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:58:45.544040" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:45.498791" elapsed="0.045275"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:45.544155" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:45.544310" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:45.498047" elapsed="0.046289"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.545478" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782725, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.545012" elapsed="0.000495"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:45.545571" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:45.545786" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782725, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:45.544665" elapsed="0.001156"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:45.546177" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 214108, 'CommittedTransactionsCount': 0, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerIni...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.545979" elapsed="0.000225"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:45.546570" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.546358" elapsed="0.000238"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:45.546641" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:45.546791" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:45.325174" elapsed="0.221641"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-10T00:58:45.546871" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:45.547017" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:45.324373" elapsed="0.222669"/>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.547343" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.547122" elapsed="0.000467"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.547761" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.547614" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.547981" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.547839" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.547105" elapsed="0.000949"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:45.324201" elapsed="0.223876"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:44.874709" elapsed="0.673400"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:58:45.548150" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:45.548354" level="INFO">${leader_list} = [2]</msg>
<msg time="2026-04-10T00:58:45.548400" level="INFO">${follower_list} = [1, 3]</msg>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="PASS" start="2026-04-10T00:58:44.870690" elapsed="0.677734"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.548943" level="INFO">Length is 1.</msg>
<msg time="2026-04-10T00:58:45.549019" level="INFO">${leader_count} = 1</msg>
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-10T00:58:45.548673" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.549327" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.549111" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.549094" elapsed="0.000309"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.551646" level="INFO">Length is 1.</msg>
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="PASS" start="2026-04-10T00:58:45.549545" elapsed="0.002148"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:58:45.552085" level="INFO">${leader} = 2</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.551894" elapsed="0.000216"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-10T00:58:45.552158" elapsed="0.000028"/>
</return>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="PASS" start="2026-04-10T00:58:44.868022" elapsed="0.684293"/>
</kw>
<msg time="2026-04-10T00:58:45.552418" level="INFO">${inv_conf_leader} = 2</msg>
<msg time="2026-04-10T00:58:45.552466" level="INFO">${inv_conf_followers_list} = [1, 3]</msg>
<var>${inv_conf_leader}</var>
<var>${inv_conf_followers_list}</var>
<arg>10s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Get_Leader_And_Followers_For_Shard</arg>
<arg>shard_name=inventory</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:58:44.867408" elapsed="0.685081"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.553028" level="INFO">config inventory Leader is 2 and followers are [1, 3]</msg>
<arg>config inventory Leader is ${inv_conf_leader} and followers are ${inv_conf_followers_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.552738" elapsed="0.000334"/>
</kw>
<return>
<value>${inv_conf_leader}</value>
<value>${inv_conf_followers_list}</value>
<status status="PASS" start="2026-04-10T00:58:45.553114" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:45.553317" level="INFO">${inventory_leader} = 2</msg>
<msg time="2026-04-10T00:58:45.553363" level="INFO">${inventory_followers} = [1, 3]</msg>
<var>${inventory_leader}</var>
<var>${inventory_followers}</var>
<doc>Check Status for Inventory Config shard in OpenFlow application.</doc>
<status status="PASS" start="2026-04-10T00:58:44.865260" elapsed="0.688126"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:58:45.553765" level="INFO">${Follower_Node_1} = 1</msg>
<var>${Follower_Node_1}</var>
<arg>${Inventory_Followers}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.553579" elapsed="0.000211"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-10T00:58:45.554172" level="INFO">${Follower_Node_2} = 3</msg>
<var>${Follower_Node_2}</var>
<arg>${Inventory_Followers}</arg>
<arg>1</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.553990" elapsed="0.000206"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.554672" level="INFO">${Inventory_Leader_List} = [2]</msg>
<var>${Inventory_Leader_List}</var>
<arg>${inventory_leader}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:45.554365" elapsed="0.000333"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.555149" level="INFO">${Inventory_Follower_Node1_List} = [1]</msg>
<var>${Inventory_Follower_Node1_List}</var>
<arg>${Follower_Node_1}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:45.554865" elapsed="0.000309"/>
</kw>
<kw name="Log To Console" owner="BuiltIn">
<arg>${\n}</arg>
<doc>Logs the given message to the console.</doc>
<status status="PASS" start="2026-04-10T00:58:45.555327" elapsed="0.000487"/>
</kw>
<kw name="Log To Console" owner="BuiltIn">
<arg>The follower Node1 is ${Follower_Node_1}</arg>
<doc>Logs the given message to the console.</doc>
<status status="PASS" start="2026-04-10T00:58:45.555975" elapsed="0.000322"/>
</kw>
<kw name="Log To Console" owner="BuiltIn">
<arg>The follower Node2 is ${Follower_Node_2}</arg>
<doc>Logs the given message to the console.</doc>
<status status="PASS" start="2026-04-10T00:58:45.556456" elapsed="0.000348"/>
</kw>
<kw name="Log To Console" owner="BuiltIn">
<arg>The leader Node is ${Inventory_Leader}</arg>
<doc>Logs the given message to the console.</doc>
<status status="PASS" start="2026-04-10T00:58:45.556962" elapsed="0.000321"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.557806" level="INFO">${Follower_Node_1} = 1</msg>
<arg>${Follower_Node_1}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:45.557454" elapsed="0.000393"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.558356" level="INFO">${Follower_Node_2} = 3</msg>
<arg>${Follower_Node_2}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:45.558041" elapsed="0.000356"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.558886" level="INFO">${Inventory_Leader} = 2</msg>
<arg>${Inventory_Leader}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:45.558572" elapsed="0.000354"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.559398" level="INFO">${Inventory_Leader_List} = [2]</msg>
<arg>${Inventory_Leader_List}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:45.559082" elapsed="0.000356"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.559933" level="INFO">${Inventory_Follower_Node1_List} = [1]</msg>
<arg>${Inventory_Follower_Node1_List}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:45.559609" elapsed="0.000364"/>
</kw>
<doc>Find a leader and followers in the inventory config shard</doc>
<status status="PASS" start="2026-04-10T00:58:44.864913" elapsed="0.695117"/>
</kw>
<doc>Check Status for all shards and Finding a leader and followers in the inventory config shard</doc>
<status status="PASS" start="2026-04-10T00:58:37.589982" elapsed="7.970162"/>
</test>
<test id="s1-s4-t2" name="Initial Current Term Verification" line="41">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:58:45.563438" elapsed="0.000223"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:58:45.563170" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.564696" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.564584" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.564552" elapsed="0.000211"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.571333" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.571228" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.571210" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.572443" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:45.572063" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.572952" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:45.572650" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:45.573022" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:45.573177" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:45.571685" elapsed="0.001517"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.578808" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.578702" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.578683" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.580042" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.579937" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.579919" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:45.580551" level="INFO">${karaf_connection_index} = 471</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.580254" elapsed="0.000341"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:45.580985" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:45.580758" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:45.626224" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:45.581515" elapsed="0.044811"/>
</kw>
<msg time="2026-04-10T00:58:45.626486" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:45.626533" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.581172" elapsed="0.045423"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:45.691299" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "I "n "i "t "i "a "l "[C "[78CC "[A[78Cu
 "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:45.627151" elapsed="0.064517"/>
</kw>
<msg time="2026-04-10T00:58:45.691948" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:45.692022" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.626770" elapsed="0.065299"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.692576" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.692197" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.692161" elapsed="0.000506"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.693236" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "I "n "i "t "i "a "l "[C "[78CC "[A[78Cu
 "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.692822" elapsed="0.000514"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.693716" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.693441" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.693413" elapsed="0.000400"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:45.693853" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:45.695774" elapsed="0.000919"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.697007" elapsed="0.000600"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:45.697886" elapsed="0.000627"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:45.695026" elapsed="0.003614"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:45.694215" elapsed="0.004492"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:45.579634" elapsed="0.119175"/>
</kw>
<msg time="2026-04-10T00:58:45.698908" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:45.698953" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.579026" elapsed="0.119966"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:45.699182" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:58:45.699072" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.699052" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.699746" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.700104" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.700177" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:45.578346" elapsed="0.121947"/>
</kw>
<msg time="2026-04-10T00:58:45.700391" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:45.700436" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.573602" elapsed="0.126872"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.700839" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.700578" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.700535" elapsed="0.000384"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:45.573442" elapsed="0.127501"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.706836" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.706719" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.706699" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.708135" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.708023" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.708005" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:45.708727" level="INFO">${karaf_connection_index} = 473</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.708354" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:45.709158" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:45.708925" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:45.734632" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:45.709712" elapsed="0.025089"/>
</kw>
<msg time="2026-04-10T00:58:45.735009" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:45.735058" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.709349" elapsed="0.025748"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:45.789494" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "I "n "i "t "i "a "l "[C "[78CC "[A[78Cu
 "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:45.735781" elapsed="0.053905"/>
</kw>
<msg time="2026-04-10T00:58:45.789950" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:45.789998" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.735325" elapsed="0.054710"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.790402" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.790137" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.790108" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.790991" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "I "n "i "t "i "a "l "[C "[78CC "[A[78Cu
 "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.790660" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.791372" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.791148" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.791130" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:45.791488" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:45.793246" elapsed="0.000820"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.794356" elapsed="0.000539"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:45.795171" elapsed="0.000455"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:45.792473" elapsed="0.003258"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:45.791884" elapsed="0.003913"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:45.707672" elapsed="0.088225"/>
</kw>
<msg time="2026-04-10T00:58:45.795994" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:45.796038" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.707073" elapsed="0.089003"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:45.796268" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:45.796157" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.796138" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.796803" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.797502" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.797604" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:45.706293" elapsed="0.091426"/>
</kw>
<msg time="2026-04-10T00:58:45.797815" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:45.797859" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.701225" elapsed="0.096671"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.798234" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.797974" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.797957" elapsed="0.000355"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:45.701076" elapsed="0.097260"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.804138" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.804031" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.804012" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.805408" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.805301" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.805283" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:45.805949" level="INFO">${karaf_connection_index} = 475</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.805645" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:45.806362" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:45.806136" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:45.842231" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:45.806910" elapsed="0.035426"/>
</kw>
<msg time="2026-04-10T00:58:45.842503" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:45.842573" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.806566" elapsed="0.036047"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:45.912511" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "I "n "i "t "i "a "l "[C "[78CC "[A[78Cu
 "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:45.843133" elapsed="0.069580"/>
</kw>
<msg time="2026-04-10T00:58:45.912925" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:45.912974" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.842788" elapsed="0.070225"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.913433" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.913135" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.913105" elapsed="0.000419"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.914058" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "I "n "i "t "i "a "l "[C "[78CC "[A[78Cu
 "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.913706" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.914529" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.914255" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.914235" elapsed="0.000395"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:45.914667" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:45.916269" elapsed="0.000817"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.917385" elapsed="0.000499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:45.918159" 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-04-10T00:58:45.915595" elapsed="0.003112"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:45.914980" elapsed="0.003793"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:45.804936" elapsed="0.113938"/>
</kw>
<msg time="2026-04-10T00:58:45.918970" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:45.919014" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.804359" elapsed="0.114693"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:45.919251" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:58:45.919131" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.919111" elapsed="0.000230"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.919781" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.920196" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.920285" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:45.803681" elapsed="0.116719"/>
</kw>
<msg time="2026-04-10T00:58:45.920499" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:45.920547" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.798643" elapsed="0.121958"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.920945" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.920683" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.920664" elapsed="0.000359"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:45.798477" elapsed="0.122571"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:45.573264" elapsed="0.347819"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:58:45.570858" elapsed="0.350293"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:58:45.564285" elapsed="0.356928"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.563866" elapsed="0.357404"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:58:45.560973" elapsed="0.360367"/>
</kw>
<kw name="Get_Current_Term_Of_Shard_At_Member">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.925520" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.925191" elapsed="0.000374"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:45.925616" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:58:45.925771" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:45.924829" elapsed="0.000967"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.930201" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.925866" elapsed="0.004417"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.925848" elapsed="0.004465"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:58:45.931034" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:58:45.930923" elapsed="0.000176"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.931161" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.931123" elapsed="0.000080"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.930904" elapsed="0.000321"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.931378" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T00:58:45.931501" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:58:45.930597" elapsed="0.000931"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.932143" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.931749" elapsed="0.000421"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.932828" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.932329" elapsed="0.000527"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.938678" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.938397" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.939210" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.938958" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:45.949855" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:45.949946" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":5003,"SnapshotIndex":214107,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":214107,"Leader":"member-2-shard-inventory-config","LastIndex":214108,"RaftState":"Leader","LastApplied":214108,"LastCommittedTransactionTime":"2026-04-10 00:58:29.866","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":214108,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.330","active":true,"matchIndex":214108,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":214109},{"timeSinceLastActivity":"00:00:00.331","active":true,"matchIndex":214108,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":214109}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"625.7 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":3,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":214108,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10006,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":592773},"timestamp":1775782725,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:45.950136" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:45.941539" elapsed="0.008636"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.939322" elapsed="0.010915"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.950659" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.950275" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.939303" elapsed="0.011481"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.956119" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":5003,"SnapshotIndex":214107,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":214107,"Leader":"member-2-shard-inventory-config","LastIndex":214108,"RaftState":"Leader","LastApplied":214108,"LastCommittedTransactionTime":"2026-04-10 00:58:29.866","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":214108,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.330","active":true,"matchIndex":214108,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":214109},{"timeSinceLastActivity":"00:00:00.331","active":true,"matchIndex":214108,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":214109}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"625.7 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":3,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":214108,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10006,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":592773},"timestamp":1775782725,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.952323" elapsed="0.003886"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.951997" elapsed="0.004268"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.951972" elapsed="0.004334"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.960217" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:45.956736" elapsed="0.003549"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.956389" elapsed="0.003947"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.956364" elapsed="0.004009"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.961195" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.960646" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.961713" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.961335" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.962505" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.962063" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.961831" elapsed="0.000792"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.961309" elapsed="0.001345"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.963545" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.962933" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:45.964054" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:45.963716" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.964685" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:45.964353" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:45.964169" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.963690" elapsed="0.001081"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:45.964930" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:45.965794" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.965455" elapsed="0.000367"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.965982" elapsed="0.002567"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:45.951373" elapsed="0.017286"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.968854" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.968741" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.968722" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:45.972263" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:45.969070" elapsed="0.003224"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:45.972346" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:58:45.972511" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:45.933788" elapsed="0.038750"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:45.972620" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:45.972794" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:58:45.933077" elapsed="0.039746"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.973949" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782725, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:45.973449" elapsed="0.000529"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:45.974026" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:45.974204" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782725, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:45.973055" elapsed="0.001180"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:45.974621" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 214108, 'CommittedTransactionsCount': 3, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.974394" elapsed="0.000255"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:45.975005" level="INFO">${raft_property} = 7</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.974806" elapsed="0.000226"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:58:45.975079" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:45.975271" level="INFO">${current_term_value} = 7</msg>
<var>${current_term_value}</var>
<arg>CurrentTerm</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${Inventory_Leader}</arg>
<arg>${verify_restconf}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:58:45.921966" elapsed="0.053336"/>
</kw>
<return>
<value>${current_term_value}</value>
<status status="PASS" start="2026-04-10T00:58:45.975410" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:45.975596" level="INFO">${current_term_value_before} = 7</msg>
<var>${current_term_value_before}</var>
<doc>Find a Raft Property Values From Shard Member</doc>
<status status="PASS" start="2026-04-10T00:58:45.921524" elapsed="0.054098"/>
</kw>
<kw name="Log To Console" owner="BuiltIn">
<arg>Current Term is ${current_term_value_before}</arg>
<doc>Logs the given message to the console.</doc>
<status status="PASS" start="2026-04-10T00:58:45.975783" elapsed="0.000408"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.976711" level="INFO">${current_term_value_before} = 7</msg>
<arg>${current_term_value_before}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:58:45.976367" elapsed="0.000386"/>
</kw>
<doc>Verifying current term for Leader Node Before</doc>
<status status="PASS" start="2026-04-10T00:58:45.560424" elapsed="0.416442"/>
</test>
<test id="s1-s4-t3" name="Add Bulk Flow From Follower" line="47">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:58:45.980443" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:58:45.980176" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.981723" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.981612" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.981594" elapsed="0.000199"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.987130" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.987007" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.986984" elapsed="0.000226"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.988439" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:45.987993" elapsed="0.000476"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:45.989019" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:45.988690" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:45.989092" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:58:45.989267" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:45.987585" elapsed="0.001724"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.995829" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.995634" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.995590" elapsed="0.000341"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:45.997447" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:45.997328" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:45.997308" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:45.998115" level="INFO">${karaf_connection_index} = 471</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:45.997764" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:45.998816" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:45.998317" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:46.032737" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:45.999452" elapsed="0.033538"/>
</kw>
<msg time="2026-04-10T00:58:46.033235" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:46.033287" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.999018" elapsed="0.034306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:46.106716" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:46.034137" elapsed="0.072749"/>
</kw>
<msg time="2026-04-10T00:58:46.107073" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:46.107120" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:46.033634" elapsed="0.073524"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.107685" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:46.107360" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.107324" elapsed="0.000454"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.108291" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:46.107929" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.108692" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:46.108450" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.108431" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:46.108814" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:46.110528" 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-04-10T00:58:46.111656" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:46.112426" elapsed="0.000408"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:46.109821" elapsed="0.003170"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:46.109202" elapsed="0.003868"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:45.996991" elapsed="0.116184"/>
</kw>
<msg time="2026-04-10T00:58:46.113273" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:46.113319" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.996161" elapsed="0.117196"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:46.113552" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-10T00:58:46.113438" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.113419" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.114077" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.114473" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:46.114572" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:45.994977" elapsed="0.119728"/>
</kw>
<msg time="2026-04-10T00:58:46.114807" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:46.114870" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.989767" elapsed="0.125146"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.115264" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:46.114994" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.114976" elapsed="0.000370"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:45.989614" elapsed="0.125756"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:46.121335" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:46.121224" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.121204" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:46.122897" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:46.122767" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.122744" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:46.123488" level="INFO">${karaf_connection_index} = 473</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:46.123117" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:46.123955" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:46.123722" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:46.159007" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:46.124496" elapsed="0.034692"/>
</kw>
<msg time="2026-04-10T00:58:46.159423" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:46.159472" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:46.124148" elapsed="0.035362"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:46.229782" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:46.160226" elapsed="0.069711"/>
</kw>
<msg time="2026-04-10T00:58:46.230127" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:46.230176" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:46.159786" elapsed="0.070434"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.230669" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:46.230368" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.230332" elapsed="0.000425"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.231260" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:46.230906" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.231661" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:46.231418" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.231400" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:46.231781" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:46.233719" elapsed="0.000902"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:46.234915" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:46.235683" elapsed="0.000361"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:46.233014" elapsed="0.003133"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:46.232125" elapsed="0.004088"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:46.122367" elapsed="0.113948"/>
</kw>
<msg time="2026-04-10T00:58:46.236408" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:46.236458" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:46.121645" elapsed="0.114861"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:46.236732" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:46.236622" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.236601" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.237250" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.237647" elapsed="0.000105"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:46.237807" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:46.120822" elapsed="0.117099"/>
</kw>
<msg time="2026-04-10T00:58:46.238017" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:46.238061" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:46.115692" elapsed="0.122406"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.238466" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:46.238175" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.238157" elapsed="0.000389"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:46.115509" elapsed="0.123078"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:46.244296" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:46.244188" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.244170" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:46.245507" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:46.245399" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.245381" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:46.246055" level="INFO">${karaf_connection_index} = 475</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:46.245749" elapsed="0.000332"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:46.246469" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:46.246244" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:46.281096" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:46.247032" elapsed="0.034172"/>
</kw>
<msg time="2026-04-10T00:58:46.281366" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:46.281412" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:46.246695" elapsed="0.034754"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:46.347440" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:46.281993" elapsed="0.065661"/>
</kw>
<msg time="2026-04-10T00:58:46.347864" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:46.347911" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:46.281651" elapsed="0.066297"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.348326" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:46.348047" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.348020" elapsed="0.000389"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.348927" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "A "d "d "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:46.348580" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.349299" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:46.349082" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.349064" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:46.349411" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:46.350963" elapsed="0.000919"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:46.352167" elapsed="0.000540"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:46.352981" elapsed="0.000369"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:46.350305" elapsed="0.003147"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:46.349743" elapsed="0.003772"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:46.245099" elapsed="0.108543"/>
</kw>
<msg time="2026-04-10T00:58:46.353738" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:46.353783" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:46.244519" elapsed="0.109301"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:46.354005" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:58:46.353897" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.353879" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.354497" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.355127" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:46.355202" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:46.243839" elapsed="0.111474"/>
</kw>
<msg time="2026-04-10T00:58:46.355409" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:46.355453" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:46.238870" elapsed="0.116620"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.355870" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:46.355583" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.355564" elapsed="0.000385"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:46.238725" elapsed="0.117248"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:45.989390" elapsed="0.366617"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:58:45.986583" elapsed="0.369487"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:58:45.981306" elapsed="0.374824"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:45.980875" elapsed="0.375303"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:58:45.977760" elapsed="0.378476"/>
</kw>
<kw name="Add Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Add Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.367262" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:46.366955" elapsed="0.000333"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:46.367334" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:46.367481" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:46.366603" elapsed="0.000903"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.381405" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:46.381151" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.381863" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:46.381624" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.382354" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:46.382106" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.382809" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:46.382568" elapsed="0.000284"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:46.383683" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:58:46.383459" elapsed="0.000250"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:58:46.384061" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:58:46.383863" elapsed="0.000225"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:58:46.384241" elapsed="0.000213"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.384872" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:46.384627" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:58:46.384956" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:46.385110" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:58:46.383053" elapsed="0.002081"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:46.434481" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Content-Length': '403', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:58:46.434687" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:46.434955" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:46.387476" elapsed="0.047542"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:46.385203" elapsed="0.049940"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.435699" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:46.435221" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.385186" elapsed="0.050716"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.444295" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:46.438505" elapsed="0.005890"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:46.437972" elapsed="0.006502"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.437926" elapsed="0.006604"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.447672" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:46.445241" elapsed="0.002478"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:46.444695" elapsed="0.003058"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.444656" elapsed="0.003121"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.448368" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:46.447965" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.448722" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:46.448465" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.449296" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:46.448997" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:46.448831" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.448447" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.449913" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:46.449538" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.450239" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:46.450008" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.450788" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:46.450476" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:46.450318" elapsed="0.000676"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.449990" elapsed="0.001028"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:46.451179" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:46.452018" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:46.451720" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:46.452197" elapsed="0.002780"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:46.436844" elapsed="0.018209"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:46.455254" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:46.455139" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.455115" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:46.457976" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:46.455478" elapsed="0.002524"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:46.458050" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:58:46.458215" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:46.378392" elapsed="0.079847"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:46.458305" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:46.458455" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:58:46.375786" elapsed="0.082694"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:46.458532" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:58:46.458700" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:46.366142" elapsed="0.092582"/>
</kw>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Add Bulk Flow in member 1 according to ${json_body_add}.</doc>
<status status="PASS" start="2026-04-10T00:58:46.361464" elapsed="0.097325"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.466023" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:46.465727" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:46.466094" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:46.466242" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:46.465364" elapsed="0.000902"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.473346" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:46.473087" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.473822" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:46.473576" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:46.480450" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:46.480506" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:46 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:46 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782726,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:46.480664" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:46.476028" elapsed="0.004663"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:46.473930" elapsed="0.006804"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.480911" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:46.480760" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.473913" elapsed="0.007083"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.484449" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782726,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:46.482033" elapsed="0.002463"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:46.481811" elapsed="0.002720"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.481792" elapsed="0.002779"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.487880" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:46.484851" elapsed="0.003092"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:46.484629" elapsed="0.003362"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.484612" elapsed="0.003412"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.488782" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:46.488248" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.489273" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:46.488917" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.490047" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:46.489632" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:46.489385" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.488893" elapsed="0.001270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.490907" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:46.490384" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.491362" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:46.491040" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.492261" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:46.491747" elapsed="0.000554"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:46.491497" elapsed="0.000855"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.491016" elapsed="0.001365"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:46.492620" elapsed="0.000489"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:46.493817" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:46.493396" elapsed="0.000457"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:46.494066" elapsed="0.002465"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:46.481372" elapsed="0.015248"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:46.496932" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:58:46.496704" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:46.496684" elapsed="0.000337"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:46.497175" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:46.497248" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:58:46.499685" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782726,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:46.466615" elapsed="0.033099"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:46.499767" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:46.499943" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782726,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:46.464885" elapsed="0.035125"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.501053" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782726, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:46.500640" elapsed="0.000444"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:46.501133" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:46.501304" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782726, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:46.500245" elapsed="0.001138"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:46.501798" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:46.501597" elapsed="0.000234"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.502337" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:46.502028" elapsed="0.000336"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.502904" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:46.502538" elapsed="0.000398"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:46.503568" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:46.503155" elapsed="0.000504">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:46.460000" elapsed="0.043786">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.515219" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:47.514690" elapsed="0.000586"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:47.515379" elapsed="0.000082"/>
</return>
<msg time="2026-04-10T00:58:47.515709" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:47.514075" elapsed="0.001674"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.525157" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:47.524884" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.525628" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:47.525366" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:47.532038" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:47.532096" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:47 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:47 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782727,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:47.532199" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:47.527864" elapsed="0.004361"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:47.525747" elapsed="0.006522"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.532490" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:47.532297" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.525726" elapsed="0.006878"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.537206" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782727,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:47.533781" elapsed="0.003496"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:47.533446" elapsed="0.003880"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.533420" elapsed="0.003940"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.541370" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:47.537779" elapsed="0.003639"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:47.537439" elapsed="0.004014"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.537415" elapsed="0.004062"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.542177" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:47.541731" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.542523" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:47.542281" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.543102" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:47.542792" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:47.542626" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.542262" elapsed="0.000926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.543741" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:47.543350" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.544078" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:47.543841" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.544667" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:47.544323" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:47.544160" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.543823" elapsed="0.000928"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:47.544905" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:47.545728" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:47.545420" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:47.545910" elapsed="0.002427"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:47.532970" elapsed="0.015431"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:47.548638" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:58:47.548473" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.548453" 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-04-10T00:58:47.548883" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:47.548955" elapsed="0.000014"/>
</return>
<msg time="2026-04-10T00:58:47.551313" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782727,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:47.516290" elapsed="0.035052"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:47.551394" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:47.551571" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782727,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:47.513171" elapsed="0.038443"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.552610" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782727, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:47.552182" elapsed="0.000457"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:47.552687" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:47.552840" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782727, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:47.551843" elapsed="0.001023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:47.553219" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:47.553042" elapsed="0.000202"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.553737" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:47.553417" elapsed="0.000347"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.554234" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:47.553970" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:58:47.554430" elapsed="0.000327"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:58:47.504804" elapsed="0.050012"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:58:46.459406" elapsed="1.095459"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 1.</doc>
<status status="PASS" start="2026-04-10T00:58:46.459014" elapsed="1.095911"/>
</kw>
<arg>${temp_json_config_add}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Add Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:58:46.360982" elapsed="1.193994"/>
</kw>
<doc>10000 Flows added via Follower Node1 and verify it gets applied in all instances.</doc>
<status status="PASS" start="2026-04-10T00:58:45.977172" elapsed="1.577919"/>
</test>
<test id="s1-s4-t4" name="Get Bulk Flows And Verify In Cluster" line="51">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:58:47.558658" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:58:47.558374" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:47.559921" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:47.559810" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.559792" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:47.565228" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:47.565119" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.565101" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.566306" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:47.565926" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.566861" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:47.566494" elapsed="0.000395"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:47.566934" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:58:47.567123" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:47.565527" elapsed="0.001622"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:47.573016" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:47.572909" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.572890" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:47.574259" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:47.574154" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.574137" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:47.574797" level="INFO">${karaf_connection_index} = 471</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:47.574475" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:47.575213" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:47.574985" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:47.618935" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:47.575762" elapsed="0.043296"/>
</kw>
<msg time="2026-04-10T00:58:47.619235" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:47.619284" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:47.575402" elapsed="0.043919"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:47.707362" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "A "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:47.619915" elapsed="0.087763"/>
</kw>
<msg time="2026-04-10T00:58:47.707891" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:47.707942" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:47.619514" elapsed="0.088468"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.708399" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:47.708093" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.708063" elapsed="0.000424"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.709032" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "A "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:47.708667" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.709421" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:47.709196" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.709178" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:47.709540" 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>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:47.711174" elapsed="0.000815"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:47.712273" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:47.713034" elapsed="0.000361"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:47.710489" elapsed="0.003010"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:47.709882" elapsed="0.003702"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:47.573854" elapsed="0.139836"/>
</kw>
<msg time="2026-04-10T00:58:47.713790" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:47.713837" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:47.573236" elapsed="0.140639"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:47.714065" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:58:47.713955" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.713936" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.714688" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.715032" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:47.715114" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:47.572521" elapsed="0.142706"/>
</kw>
<msg time="2026-04-10T00:58:47.715322" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:47.715367" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:47.567530" elapsed="0.147876"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.715760" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:47.715482" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.715465" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:58:47.567385" elapsed="0.148477"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:47.721537" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:47.721431" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.721413" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:47.722845" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:47.722736" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.722718" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:47.723362" level="INFO">${karaf_connection_index} = 473</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:47.723062" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:47.723847" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:47.723618" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:47.759124" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:47.724379" elapsed="0.034850"/>
</kw>
<msg time="2026-04-10T00:58:47.759393" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:47.759439" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:47.724037" elapsed="0.035439"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:47.830903" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "A "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:47.760033" elapsed="0.071008"/>
</kw>
<msg time="2026-04-10T00:58:47.831208" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:47.831255" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:47.759681" elapsed="0.071633"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.831675" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:47.831404" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.831380" elapsed="0.000380"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.832219" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "A "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:47.831907" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.832613" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:47.832373" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.832355" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:47.832730" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:47.834457" elapsed="0.000797"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:47.835581" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:47.836308" elapsed="0.000382"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:47.833596" elapsed="0.003196"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:47.833020" elapsed="0.003836"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:47.722413" elapsed="0.114543"/>
</kw>
<msg time="2026-04-10T00:58:47.837052" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:47.837096" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:47.721819" elapsed="0.115313"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:47.837319" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:58:47.837211" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.837192" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.837872" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.838214" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:47.838287" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:47.721089" elapsed="0.117307"/>
</kw>
<msg time="2026-04-10T00:58:47.838491" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:47.838536" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:47.716136" elapsed="0.122453"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.838962" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:47.838693" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.838664" elapsed="0.000381"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:47.715993" elapsed="0.123076"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:47.844847" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:47.844735" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.844714" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:58:47.846109" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:47.846000" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.845982" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:47.846641" level="INFO">${karaf_connection_index} = 475</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:47.846321" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:58:47.847047" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:58:47.846827" elapsed="0.000246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:58:47.878475" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:58:47.847609" elapsed="0.030998"/>
</kw>
<msg time="2026-04-10T00:58:47.878777" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:58:47.878823" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:47.847232" elapsed="0.031627"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:58:47.966049" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "A "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:58:47.879407" elapsed="0.086822"/>
</kw>
<msg time="2026-04-10T00:58:47.966415" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:58:47.966462" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:47.879042" elapsed="0.087459"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.966922" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:47.966624" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.966597" elapsed="0.000414"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.967493" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "G "e "t "[C "B "u "l "k "[78C[C "[A[78CF
 "l "o "w "s "[C "A "n "d "[C "V "e "r "i "f "y "[C "I "n "[C "C "l "u "s "t "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:47.967158" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.967892" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:47.967673" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.967655" elapsed="0.000382"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:58:47.968075" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:47.969706" elapsed="0.000790"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:58:47.970822" elapsed="0.000468"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:58:47.971585" elapsed="0.000422"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:58:47.969023" elapsed="0.003092"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:58:47.968382" elapsed="0.003799"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:58:47.845694" elapsed="0.126591"/>
</kw>
<msg time="2026-04-10T00:58:47.972380" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:47.972425" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:47.845070" elapsed="0.127393"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:58:47.972735" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:58:47.972546" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.972523" elapsed="0.000304"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.973234" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.973889" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:58:47.973965" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:58:47.844250" elapsed="0.129828"/>
</kw>
<msg time="2026-04-10T00:58:47.974176" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:58:47.974221" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:47.839345" elapsed="0.134912"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:47.974609" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:47.974334" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:47.974317" elapsed="0.000374"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:58:47.839200" elapsed="0.135521"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:47.567208" elapsed="0.407549"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:58:47.564753" elapsed="0.410062"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:58:47.559499" elapsed="0.415377"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:58:47.559075" elapsed="0.415851"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:58:47.555979" elapsed="0.419003"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.985479" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:58:47.985057" elapsed="0.000451"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.986078" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:58:47.985718" elapsed="0.000389"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:58:47.986178" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:58:47.986348" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:58:47.984574" elapsed="0.001800"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:47.997864" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:47.997478" elapsed="0.000419"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:47.997956" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:58:47.998126" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:47.997088" elapsed="0.001064"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.013663" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:48.013325" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.014132" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:48.013889" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.014599" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:48.014334" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.015085" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:48.014831" elapsed="0.000300"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:48.016057" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:58:48.015840" elapsed="0.000245"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:58:48.016420" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:58:48.016241" elapsed="0.000205"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:58:48.016618" elapsed="0.000205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.017338" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:48.017019" elapsed="0.000366"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:58:48.017431" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:58:48.017629" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:58:48.015360" elapsed="0.002295"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:48.031949" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:58:48.032014" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:48.032124" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:48.019995" elapsed="0.012157"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:48.017738" elapsed="0.014468"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:48.032609" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:48.032240" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:48.017718" elapsed="0.015088"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.041150" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:48.035229" elapsed="0.006032"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:48.034726" elapsed="0.006688"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:48.034685" elapsed="0.006791"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.044701" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:48.042144" elapsed="0.002604"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:48.041638" elapsed="0.003144"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:48.041597" elapsed="0.003209"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.045425" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:48.044990" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:48.045801" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:48.045533" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.046432" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:48.046128" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:48.045959" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:48.045513" elapsed="0.001003"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.047054" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:48.046692" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:48.047381" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:48.047149" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.047937" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:48.047640" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:48.047462" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:48.047132" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:48.048177" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:48.049000" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:48.048708" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:48.049182" elapsed="0.002719"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:48.033694" elapsed="0.018273"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:58:48.052150" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:58:48.052040" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:48.052022" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:58:48.054863" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:58:48.052367" elapsed="0.002523"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:58:48.054938" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:58:48.055141" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:48.010060" elapsed="0.045107"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:48.055236" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:58:48.055387" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:58:48.006942" elapsed="0.048469"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:48.055464" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:58:48.055646" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:47.996324" elapsed="0.059349"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:58:47.991526" elapsed="0.064215"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:47.986649" elapsed="0.069126"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:47.986490" elapsed="0.069320"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.067687" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:48.067356" elapsed="0.000358"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:48.067760" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:48.067908" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:48.066982" elapsed="0.000951"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.075070" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:48.074813" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.075520" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:48.075275" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:48.082790" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:48.082847" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:48 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:48 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782728,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:48.082939" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:48.077913" elapsed="0.005052"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:48.075651" elapsed="0.007357"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:48.083189" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:48.083035" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:48.075633" elapsed="0.007642"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.087147" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782728,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:48.084298" elapsed="0.002917"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:48.084077" elapsed="0.003187"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:48.084059" elapsed="0.003238"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.091170" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:48.087712" elapsed="0.003524"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:48.087375" elapsed="0.003909"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:48.087351" elapsed="0.003967"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.092103" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:48.091577" elapsed="0.000564"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:48.092599" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:48.092240" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.093365" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:48.092946" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:48.092717" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:48.092214" elapsed="0.001267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.094279" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:48.093729" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:48.094639" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:48.094388" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.095171" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:48.094880" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:48.094720" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:48.094371" elapsed="0.000882"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:48.095410" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:48.096217" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:48.095941" elapsed="0.000302"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:48.096398" elapsed="0.002467"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:48.083657" elapsed="0.015271"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:48.099144" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:58:48.099036" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:48.099017" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:48.099380" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:48.099451" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:58:48.102043" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782728,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:48.068335" elapsed="0.033738"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:48.102126" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:48.102277" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782728,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:48.066509" elapsed="0.035794"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.103269" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782728, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:48.102880" elapsed="0.000417"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:48.103345" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:48.103497" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782728, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:48.102521" elapsed="0.001002"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:48.103899" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:48.103720" elapsed="0.000204"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.104393" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:48.104097" elapsed="0.000322"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.104871" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:48.104611" elapsed="0.000286"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:48.105413" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:48.105067" elapsed="0.000421">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:48.061914" elapsed="0.043704">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:49.114710" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:49.114245" elapsed="0.000503"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:49.114830" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:58:49.115036" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:49.113761" elapsed="0.001302"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:49.124265" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:49.123885" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:49.124889" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:49.124529" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:49.137462" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:49.137540" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:49 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:49 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782729,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:49.137787" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:49.127973" elapsed="0.009857"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:49.125055" elapsed="0.012838"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:49.138161" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:49.137942" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:49.125025" elapsed="0.013264"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:49.142525" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782729,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:49.139769" elapsed="0.002837"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:49.139433" elapsed="0.003210"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:49.139405" elapsed="0.003263"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:49.147769" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:49.142993" elapsed="0.004874"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:49.142726" elapsed="0.005205"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:49.142709" elapsed="0.005270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:49.149038" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:49.148311" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:49.149661" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:49.149207" elapsed="0.000554"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:49.150721" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:49.150108" elapsed="0.000664"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:49.149802" elapsed="0.001034"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:49.149176" elapsed="0.001699"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:49.151789" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:49.151242" elapsed="0.000580"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:49.152197" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:49.151910" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:49.152920" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:49.152504" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:49.152292" elapsed="0.000710"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:49.151888" elapsed="0.001142"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:49.153234" elapsed="0.000466"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:49.154344" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:49.153930" elapsed="0.000448"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:49.154597" elapsed="0.003462"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:49.138836" elapsed="0.019319"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:49.158408" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-04-10T00:58:49.158251" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:49.158226" elapsed="0.000322"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:49.158731" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:49.158804" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:58:49.161863" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782729,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:49.115541" elapsed="0.046362"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:49.161973" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:58:49.162166" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782729,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:49.113064" elapsed="0.049197"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:49.163700" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782729, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:49.163064" elapsed="0.000676"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:49.163806" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:58:49.164027" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782729, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:49.162600" elapsed="0.001464"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:49.164547" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:49.164307" elapsed="0.000291"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:49.165270" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:49.164845" elapsed="0.000463"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:49.165950" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:49.165575" elapsed="0.000410"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:49.166734" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:49.166222" elapsed="0.000614">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:49.106363" elapsed="0.060625">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:50.179391" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:50.178879" elapsed="0.000558"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:50.179514" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T00:58:50.179767" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:50.178356" elapsed="0.001447"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:50.188028" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:50.187765" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:50.188481" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:50.188235" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:50.195729" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:50.195791" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:50 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:50 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782730,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:50.195896" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:50.190843" elapsed="0.005079"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:50.188618" elapsed="0.007353"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:50.196166" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:50.196002" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:50.188597" elapsed="0.007657"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:50.200449" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782730,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:50.197368" elapsed="0.003151"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:50.197137" elapsed="0.003455"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:50.197118" elapsed="0.003510"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:50.204528" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:50.201019" elapsed="0.003605"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:50.200708" elapsed="0.003965"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:50.200684" elapsed="0.004023"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:50.205594" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:50.205026" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:50.206068" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:50.205736" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:50.206858" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:50.206409" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:50.206182" elapsed="0.000763"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:50.205710" elapsed="0.001265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:50.207800" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:50.207203" elapsed="0.000635"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:50.208266" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:50.207938" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:50.208873" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:50.208574" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:50.208379" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:50.207914" elapsed="0.001043"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:50.209112" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:50.209935" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:50.209645" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:50.210118" elapsed="0.002454"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:50.196687" elapsed="0.015952"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:50.212821" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:58:50.212711" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:50.212693" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:50.213063" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:50.213134" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:58:50.215544" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782730,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:50.180281" elapsed="0.035312"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:50.215647" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:50.215801" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782730,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:50.177701" elapsed="0.038127"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:50.216806" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782730, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:50.216395" elapsed="0.000440"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:50.216883" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:50.217037" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782730, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:50.216052" elapsed="0.001012"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:50.217424" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:50.217243" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:50.217965" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:50.217643" elapsed="0.000352"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:50.218486" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:50.218215" elapsed="0.000297"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:50.219056" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:50.218705" elapsed="0.000422">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:50.167954" elapsed="0.051282">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:51.232970" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:51.232541" elapsed="0.000464"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:51.233085" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:58:51.233578" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:51.232164" elapsed="0.001444"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:51.241060" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:51.240751" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:51.241535" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:51.241284" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:51.249664" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:51.249746" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:51 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:51 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782731,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:51.249877" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:51.243968" elapsed="0.005944"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:51.241712" elapsed="0.008260"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:51.250272" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:51.250010" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:51.241685" elapsed="0.008709"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:51.255462" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782731,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:51.251839" elapsed="0.003693"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:51.251504" elapsed="0.004102"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:51.251479" elapsed="0.004163"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:51.261062" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:51.256082" elapsed="0.005029"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:51.255721" elapsed="0.005425"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:51.255697" elapsed="0.005473"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:51.261779" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:51.261353" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:51.262117" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:51.261878" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:51.262794" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:51.262405" elapsed="0.000424"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:51.262198" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:51.261860" elapsed="0.001040"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:51.263521" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:51.263109" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:51.263870" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:51.263636" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:51.264465" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:51.264170" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:51.264007" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:51.263619" elapsed="0.000946"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:51.264722" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:51.265617" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:51.265227" elapsed="0.000417"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:51.265800" elapsed="0.002612"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:51.250914" elapsed="0.017576"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:51.268704" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:58:51.268581" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:51.268547" elapsed="0.000253"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:51.268951" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:51.269023" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:58:51.271501" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782731,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:51.233984" elapsed="0.037548"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:51.271610" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:58:51.271778" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782731,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:51.231599" elapsed="0.040205"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:51.272823" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782731, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:51.272389" elapsed="0.000463"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:51.272901" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:51.273062" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782731, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:51.272035" elapsed="0.001060"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:51.273482" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:51.273296" elapsed="0.000212"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:51.274046" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:51.273736" elapsed="0.000337"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:51.274576" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:51.274247" elapsed="0.000357"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:51.275138" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:51.274786" elapsed="0.000424">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:51.220224" elapsed="0.055096">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:52.287665" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:52.287065" elapsed="0.000650"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:52.287802" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:58:52.288053" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:52.286264" elapsed="0.001827"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:52.353204" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:52.352660" elapsed="0.000610"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:52.353730" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:52.353443" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:52.361259" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:52.361325" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:52 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:52 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782732,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:52.361445" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:52.356071" elapsed="0.005401"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:52.353859" elapsed="0.007659"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:52.361744" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:52.361578" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:52.353835" elapsed="0.007998"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:52.365807" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782732,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:52.362951" elapsed="0.002971"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:52.362716" elapsed="0.003284"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:52.362697" elapsed="0.003361"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:52.370836" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:52.366745" elapsed="0.004140"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:52.366188" elapsed="0.004734"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:52.366148" elapsed="0.004799"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:52.371573" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:52.371142" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:52.371918" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:52.371675" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:52.372471" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:52.372165" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:52.371999" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:52.371657" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:52.373142" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:52.372733" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:52.373474" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:52.373239" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:52.374029" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:52.373733" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:52.373571" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:52.373221" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:52.374269" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:52.375103" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:52.374801" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:52.375283" elapsed="0.002661"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:52.362239" elapsed="0.015776"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:52.378266" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:58:52.378150" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:52.378130" elapsed="0.000235"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:52.378518" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:52.378608" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:58:52.381014" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782732,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:52.288888" elapsed="0.092155"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:52.381098" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:52.381254" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782732,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:52.285435" elapsed="0.095845"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:52.382317" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782732, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:52.381907" elapsed="0.000438"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:52.382393" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:52.382563" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782732, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:52.381526" elapsed="0.001065"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:52.382954" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:52.382773" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:52.383462" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:52.383157" elapsed="0.000332"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:52.383946" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:52.383679" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:52.384500" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:52.384145" elapsed="0.000447">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:52.276268" elapsed="0.108440">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:53.397081" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:53.396680" elapsed="0.000436"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:53.397183" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:58:53.397369" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:53.396276" elapsed="0.001120"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:53.404615" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:53.404332" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:53.405108" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:53.404855" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:53.413229" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:53.413292" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:53 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:53 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782733,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:53.413390" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:53.407438" elapsed="0.005978"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:53.405229" elapsed="0.008307"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:53.413755" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:53.413593" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:53.405207" elapsed="0.008635"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:53.417797" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782733,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:53.414979" elapsed="0.002876"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:53.414748" elapsed="0.003145"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:53.414729" elapsed="0.003190"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:53.421782" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:53.418229" elapsed="0.003641"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:53.417984" elapsed="0.003943"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:53.417963" elapsed="0.004010"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:53.422903" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:53.422240" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:53.423404" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:53.423045" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:53.424255" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:53.423785" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:53.423526" elapsed="0.000826"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:53.423017" elapsed="0.001366"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:53.425187" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:53.424647" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:53.425827" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:53.425341" elapsed="0.000605"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:53.426691" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:53.426233" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:53.425995" elapsed="0.000759"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:53.425299" elapsed="0.001476"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:53.426949" elapsed="0.000374"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:53.427817" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:53.427493" elapsed="0.000351"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:53.428017" elapsed="0.002577"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:53.414266" elapsed="0.016399"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:53.430852" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:58:53.430738" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:53.430719" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:53.431103" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:53.431191" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:58:53.433630" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782733,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:53.397779" elapsed="0.035881"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:53.433714" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:53.433870" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782733,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:53.395734" elapsed="0.038163"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:53.435034" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782733, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:53.434624" elapsed="0.000439"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:53.435114" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:53.435270" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782733, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:53.434203" elapsed="0.001093"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:53.435679" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:53.435478" elapsed="0.000226"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:53.436324" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:53.435937" elapsed="0.000415"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:53.436824" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:53.436532" elapsed="0.000318"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:53.437396" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:53.437024" elapsed="0.000448">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:53.385765" elapsed="0.051839">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:54.450215" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:54.449839" elapsed="0.000409"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:54.450310" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:58:54.450481" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:54.449454" elapsed="0.001052"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:54.458441" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:54.458142" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:54.458931" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:54.458683" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:54.466899" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:54.467028" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:54 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:54 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782734,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:54.467278" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:54.461245" elapsed="0.006090"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:54.459085" elapsed="0.008344"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:54.467867" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:54.467489" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:54.459063" elapsed="0.008995"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:54.476254" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782734,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:54.470363" elapsed="0.005960"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:54.469855" elapsed="0.006518"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:54.469816" elapsed="0.006592"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:54.480315" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:54.476837" elapsed="0.003545"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:54.476488" elapsed="0.003943"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:54.476464" elapsed="0.004000"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:54.481393" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:54.480734" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:54.481896" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:54.481533" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:54.482693" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:54.482241" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:54.482012" elapsed="0.000771"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:54.481508" elapsed="0.001305"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:54.483635" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:54.483041" elapsed="0.000642"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:54.484002" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:54.483766" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:54.484537" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:54.484243" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:54.484083" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:54.483748" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:54.484797" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:54.485655" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:54.485337" elapsed="0.000344"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:54.485838" elapsed="0.002467"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:54.468880" elapsed="0.019490"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:54.488563" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:58:54.488442" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:54.488423" elapsed="0.000231"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:54.488804" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:54.488875" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:58:54.491262" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782734,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:54.450869" elapsed="0.040421"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:54.491344" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:54.491493" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782734,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:54.448961" elapsed="0.042558"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:54.492504" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782734, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:54.492102" elapsed="0.000429"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:54.492596" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:58:54.492750" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782734, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:54.491760" elapsed="0.001015"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:54.493130" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:54.492951" elapsed="0.000204"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:54.493650" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:54.493329" elapsed="0.000352"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:54.494162" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:54.493856" elapsed="0.000331"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:54.494736" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:54.494358" elapsed="0.000452">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:54.438768" elapsed="0.056155">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:55.506084" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:55.505595" elapsed="0.000532"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:55.506204" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:58:55.506431" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:55.505070" elapsed="0.001396"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:55.513709" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:55.513429" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:55.514198" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:55.513915" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:55.522347" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:55.522408" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:55 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:55 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782735,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:55.522504" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:55.516567" elapsed="0.005963"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:55.514322" elapsed="0.008276"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:55.522791" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:55.522627" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:55.514301" elapsed="0.008577"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:55.527966" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782735,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:55.524115" elapsed="0.003921"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:55.523787" elapsed="0.004299"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:55.523760" elapsed="0.004360"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:55.532055" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:55.528512" elapsed="0.003592"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:55.528200" elapsed="0.003940"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:55.528176" elapsed="0.003988"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:55.532765" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:55.532344" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:55.533108" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:55.532866" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:55.533684" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:55.533359" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:55.533193" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:55.532848" elapsed="0.000921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:55.534303" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:55.533932" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:55.534685" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:55.534425" elapsed="0.000390"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:55.535305" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:55.535006" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:55.534843" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:55.534407" elapsed="0.001004"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:55.535585" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:55.536418" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:55.536122" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:55.536633" elapsed="0.002439"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:55.523240" elapsed="0.015897"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:55.539315" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:58:55.539209" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:55.539191" elapsed="0.000292"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:55.539663" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:55.539747" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:58:55.542227" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782735,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:55.506967" elapsed="0.035288"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:55.542307" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:55.542458" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782735,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:55.504373" elapsed="0.038111"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:55.543487" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782735, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:55.543063" elapsed="0.000453"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:55.543580" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:58:55.543737" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782735, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:55.542719" elapsed="0.001044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:55.544120" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:55.543940" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:55.544646" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:55.544319" elapsed="0.000352"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:55.545119" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:55.544856" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:55.545681" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:55.545314" elapsed="0.000440">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:55.495949" elapsed="0.049914">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:56.558141" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:56.557751" elapsed="0.000424"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:58:56.558236" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:58:56.558406" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:58:56.557353" elapsed="0.001079"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:56.565765" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:56.565482" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:56.566330" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:56.566078" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:58:59.132142" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:58:59.132315" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:58:59 GMT', 'Expires': 'Thu, 09 Apr 2026 23:58:59 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782739,"status":200} 
 </msg>
<msg time="2026-04-10T00:58:59.132626" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:58:56.568665" elapsed="2.564029"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:56.566449" elapsed="2.566369"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:59.133338" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:59.132894" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:56.566428" elapsed="2.567154"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:59.141225" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782739,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:59.136132" elapsed="0.005166"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:59.135598" elapsed="0.005750"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:59.135524" elapsed="0.005859"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:58:59.145307" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:58:59.141803" elapsed="0.003573"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:59.141463" elapsed="0.003962"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:59.141439" elapsed="0.004022"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:59.146293" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:59.145742" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:59.146810" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:59.146430" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:59.147611" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:59.147155" elapsed="0.000496"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:59.146925" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:59.146405" elapsed="0.001327"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:59.148460" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:59.147956" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:58:59.148946" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:58:59.148619" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:58:59.149722" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:58:59.149283" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-04-10T00:58:59.149060" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:59.148594" elapsed="0.001244"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:58:59.150051" elapsed="0.000481"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:58:59.151231" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:59.150830" elapsed="0.000437"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:58:59.151482" elapsed="0.002745"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:58:59.134452" elapsed="0.019843"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:58:59.154547" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:58:59.154432" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:58:59.154412" 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-04-10T00:58:59.154833" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:58:59.154912" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:58:59.157265" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782739,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:58:56.558811" elapsed="2.598483"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:58:59.157347" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:59.157499" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782739,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:56.556864" elapsed="2.600661"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:58:59.158522" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782739, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:58:59.158126" elapsed="0.000441"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:58:59.158617" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:58:59.158799" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782739, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:58:59.157776" elapsed="0.001050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:58:59.159185" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:58:59.159005" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:59.159703" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:59.159386" elapsed="0.000343"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:58:59.160170" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:58:59.159901" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:58:59.160730" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:58:59.160366" elapsed="0.000435">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:58:56.546883" elapsed="2.614030">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:00.172313" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:00.171820" elapsed="0.000536"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:00.172436" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:59:00.172714" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:00.171296" elapsed="0.001457"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:00.180205" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:00.179937" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:00.180687" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:00.180415" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:00.191309" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:00.191451" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:00 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782740,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:00.191723" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:00.183078" elapsed="0.008708"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:00.180808" elapsed="0.011179"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:00.192430" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:00.192055" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:00.180786" elapsed="0.011873"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:00.200003" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782740,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:00.195044" elapsed="0.005031"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:00.194506" elapsed="0.005619"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:00.194465" elapsed="0.005695"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:00.204246" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:00.200577" elapsed="0.003738"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:00.200240" elapsed="0.004127"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:00.200216" elapsed="0.004187"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:00.205265" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:00.204690" elapsed="0.000646"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:00.205819" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:00.205442" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:00.206648" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:00.206178" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:00.205940" elapsed="0.000799"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:00.205415" elapsed="0.001355"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:00.207534" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:00.207006" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:00.208045" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:00.207700" elapsed="0.000430"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:00.208866" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:00.208399" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:00.208164" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:00.207673" elapsed="0.001315"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:00.209217" elapsed="0.000574"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:00.210301" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:00.210009" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:00.210483" elapsed="0.002436"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:00.193510" elapsed="0.019472"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:00.213162" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:59:00.213054" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:00.213036" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:00.213427" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:00.213501" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:59:00.215859" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782740,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:00.173282" elapsed="0.042606"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:00.215939" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:00.216091" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782740,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:00.170627" elapsed="0.045491"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:00.217145" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782740, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:00.216746" elapsed="0.000427"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:00.217222" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:00.217416" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782740, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:00.216381" elapsed="0.001062"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:00.217824" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:00.217641" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:00.218342" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:00.218034" elapsed="0.000335"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:00.218827" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:00.218559" elapsed="0.000294"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:00.219374" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:00.219026" elapsed="0.000417">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:00.161930" elapsed="0.057638">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:01.229717" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:01.229184" elapsed="0.000576"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:01.229837" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:59:01.230067" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:01.228671" elapsed="0.001432"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:01.237534" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:01.237267" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:01.238006" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:01.237758" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:01.245061" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:01.245121" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:01 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:01 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782741,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:01.245217" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:01.240303" elapsed="0.004941"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:01.238123" elapsed="0.007166"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:01.245474" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:01.245318" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:01.238103" elapsed="0.007481"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:01.249709" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782741,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:01.246625" elapsed="0.003154"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:01.246383" elapsed="0.003444"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:01.246365" elapsed="0.003496"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:01.253973" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:01.250251" elapsed="0.003789"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:01.249940" elapsed="0.004151"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:01.249916" elapsed="0.004209"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:01.254953" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:01.254373" elapsed="0.000623"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:01.255513" elapsed="0.000100"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:01.255172" elapsed="0.000505"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:01.256258" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:01.255953" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:01.255715" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:01.255145" elapsed="0.001197"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:01.256924" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:01.256507" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:01.257273" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:01.257029" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:01.257841" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:01.257521" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:01.257357" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:01.257011" elapsed="0.000916"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:01.258097" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:01.258947" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:01.258647" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:01.259144" elapsed="0.002485"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:01.245954" elapsed="0.015739"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:01.261871" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:59:01.261765" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:01.261746" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:01.262110" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:01.262183" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:59:01.264633" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782741,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:01.230609" elapsed="0.034054"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:01.264716" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:01.264868" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782741,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:01.227982" elapsed="0.036913"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:01.265902" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782741, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:01.265464" elapsed="0.000467"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:01.265980" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:01.266137" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782741, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:01.265121" elapsed="0.001042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:01.266524" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:01.266343" elapsed="0.000222"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:01.267071" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:01.266763" elapsed="0.000333"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:01.267533" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:01.267269" elapsed="0.000305"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:01.268184" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:01.267821" elapsed="0.000434">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:01.220393" elapsed="0.047972">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:02.281350" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:02.280958" elapsed="0.000425"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:02.281442" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:59:02.281668" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:02.280590" elapsed="0.001104"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:02.290186" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:02.289911" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:02.290667" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:02.290398" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:02.297404" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:02.297465" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:02 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:02 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782742,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:02.297591" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:02.293030" elapsed="0.004622"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:02.290789" elapsed="0.006909"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:02.297885" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:02.297726" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:02.290768" elapsed="0.007220"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:02.303043" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782742,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:02.299436" elapsed="0.003677"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:02.299121" elapsed="0.004041"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:02.299095" elapsed="0.004101"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:02.306781" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:02.303613" elapsed="0.003217"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:02.303276" elapsed="0.003589"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:02.303252" elapsed="0.003638"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:02.307462" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:02.307069" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:02.307825" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:02.307581" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:02.308375" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:02.308071" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:02.307907" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:02.307560" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:02.309009" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:02.308638" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:02.309343" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:02.309108" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:02.309970" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:02.309606" elapsed="0.000446"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:02.309427" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:02.309089" elapsed="0.001025"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:02.310274" elapsed="0.000374"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:02.311110" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:02.310817" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:02.311293" elapsed="0.002510"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:02.298497" elapsed="0.015372"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:02.314050" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:59:02.313941" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:02.313922" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:02.314291" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:02.314361" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:02.316729" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782742,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:02.282053" elapsed="0.034705"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:02.316809" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:02.316959" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782742,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:02.280085" elapsed="0.036900"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:02.317983" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782742, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:02.317563" elapsed="0.000448"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:02.318058" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:02.318212" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782742, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:02.317204" elapsed="0.001034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:02.318609" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:02.318414" elapsed="0.000221"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:02.319108" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:02.318810" elapsed="0.000324"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:02.319576" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:02.319304" elapsed="0.000299"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:02.320115" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:02.319772" elapsed="0.000413">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:02.269262" elapsed="0.051030">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:03.332988" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:03.332479" elapsed="0.000551"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:03.333104" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:59:03.333332" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:03.331968" elapsed="0.001399"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:03.341355" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:03.341089" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:03.341913" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:03.341655" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:03.348922" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:03.348981" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:03 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:03 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782743,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:03.349076" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:03.344261" elapsed="0.004841"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:03.342035" elapsed="0.007111"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:03.349332" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:03.349174" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:03.342014" elapsed="0.007404"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:03.353529" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782743,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:03.350465" elapsed="0.003159"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:03.350238" elapsed="0.003436"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:03.350218" elapsed="0.003490"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:03.357676" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:03.354106" elapsed="0.003639"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:03.353786" elapsed="0.004008"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:03.353762" elapsed="0.004066"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:03.358647" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:03.358074" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:03.359149" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:03.358797" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:03.359995" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:03.359536" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:03.359266" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:03.358764" elapsed="0.001321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:03.360637" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:03.360248" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:03.360980" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:03.360743" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:03.361527" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:03.361224" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:03.361062" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:03.360725" elapsed="0.000906"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:03.361790" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:03.362638" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:03.362322" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:03.362844" elapsed="0.002631"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:03.349805" elapsed="0.015751"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:03.365741" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:59:03.365631" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:03.365612" elapsed="0.000290"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:03.366056" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:03.366128" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:59:03.368569" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782743,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:03.333871" elapsed="0.034728"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:03.368653" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:03.368808" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782743,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:03.331236" elapsed="0.037599"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:03.369823" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782743, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:03.369404" elapsed="0.000449"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:03.369902" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:03.370059" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782743, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:03.369057" elapsed="0.001029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:03.370449" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:03.370266" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:03.371001" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:03.370675" elapsed="0.000353"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:03.371463" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:03.371201" elapsed="0.000287"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:03.372047" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:03.371699" elapsed="0.000419">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:03.321207" elapsed="0.051022">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.386898" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:04.386496" elapsed="0.000437"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:04.386994" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:59:04.387173" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:04.386100" elapsed="0.001098"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.394922" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:04.394622" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.395428" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:04.395176" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:04.404989" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:04.405081" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:04 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:04 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782744,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:04.405284" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:04.397914" elapsed="0.007409"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:04.395569" elapsed="0.009816"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.405758" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.405504" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.395528" elapsed="0.010353"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.410924" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782744,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:04.407343" elapsed="0.003651"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:04.407030" elapsed="0.004013"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.407005" elapsed="0.004072"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.415091" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:04.411513" elapsed="0.003645"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:04.411156" elapsed="0.004052"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.411132" elapsed="0.004110"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.416072" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:04.415491" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.416569" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.416213" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.417382" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:04.416918" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:04.416688" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.416186" elapsed="0.001314"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.418253" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:04.417749" elapsed="0.000541"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.418734" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.418388" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.419481" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:04.419071" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:04.418848" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.418363" elapsed="0.001307"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:04.419905" elapsed="0.000505"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:04.421064" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:04.420666" elapsed="0.000434"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:04.421343" elapsed="0.003511"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:04.406416" elapsed="0.018533"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:04.425266" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-04-10T00:59:04.425055" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.425026" 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-04-10T00:59:04.425653" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.425755" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:59:04.428363" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782744,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:04.387597" elapsed="0.040794"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:04.428444" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:59:04.428612" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782744,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:04.384785" elapsed="0.043854"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.429737" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782744, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:04.429315" elapsed="0.000451"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:04.429816" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:04.429972" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782744, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:04.428870" elapsed="0.001128"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:04.430357" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:04.430178" elapsed="0.000204"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.430882" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:04.430577" elapsed="0.000332"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.431345" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:04.431085" elapsed="0.000286"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:59:04.431540" elapsed="0.000328"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:59:04.373251" elapsed="0.058678"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:58:48.061292" elapsed="16.370689"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:58:48.060882" elapsed="16.371164"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:58:48.056009" elapsed="16.376072"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:58:48.055866" elapsed="16.376251"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.443471" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:04.443169" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:04.443557" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:59:04.443712" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:04.442822" elapsed="0.000914"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.450613" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:04.450347" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.451063" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:04.450817" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:04.460362" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:04.460445" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:04 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:04 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782744,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:04.460598" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:04.453333" elapsed="0.007303"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:04.451173" elapsed="0.009525"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.460947" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.460734" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.451155" elapsed="0.009914"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.466540" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782744,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:04.462497" elapsed="0.004140"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:04.462189" elapsed="0.004497"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.462164" elapsed="0.004556"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.470739" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:04.467184" elapsed="0.003622"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:04.466799" elapsed="0.004056"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.466775" elapsed="0.004113"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.471743" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:04.471169" elapsed="0.000613"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.472287" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.471881" elapsed="0.000495"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.473086" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:04.472663" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:04.472410" elapsed="0.000826"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.471856" elapsed="0.001430"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.474050" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:04.473514" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.474536" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.474205" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.475350" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:04.474895" elapsed="0.000508"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:04.474673" elapsed="0.000796"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.474180" elapsed="0.001329"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:04.475752" elapsed="0.000489"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:04.476879" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:04.476473" elapsed="0.000443"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:04.477136" elapsed="0.002878"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:04.461603" elapsed="0.018478"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:04.480282" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:59:04.480165" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.480144" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.480523" elapsed="0.000040"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.480617" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:04.483015" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782744,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:04.444075" elapsed="0.038969"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:04.483098" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:59:04.483262" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782744,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:04.442355" elapsed="0.040935"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:59:04.483346" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:04.483500" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782744,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:59:04.437755" elapsed="0.045773"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.484571" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782744, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:04.484151" elapsed="0.000450"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:04.484651" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:04.484807" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782744, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:04.483786" elapsed="0.001087"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:04.485251" level="INFO">${value} = 10000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:04.485058" elapsed="0.000219"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.485810" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:59:04.485505" elapsed="0.000363"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 10000.</doc>
<status status="PASS" start="2026-04-10T00:59:04.437292" elapsed="0.048635"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:04.432322" elapsed="0.053639"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:59:04.432179" elapsed="0.053814"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:58:47.983971" elapsed="16.502081"/>
</kw>
<doc>Initiate get operation and check flow count across cluster nodes</doc>
<status status="PASS" start="2026-04-10T00:58:47.555410" elapsed="16.930837"/>
</test>
<test id="s1-s4-t5" name="Current Term Verification After Adding Bulk Flow" line="59">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:59:04.491148" elapsed="0.000287"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:59:04.490778" elapsed="0.000734"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.492926" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:04.492774" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.492749" elapsed="0.000272"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.499064" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:04.498894" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.498860" elapsed="0.000288"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.500224" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:59:04.499821" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.500736" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:59:04.500412" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:59:04.500806" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:04.500966" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:59:04.499397" elapsed="0.001594"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.506836" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:04.506728" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.506709" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.508089" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:04.507984" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.507966" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:04.508615" level="INFO">${karaf_connection_index} = 471</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:04.508301" elapsed="0.000342"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:59:04.509034" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:59:04.508805" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:59:04.546891" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:59:04.509623" elapsed="0.037400"/>
</kw>
<msg time="2026-04-10T00:59:04.547198" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:59:04.547245" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.509220" elapsed="0.038061"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:59:04.623282" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "A "f "t "e "r "[C "A "d "d "i "n "g "[C "B "u "l "k "[C "F "l "o "w "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:59:04.547868" elapsed="0.075724"/>
</kw>
<msg time="2026-04-10T00:59:04.623786" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:59:04.623834" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.547468" elapsed="0.076405"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.624280" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.623983" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.623948" elapsed="0.000420"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.624891" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "A "f "t "e "r "[C "A "d "d "i "n "g "[C "B "u "l "k "[C "F "l "o "w "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:04.624516" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.625274" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.625053" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.625035" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:59:04.625390" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:04.626989" elapsed="0.000797"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:59:04.628070" elapsed="0.000682"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:59:04.629027" elapsed="0.000361"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:59:04.626325" elapsed="0.003166"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:59:04.625757" elapsed="0.003832"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:59:04.507681" elapsed="0.122009"/>
</kw>
<msg time="2026-04-10T00:59:04.629783" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:04.629827" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.507058" elapsed="0.122806"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:59:04.630048" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T00:59:04.629941" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.629923" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.630558" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.630902" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.630975" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:59:04.506373" elapsed="0.124711"/>
</kw>
<msg time="2026-04-10T00:59:04.631179" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:04.631224" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.501421" elapsed="0.129840"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.631607" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.631337" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.631320" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:59:04.501229" elapsed="0.130480"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.637375" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:04.637269" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.637251" 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-04-10T00:59:04.638673" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:04.638562" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.638523" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:04.639186" level="INFO">${karaf_connection_index} = 473</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:04.638883" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:59:04.639612" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:59:04.639371" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:59:04.679049" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:59:04.640142" elapsed="0.039011"/>
</kw>
<msg time="2026-04-10T00:59:04.679312" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:59:04.679359" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.639799" elapsed="0.039596"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:59:04.762488" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "A "f "t "e "r "[C "A "d "d "i "n "g "[C "B "u "l "k "[C "F "l "o "w "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:59:04.679937" elapsed="0.082704"/>
</kw>
<msg time="2026-04-10T00:59:04.762820" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:59:04.762869" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.679594" elapsed="0.083312"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.763216" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.762986" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.762965" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.763781" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "A "f "t "e "r "[C "A "d "d "i "n "g "[C "B "u "l "k "[C "F "l "o "w "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:04.763440" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.764157" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.763940" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.763922" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:59:04.764268" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:04.765733" elapsed="0.000755"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:59:04.766780" elapsed="0.000446"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:59:04.767489" 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-04-10T00:59:04.765091" elapsed="0.002862"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:59:04.764537" elapsed="0.003478"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:59:04.638238" elapsed="0.129874"/>
</kw>
<msg time="2026-04-10T00:59:04.768205" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:04.768250" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.637678" elapsed="0.130609"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:59:04.768470" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:59:04.768364" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.768345" 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 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.769020" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.769563" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.769639" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:59:04.636926" elapsed="0.132857"/>
</kw>
<msg time="2026-04-10T00:59:04.769877" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:04.769920" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.631981" elapsed="0.137976"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.770283" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.770032" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.770015" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:04.631837" elapsed="0.138546"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.775864" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:04.775758" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.775740" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.777104" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:04.776998" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.776980" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:04.777699" level="INFO">${karaf_connection_index} = 475</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:04.777315" elapsed="0.000442"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:59:04.778145" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:59:04.777919" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:59:04.819702" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:59:04.778688" elapsed="0.041355"/>
</kw>
<msg time="2026-04-10T00:59:04.820469" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:59:04.820623" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.778332" elapsed="0.042376"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:59:04.901991" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "A "f "t "e "r "[C "A "d "d "i "n "g "[C "B "u "l "k "[C "F "l "o "w "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:59:04.822108" elapsed="0.080057"/>
</kw>
<msg time="2026-04-10T00:59:04.902343" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:59:04.902390" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.821174" elapsed="0.081253"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.902849" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.902536" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.902502" elapsed="0.000452"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.903457" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "A "f "t "e "r "[C "A "d "d "i "n "g "[C "B "u "l "k "[C "F "l "o "w "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:04.903110" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.903951" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.903723" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.903703" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:59:04.904070" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:04.905728" elapsed="0.000887"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:59:04.906911" elapsed="0.000511"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:59:04.907725" 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-04-10T00:59:04.905025" elapsed="0.003174"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:59:04.904409" elapsed="0.003858"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:59:04.776694" elapsed="0.131674"/>
</kw>
<msg time="2026-04-10T00:59:04.908466" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:04.908512" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.776083" elapsed="0.132484"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:59:04.908761" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:59:04.908649" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.908631" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.909270" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.909638" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.909713" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:59:04.775406" elapsed="0.134419"/>
</kw>
<msg time="2026-04-10T00:59:04.909941" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:04.909998" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.770661" elapsed="0.139384"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.910899" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.910150" elapsed="0.000828"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.910130" elapsed="0.000872"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:59:04.770504" elapsed="0.140524"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:59:04.501048" elapsed="0.410021"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:59:04.498445" elapsed="0.412711"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:59:04.492350" elapsed="0.418872"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.491750" elapsed="0.419523"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:59:04.487649" elapsed="0.423685"/>
</kw>
<kw name="Get_Current_Term_Of_Shard_At_Member">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.915714" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:04.915243" elapsed="0.000500"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:04.915790" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:04.915941" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:04.914852" elapsed="0.001113"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.920236" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.916054" elapsed="0.004299"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.916033" elapsed="0.004345"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T00:59:04.921017" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:59:04.920900" elapsed="0.000180"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.921139" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:04.921104" elapsed="0.000079"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.920878" elapsed="0.000336"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.921365" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T00:59:04.921486" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T00:59:04.920627" elapsed="0.000883"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.922453" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:04.921705" elapsed="0.000903"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.924249" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:04.923033" elapsed="0.001279"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.934445" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:04.933945" elapsed="0.000569"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.935128" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:04.934765" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:04.946984" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:04.947082" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:04 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:04 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":15004,"SnapshotIndex":223035,"InMemoryJournalLogSize":11078,"ReplicatedToAllIndex":223035,"Leader":"member-2-shard-inventory-config","LastIndex":234113,"RaftState":"Leader","LastApplied":233323,"LastCommittedTransactionTime":"2026-04-10 00:58:47.403","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":234113,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.189","active":true,"matchIndex":223035,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":223036},{"timeSinceLastActivity":"00:00:00.154","active":true,"matchIndex":233649,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":233650}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"633.7 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":4,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":233323,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10006,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":702000},"timestamp":1775782744,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:04.947273" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:04.937433" elapsed="0.009882"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:04.935303" elapsed="0.012073"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.947667" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.947417" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.935279" elapsed="0.012510"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.953090" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":15004,"SnapshotIndex":223035,"InMemoryJournalLogSize":11078,"ReplicatedToAllIndex":223035,"Leader":"member-2-shard-inventory-config","LastIndex":234113,"RaftState":"Leader","LastApplied":233323,"LastCommittedTransactionTime":"2026-04-10 00:58:47.403","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":234113,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.189","active":true,"matchIndex":223035,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":223036},{"timeSinceLastActivity":"00:00:00.154","active":true,"matchIndex":233649,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":233650}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"633.7 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":4,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":233323,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10006,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":702000},"timestamp":1775782744,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:04.949279" elapsed="0.004003"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:04.948966" elapsed="0.004397"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.948941" elapsed="0.004472"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.957385" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:04.953847" elapsed="0.003608"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:04.953499" elapsed="0.004006"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.953475" elapsed="0.004064"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.958452" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:04.957812" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.958954" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.958615" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.959881" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:04.959404" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:04.959128" elapsed="0.000842"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.958588" elapsed="0.001411"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.960830" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:04.960272" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:04.961339" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:04.960968" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.962262" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:04.961729" elapsed="0.000571"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:04.961480" elapsed="0.000872"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.960943" elapsed="0.001439"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:04.962627" elapsed="0.000546"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:04.963712" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:04.963383" elapsed="0.000383"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:04.963942" elapsed="0.002476"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:04.948356" elapsed="0.018129"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.966681" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:04.966571" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.966538" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:59:04.969994" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:59:04.966897" elapsed="0.003162"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:59:04.970114" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:59:04.970283" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:04.926512" elapsed="0.043798"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:04.970368" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:59:04.970518" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T00:59:04.924856" elapsed="0.045709"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.971643" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782744, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:04.971144" elapsed="0.000529"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:04.971768" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:04.971955" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782744, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:04.970796" elapsed="0.001186"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:04.972364" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 233323, 'CommittedTransactionsCount': 4, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:04.972156" elapsed="0.000237"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:04.972772" level="INFO">${raft_property} = 7</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:04.972567" elapsed="0.000230"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T00:59:04.972845" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:59:04.973000" level="INFO">${current_term_value} = 7</msg>
<var>${current_term_value}</var>
<arg>CurrentTerm</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${Inventory_Leader}</arg>
<arg>${verify_restconf}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T00:59:04.911964" elapsed="0.061061"/>
</kw>
<return>
<value>${current_term_value}</value>
<status status="PASS" start="2026-04-10T00:59:04.973080" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:59:04.973278" level="INFO">${current_term_value_after} = 7</msg>
<var>${current_term_value_after}</var>
<doc>Find a Raft Property Values From Shard Member</doc>
<status status="PASS" start="2026-04-10T00:59:04.911508" elapsed="0.061800"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.973858" level="INFO">${current_term_value_after} = 7</msg>
<arg>${current_term_value_after}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T00:59:04.973506" elapsed="0.000394"/>
</kw>
<doc>Verifying current term for Leader Node after pushing the flows</doc>
<status status="PASS" start="2026-04-10T00:59:04.486760" elapsed="0.487270"/>
</test>
<test id="s1-s4-t6" name="Current Term Comparison Before And After Addition Of Flow" line="64">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:59:04.977767" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:59:04.977467" elapsed="0.000599"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.979067" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:04.978955" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.978937" elapsed="0.000200"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.984800" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:04.984690" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.984670" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.985917" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:59:04.985509" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:59:04.986513" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:59:04.986203" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:59:04.986602" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:59:04.986761" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:59:04.985098" elapsed="0.001688"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.992357" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:04.992248" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.992229" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:04.993772" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:04.993661" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:04.993641" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:04.994331" level="INFO">${karaf_connection_index} = 471</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:04.993987" elapsed="0.000371"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:59:04.994815" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:59:04.994522" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.026296" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:59:04.995347" elapsed="0.031313"/>
</kw>
<msg time="2026-04-10T00:59:05.026900" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:59:05.026948" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.995006" elapsed="0.031979"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.128096" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "C "o "m "p "a "r "i "s "o "n "[C "B "e "f "o "r "e "[C "A "n "d "[C "A "f "t "e "r "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:59:05.027742" elapsed="0.100586"/>
</kw>
<msg time="2026-04-10T00:59:05.128587" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:59:05.128643" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.027254" elapsed="0.101428"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.129154" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.128816" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.128776" elapsed="0.000471"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.129837" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "C "o "m "p "a "r "i "s "o "n "[C "B "e "f "o "r "e "[C "A "n "d "[C "A "f "t "e "r "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.129420" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.130306" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.130031" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.130008" elapsed="0.000381"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:59:05.130427" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:05.132176" elapsed="0.000838"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:59:05.133320" elapsed="0.000530"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:59:05.134149" elapsed="0.000408"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:59:05.131414" elapsed="0.003252"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:59:05.130788" elapsed="0.003945"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:59:04.993252" elapsed="0.141598"/>
</kw>
<msg time="2026-04-10T00:59:05.134961" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:05.135006" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.992609" elapsed="0.142446"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:59:05.135264" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:59:05.135151" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.135132" 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 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.135782" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.136187" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.136297" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:59:04.991908" elapsed="0.144515"/>
</kw>
<msg time="2026-04-10T00:59:05.136521" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:05.136583" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.987170" elapsed="0.149522"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.137057" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.136776" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.136758" elapsed="0.000399"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:59:04.987025" elapsed="0.150157"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.143228" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:05.143100" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.143080" elapsed="0.000219"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.144527" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:05.144418" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.144400" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:05.145091" level="INFO">${karaf_connection_index} = 473</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:05.144764" elapsed="0.000355"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.145597" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:59:05.145300" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.176960" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:59:05.146147" elapsed="0.030927"/>
</kw>
<msg time="2026-04-10T00:59:05.177279" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:59:05.177327" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.145790" elapsed="0.031574"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.257891" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "C "o "m "p "a "r "i "s "o "n "[C "B "e "f "o "r "e "[C "A "n "d "[C "A "f "t "e "r "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:59:05.177977" elapsed="0.080263"/>
</kw>
<msg time="2026-04-10T00:59:05.258599" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:59:05.258663" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.177571" elapsed="0.081134"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.259213" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.258840" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.258797" elapsed="0.000516"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.259957" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "C "o "m "p "a "r "i "s "o "n "[C "B "e "f "o "r "e "[C "A "n "d "[C "A "f "t "e "r "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.259499" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.260406" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.260155" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.260135" elapsed="0.000375"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:59:05.260569" elapsed="0.000056"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:05.262807" elapsed="0.000926"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:59:05.264028" elapsed="0.000635"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:59:05.264946" elapsed="0.000397"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:59:05.261610" elapsed="0.003874"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:59:05.260940" elapsed="0.004729"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:59:05.144069" elapsed="0.121707"/>
</kw>
<msg time="2026-04-10T00:59:05.265875" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:05.265919" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.143456" elapsed="0.122500"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:59:05.266150" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:59:05.266040" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.266019" 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 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.266779" 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-04-10T00:59:05.267136" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.267210" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:59:05.142720" elapsed="0.124600"/>
</kw>
<msg time="2026-04-10T00:59:05.267447" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:05.267493" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.137523" elapsed="0.130049"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.267981" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.267700" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.267675" elapsed="0.000416"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:05.137342" elapsed="0.130785"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.274436" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:05.274301" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.274282" 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-04-10T00:59:05.275848" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:05.275717" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.275690" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:05.276380" level="INFO">${karaf_connection_index} = 475</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:05.276069" elapsed="0.000338"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.276894" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:59:05.276610" elapsed="0.000311"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.316575" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:59:05.277422" elapsed="0.039265"/>
</kw>
<msg time="2026-04-10T00:59:05.316852" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:59:05.316898" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.277084" elapsed="0.039850"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.440234" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "C "o "m "p "a "r "i "s "o "n "[C "B "e "f "o "r "e "[C "A "n "d "[C "A "f "t "e "r "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:59:05.317460" elapsed="0.123081"/>
</kw>
<msg time="2026-04-10T00:59:05.440824" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:59:05.440873" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.317111" elapsed="0.123896"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.441494" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.441137" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.441096" elapsed="0.000511"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.442165" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "C "o "m "p "a "r "i "s "o "n "[C "B "e "f "o "r "e "[C "A "n "d "[C "A "f "t "e "r "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.441757" elapsed="0.000504"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.442569" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.442330" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.442311" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:59:05.442735" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:05.444342" elapsed="0.000801"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:59:05.445427" elapsed="0.000508"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:59:05.446203" elapsed="0.000400"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:59:05.443678" elapsed="0.003060"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:59:05.443074" elapsed="0.003730"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:59:05.275339" elapsed="0.171566"/>
</kw>
<msg time="2026-04-10T00:59:05.447002" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:05.447047" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.274764" elapsed="0.172321"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:59:05.447272" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:59:05.447164" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.447145" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.447785" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.448409" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.448483" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:59:05.273940" elapsed="0.174670"/>
</kw>
<msg time="2026-04-10T00:59:05.448707" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:05.448750" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.268438" elapsed="0.180349"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.449115" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.448862" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.448845" elapsed="0.000347"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:59:05.268277" elapsed="0.180938"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:59:04.986846" elapsed="0.462405"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:59:04.984266" elapsed="0.465046"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:59:04.978665" elapsed="0.470705"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:04.978224" elapsed="0.471193"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:59:04.975058" elapsed="0.474454"/>
</kw>
<kw name="Log To Console" owner="BuiltIn">
<arg>Current Term after pushing the flows is ${current_term_value_after}</arg>
<doc>Logs the given message to the console.</doc>
<status status="PASS" start="2026-04-10T00:59:05.449714" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="${current_term_value_before} == ${current_term_value_after}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.450781" level="INFO">SUCCESS</msg>
<arg>SUCCESS</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.450514" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:05.450237" elapsed="0.000626"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>FAILURE</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.451096" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.450913" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.450219" elapsed="0.000951"/>
</if>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${current_term_value_before}</arg>
<arg>${current_term_value_after}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-04-10T00:59:05.451341" elapsed="0.000349"/>
</kw>
<doc>Comparison of Current Term Before and After Addition of Flows</doc>
<status status="PASS" start="2026-04-10T00:59:04.974415" elapsed="0.477391"/>
</test>
<test id="s1-s4-t7" name="Delete and Add ten percent of the flows for 5 iterations" line="74">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T00:59:05.455709" elapsed="0.000242"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T00:59:05.455362" elapsed="0.000653"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.457160" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:05.457046" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.457027" elapsed="0.000205"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.462691" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:05.462580" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.462538" elapsed="0.000246"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.463830" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:59:05.463426" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.464325" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:59:05.464020" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:59:05.464395" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:05.464565" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:59:05.463041" elapsed="0.001550"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.470379" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:05.470273" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.470255" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.471702" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:05.471593" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.471574" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:05.472220" level="INFO">${karaf_connection_index} = 471</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:05.471916" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.472649" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:59:05.472406" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.506343" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:59:05.473175" elapsed="0.033270"/>
</kw>
<msg time="2026-04-10T00:59:05.506651" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:59:05.506698" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.472838" elapsed="0.033896"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.606481" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "a "[78Cn "[A[78Cd
 "[C "A "d "d "[C "t "e "n "[C "p "e "r "c "e "n "t "[C "o "f "[C "t "h "e "[C "f "l "o "w "s "[C "f "o "r "[C "5 "[C "i "t "e "r "a "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:59:05.507300" elapsed="0.099584"/>
</kw>
<msg time="2026-04-10T00:59:05.607168" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:59:05.607217" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.506951" elapsed="0.100305"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.607766" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.607388" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.607346" elapsed="0.000512"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.608405" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "a "[78Cn "[A[78Cd
 "[C "A "d "d "[C "t "e "n "[C "p "e "r "c "e "n "t "[C "o "f "[C "t "h "e "[C "f "l "o "w "s "[C "f "o "r "[C "5 "[C "i "t "e "r "a "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.608009" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.608810" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.608588" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.608569" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:59:05.608927" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:05.610507" elapsed="0.000817"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:59:05.611630" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:59:05.612392" elapsed="0.000412"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:59:05.609852" elapsed="0.003055"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:59:05.609256" elapsed="0.003718"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:59:05.471263" elapsed="0.141811"/>
</kw>
<msg time="2026-04-10T00:59:05.613171" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:05.613215" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.470614" elapsed="0.142639"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:59:05.613438" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T00:59:05.613332" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.613314" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.613959" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.614309" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.614382" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:59:05.469933" elapsed="0.144559"/>
</kw>
<msg time="2026-04-10T00:59:05.614606" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:05.614651" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.464975" elapsed="0.149714"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.615062" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.614767" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.614750" elapsed="0.000393"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:59:05.464830" elapsed="0.150338"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.621284" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:05.621170" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.621151" elapsed="0.000257"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.622606" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:05.622472" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.622454" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:05.623155" level="INFO">${karaf_connection_index} = 473</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:05.622828" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.623593" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:59:05.623344" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.653892" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:59:05.624124" elapsed="0.029923"/>
</kw>
<msg time="2026-04-10T00:59:05.654237" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:59:05.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 "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.623782" elapsed="0.030539"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.742435" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "a "[78Cn "[A[78Cd
 "[C "A "d "d "[C "t "e "n "[C "p "e "r "c "e "n "t "[C "o "f "[C "t "h "e "[C "f "l "o "w "s "[C "f "o "r "[C "5 "[C "i "t "e "r "a "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:59:05.654944" elapsed="0.087696"/>
</kw>
<msg time="2026-04-10T00:59:05.742829" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:59:05.742877" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.654527" elapsed="0.088388"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.743358" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.743023" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.742990" elapsed="0.000460"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.743983" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "a "[78Cn "[A[78Cd
 "[C "A "d "d "[C "t "e "n "[C "p "e "r "c "e "n "t "[C "o "f "[C "t "h "e "[C "f "l "o "w "s "[C "f "o "r "[C "5 "[C "i "t "e "r "a "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.743629" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.744380" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.744152" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.744133" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:59:05.744497" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:05.746178" elapsed="0.000835"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:59:05.747374" elapsed="0.000515"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:59:05.748167" elapsed="0.000403"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:59:05.745478" elapsed="0.003201"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:59:05.744883" elapsed="0.003863"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:59:05.622170" elapsed="0.126681"/>
</kw>
<msg time="2026-04-10T00:59:05.748955" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:05.749001" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.621586" elapsed="0.127452"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:59:05.749230" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:59:05.749121" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.749102" elapsed="0.000282"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.749821" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.750168" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.750246" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:59:05.620805" elapsed="0.129555"/>
</kw>
<msg time="2026-04-10T00:59:05.750461" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:05.750507" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.615453" elapsed="0.135106"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.750900" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.750642" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.750624" elapsed="0.000355"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:05.615308" elapsed="0.135696"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.757124" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:05.757016" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.756997" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.758347" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:05.758241" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.758224" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:05.758891" level="INFO">${karaf_connection_index} = 475</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:05.758586" elapsed="0.000333"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.759326" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T00:59:05.759079" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.797753" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T00:59:05.759871" elapsed="0.037992"/>
</kw>
<msg time="2026-04-10T00:59:05.798028" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T00:59:05.798075" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.759513" elapsed="0.038598"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T00:59:05.885804" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "a "[78Cn "[A[78Cd
 "[C "A "d "d "[C "t "e "n "[C "p "e "r "c "e "n "t "[C "o "f "[C "t "h "e "[C "f "l "o "w "s "[C "f "o "r "[C "5 "[C "i "t "e "r "a "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T00:59:05.798660" elapsed="0.087387"/>
</kw>
<msg time="2026-04-10T00:59:05.886257" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T00:59:05.886305" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.798286" elapsed="0.088056"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.886821" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.886465" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.886425" elapsed="0.000484"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.887460" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "a "[78Cn "[A[78Cd
 "[C "A "d "d "[C "t "e "n "[C "p "e "r "c "e "n "t "[C "o "f "[C "t "h "e "[C "f "l "o "w "s "[C "f "o "r "[C "5 "[C "i "t "e "r "a "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.887062" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.887954" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.887730" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.887711" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T00:59:05.888070" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:05.889641" elapsed="0.000770"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T00:59:05.890707" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T00:59:05.891468" elapsed="0.000378"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T00:59:05.888982" elapsed="0.002966"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T00:59:05.888393" elapsed="0.003619"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T00:59:05.757941" elapsed="0.134172"/>
</kw>
<msg time="2026-04-10T00:59:05.892210" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:05.892255" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.757354" elapsed="0.134938"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T00:59:05.892478" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T00:59:05.892371" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.892353" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.892991" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.893339" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.893411" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T00:59:05.756655" elapsed="0.136865"/>
</kw>
<msg time="2026-04-10T00:59:05.893634" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T00:59:05.893680" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.751331" elapsed="0.142385"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.894043" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.893791" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.893775" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T00:59:05.751180" elapsed="0.142963"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:59:05.464651" elapsed="0.429528"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T00:59:05.462050" elapsed="0.432190"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T00:59:05.456740" elapsed="0.437562"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T00:59:05.456200" elapsed="0.438151"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T00:59:05.452894" elapsed="0.441514"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.895085" level="INFO">1</msg>
<arg>${index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.894834" elapsed="0.000295"/>
</kw>
<kw name="Delete Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Delete Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.906828" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:05.906509" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:05.906900" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:05.907050" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:05.906152" elapsed="0.000965"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.921357" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.921106" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.921821" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.921577" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.922267" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.922022" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.922721" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.922464" elapsed="0.000300"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:05.923709" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:59:05.923393" elapsed="0.000342"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:59:05.924065" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:59:05.923893" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:59:05.924242" elapsed="0.000204"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.924869" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.924622" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:59:05.924954" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:05.925108" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:59:05.922969" elapsed="0.002164"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:05.940607" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Content-Length': '402', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:59:05.940658" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:05.940780" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:05.927577" elapsed="0.013229"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:05.925203" elapsed="0.015650"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.941054" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.940880" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.925186" elapsed="0.015981"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.944693" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.942234" elapsed="0.002503"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:05.942008" elapsed="0.002763"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.941989" elapsed="0.002806"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.947692" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.945072" elapsed="0.002667"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:05.944851" elapsed="0.002935"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.944834" elapsed="0.002976"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.948371" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:05.947977" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.948724" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.948468" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.949284" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:05.948979" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:05.948807" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.948450" elapsed="0.000955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.949947" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:05.949582" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.950281" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.950045" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.950835" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:05.950523" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:05.950362" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.950027" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:05.951071" elapsed="0.000412"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:05.951969" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:05.951666" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:05.952164" elapsed="0.002487"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:05.941572" elapsed="0.013143"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.954894" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:05.954789" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.954770" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:59:05.957592" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:59:05.955106" elapsed="0.002513"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:59:05.957667" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:05.957822" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:05.918338" elapsed="0.039508"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:05.957912" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:59:05.958059" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:59:05.915696" elapsed="0.042387"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:05.958134" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T00:59:05.958278" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:05.905672" elapsed="0.052630"/>
</kw>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Delete Bulk Flow in member 1 according to ${json_body_del}.</doc>
<status status="PASS" start="2026-04-10T00:59:05.900806" elapsed="0.057558"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.965507" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:05.965205" elapsed="0.000329"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:05.965597" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:05.965748" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:05.964854" elapsed="0.000918"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.972574" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.972311" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.973021" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.972780" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:05.979481" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:05.979564" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:05 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:05 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782745,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:05.979661" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:05.975294" elapsed="0.004393"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:05.973130" elapsed="0.006600"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.979910" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.979757" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.973112" elapsed="0.006883"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.983830" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782745,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.981000" elapsed="0.002881"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:05.980779" elapsed="0.003137"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.980761" elapsed="0.003179"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.986722" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:05.984251" elapsed="0.002518"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:05.983997" elapsed="0.002808"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.983980" elapsed="0.002848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.987374" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:05.986994" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.987764" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.987507" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.988350" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:05.988034" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:05.987852" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.987488" elapsed="0.000947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.988989" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:05.988624" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.989320" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:05.989087" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:05.989876" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:05.989579" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:05.989401" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.989069" elapsed="0.001035"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:05.990316" elapsed="0.000516"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:05.991488" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:05.991067" elapsed="0.000467"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:05.991781" elapsed="0.003651"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:05.980341" elapsed="0.015232"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:05.995834" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:59:05.995683" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:05.995656" elapsed="0.000304"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:05.996191" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:05.996351" elapsed="0.000024"/>
</return>
<msg time="2026-04-10T00:59:05.999751" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782745,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:05.966104" elapsed="0.033688"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:05.999866" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:59:06.000078" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782745,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:05.964388" elapsed="0.035726"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.001099" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782745, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:06.000704" elapsed="0.000424"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:06.001177" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:06.001332" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782745, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:06.000346" elapsed="0.001012"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:06.001738" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:06.001540" elapsed="0.000224"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.002240" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:06.001943" elapsed="0.000323"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.002715" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:06.002437" elapsed="0.000303"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:59:06.002913" elapsed="0.000316"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:59:05.959644" elapsed="0.043644"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:59:05.958992" elapsed="0.044344"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 1.</doc>
<status status="PASS" start="2026-04-10T00:59:05.958598" elapsed="0.044798"/>
</kw>
<arg>${temp_json_config_del_ten_percent}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Delete Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:59:05.900296" elapsed="0.103153"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.013642" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:59:06.013230" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.014129" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:59:06.013832" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:59:06.014202" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:06.014356" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:59:06.012853" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.025187" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:06.024863" elapsed="0.000355"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:06.025265" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:59:06.025433" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:06.024481" elapsed="0.000978"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.040042" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:06.039781" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.040491" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:06.040248" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.041024" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:06.040772" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.041521" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:06.041227" elapsed="0.000358"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:06.042405" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:59:06.042205" elapsed="0.000227"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:59:06.042780" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:59:06.042607" elapsed="0.000200"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:59:06.042959" elapsed="0.000195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.043597" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:06.043315" elapsed="0.000330"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:59:06.043691" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:59:06.043852" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:59:06.041795" elapsed="0.002082"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:06.055004" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:59:06.055058" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:06.055155" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:06.046108" elapsed="0.009075"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:06.043953" elapsed="0.011278"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:06.055427" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:06.055260" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:06.043934" elapsed="0.011581"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.063457" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:06.057410" elapsed="0.006226"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:06.056884" elapsed="0.006841"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:06.056842" elapsed="0.006940"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.066742" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:06.064279" elapsed="0.002509"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:06.063910" elapsed="0.002914"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:06.063872" elapsed="0.002977"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.067420" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:06.067028" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:06.067804" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:06.067518" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.068375" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:06.068053" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:06.067889" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:06.067500" elapsed="0.000959"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.069048" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:06.068638" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:06.069421" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:06.069151" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.069988" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:06.069689" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:06.069509" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:06.069130" elapsed="0.000990"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:06.070278" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:06.071104" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:06.070818" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:06.071290" elapsed="0.002522"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:06.055994" elapsed="0.017882"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:59:06.074055" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:06.073950" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:06.073931" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:59:06.076760" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:59:06.074266" elapsed="0.002522"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:59:06.076838" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:59:06.076997" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:06.036949" elapsed="0.040072"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:06.077087" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:59:06.077238" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:59:06.034252" elapsed="0.043010"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:06.077315" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:59:06.077484" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:06.024029" elapsed="0.053483"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:59:06.019428" elapsed="0.058166"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:06.014587" elapsed="0.063043"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:59:06.014437" elapsed="0.063228"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.089926" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:06.089624" elapsed="0.000330"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:06.090002" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:06.090151" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:06.089242" elapsed="0.000933"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.099128" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:06.098875" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.099674" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:06.099364" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:06.107948" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:06.108017" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:06 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782746,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:06.108162" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:06.101918" elapsed="0.006271"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:06.099791" elapsed="0.008441"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:06.108417" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:06.108260" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:06.099772" elapsed="0.008733"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.112376" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782746,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:06.109576" elapsed="0.002850"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:06.109302" elapsed="0.003159"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:06.109283" elapsed="0.003202"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.115779" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:06.112790" elapsed="0.003037"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:06.112559" elapsed="0.003303"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:06.112525" elapsed="0.003363"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.116572" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:06.116056" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:06.117049" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:06.116716" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.118159" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:06.117400" elapsed="0.000799"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:06.117166" elapsed="0.001085"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:06.116690" elapsed="0.001591"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.119044" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:06.118510" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:06.119517" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:06.119180" elapsed="0.000488"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.120685" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:06.119943" elapsed="0.000780"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:06.119705" elapsed="0.001070"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:06.119156" elapsed="0.001649"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:06.121017" elapsed="0.000674"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:06.122361" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:06.121927" elapsed="0.000472"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:06.122647" elapsed="0.013348"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:06.108876" elapsed="0.027186"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:06.136238" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:59:06.136132" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:06.136114" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:06.136476" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:06.136564" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:06.139137" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782746,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:06.090507" elapsed="0.048659"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:06.139219" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:59:06.139370" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782746,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:06.088742" elapsed="0.050688"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.140438" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782746, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:06.140045" elapsed="0.000421"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:06.140515" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:59:06.140688" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782746, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:06.139694" elapsed="0.001020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:06.141073" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:06.140895" elapsed="0.000203"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.141631" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:06.141279" elapsed="0.000380"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.142101" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:06.141835" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:06.142836" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:06.142301" elapsed="0.000607">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:06.083623" elapsed="0.059399">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:07.155588" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:07.155034" elapsed="0.000590"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:07.155687" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:59:07.155864" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:07.154667" elapsed="0.001222"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:07.162804" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:07.162528" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:07.163262" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:07.163011" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:07.169810" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:07.169871" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:07 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:07 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782747,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:07.169966" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:07.165533" elapsed="0.004458"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:07.163380" elapsed="0.006655"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:07.170232" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:07.170062" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:07.163359" elapsed="0.007000"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:07.175981" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782747,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:07.171886" elapsed="0.004169"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:07.171532" elapsed="0.004575"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:07.171506" elapsed="0.004638"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:07.180633" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:07.176580" elapsed="0.004122"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:07.176227" elapsed="0.004527"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:07.176202" elapsed="0.004587"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:07.181765" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:07.181163" elapsed="0.000642"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:07.182229" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:07.181911" elapsed="0.000376"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:07.183010" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:07.182475" elapsed="0.000562"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:07.182310" elapsed="0.000763"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:07.181884" elapsed="0.001211"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:07.183647" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:07.183257" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:07.183978" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:07.183744" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:07.184746" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:07.184224" elapsed="0.000549"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:07.184058" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:07.183726" elapsed="0.001104"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:07.184983" elapsed="0.000472"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:07.185968" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:07.185639" elapsed="0.000355"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:07.186150" elapsed="0.012788"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:07.170914" elapsed="0.028089"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:07.199179" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T00:59:07.199073" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:07.199055" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:07.199419" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:07.199488" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:59:07.202086" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782747,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:07.156249" elapsed="0.045866"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:07.202166" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:07.202315" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782747,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:07.154168" elapsed="0.048173"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:07.203793" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782747, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:07.202916" elapsed="0.000909"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:07.203874" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:07.204030" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782747, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:07.202575" elapsed="0.001481"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:07.204421" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:07.204242" elapsed="0.000203"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:07.204947" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:07.204648" elapsed="0.000325"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:07.205480" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:07.205212" elapsed="0.000293"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:07.206245" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:07.205885" elapsed="0.000437">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:07.143989" elapsed="0.062447">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:08.220027" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:08.219617" elapsed="0.000445"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:08.220125" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:59:08.220307" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:08.219226" elapsed="0.001107"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:08.227630" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:08.227350" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:08.228080" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:08.227837" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:08.235886" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:08.235989" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:08 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:08 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782748,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:08.236149" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:08.230531" elapsed="0.005655"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:08.228201" elapsed="0.008059"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:08.236595" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:08.236305" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:08.228179" elapsed="0.008565"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:08.242664" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782748,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:08.238432" elapsed="0.004312"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:08.238041" elapsed="0.004771"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:08.238013" elapsed="0.004837"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:08.246077" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:08.243258" elapsed="0.002868"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:08.242935" elapsed="0.003225"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:08.242909" elapsed="0.003275"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:08.246975" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:08.246569" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:08.247314" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:08.247073" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:08.248087" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:08.247577" elapsed="0.000537"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:08.247396" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:08.247055" elapsed="0.001116"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:08.248714" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:08.248337" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:08.249044" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:08.248811" elapsed="0.000362"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:08.249906" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:08.249365" elapsed="0.000569"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:08.249198" elapsed="0.000772"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:08.248793" elapsed="0.001198"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:08.250151" elapsed="0.000504"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:08.251160" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:08.250823" elapsed="0.000364"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:08.251351" elapsed="0.013324"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:08.237361" elapsed="0.027397"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:08.264966" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:59:08.264845" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:08.264821" 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-04-10T00:59:08.265238" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:08.265310" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:59:08.267925" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782748,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:08.220741" elapsed="0.047213"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:08.268008" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:08.268161" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782748,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:08.218127" elapsed="0.050061"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:08.269280" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782748, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:08.268847" elapsed="0.000462"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:08.269358" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:08.269512" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782748, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:08.268435" elapsed="0.001103"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:08.269948" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:08.269766" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:08.270484" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:08.270151" elapsed="0.000361"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:08.271189" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:08.270926" elapsed="0.000288"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:08.271753" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:08.271386" elapsed="0.000442">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:08.207360" elapsed="0.064581">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:09.283605" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:09.283177" elapsed="0.000462"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:09.283700" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:59:09.283875" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:09.282803" elapsed="0.001099"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:09.290972" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:09.290620" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:09.291478" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:09.291184" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:09.299654" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:09.299729" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:09 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:09 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782749,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:09.299849" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:09.293800" elapsed="0.006078"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:09.291619" elapsed="0.008312"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:09.300158" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:09.299965" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:09.291596" elapsed="0.008653"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:09.304379" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782749,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:09.301432" elapsed="0.003023"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:09.301188" elapsed="0.003325"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:09.301167" elapsed="0.003419"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:09.309371" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:09.305016" elapsed="0.004429"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:09.304677" elapsed="0.004821"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:09.304651" elapsed="0.004885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:09.310451" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:09.309858" elapsed="0.000634"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:09.311009" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:09.310629" elapsed="0.000470"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:09.312255" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:09.311383" elapsed="0.000904"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:09.311135" elapsed="0.001190"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:09.310597" elapsed="0.001749"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:09.312941" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:09.312510" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:09.313281" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:09.313040" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:09.314130" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:09.313593" elapsed="0.000565"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:09.313363" elapsed="0.000831"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:09.313022" elapsed="0.001193"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:09.314377" elapsed="0.000492"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:09.315380" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:09.315041" elapsed="0.000400"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:09.315621" elapsed="0.013671"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:09.300704" elapsed="0.028679"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:09.329734" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:59:09.329604" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:09.329576" 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-04-10T00:59:09.330040" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:09.330120" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:59:09.332747" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782749,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:09.284267" elapsed="0.048511"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:09.332832" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:09.332991" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782749,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:09.282294" elapsed="0.050730"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:09.334140" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782749, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:09.333688" elapsed="0.000481"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:09.334219" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:09.334380" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782749, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:09.333276" elapsed="0.001130"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:09.335007" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:09.334816" elapsed="0.000221"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:09.335590" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:09.335233" elapsed="0.000385"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:09.336073" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:09.335795" elapsed="0.000306"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:09.336657" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:09.336278" elapsed="0.000453">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:09.272934" elapsed="0.063910">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:10.350438" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:10.349997" elapsed="0.000473"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:10.350532" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T00:59:10.350726" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:10.349500" elapsed="0.001250"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:10.357960" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:10.357693" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:10.358417" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:10.358168" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:10.367773" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:10.367848" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:10 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:10 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782750,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:10.367969" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:10.360736" elapsed="0.007267"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:10.358535" elapsed="0.009637"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:10.368467" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:10.368210" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:10.358515" elapsed="0.010069"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:10.373650" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782750,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:10.369776" elapsed="0.003945"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:10.369435" elapsed="0.004337"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:10.369409" elapsed="0.004399"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:10.377847" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:10.374209" elapsed="0.003687"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:10.373891" elapsed="0.004039"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:10.373865" elapsed="0.004090"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:10.378536" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:10.378133" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:10.378898" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:10.378656" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:10.379673" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:10.379143" elapsed="0.000557"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:10.378981" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:10.378637" elapsed="0.001139"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:10.380492" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:10.379997" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:10.380948" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:10.380638" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:10.381975" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:10.381281" elapsed="0.000730"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:10.381055" elapsed="0.001004"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:10.380614" elapsed="0.001472"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:10.382294" elapsed="0.000564"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:10.383446" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:10.383059" elapsed="0.000417"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:10.383685" elapsed="0.014425"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:10.368964" elapsed="0.029253"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:10.398484" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-10T00:59:10.398339" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:10.398305" elapsed="0.000505"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:10.399046" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:10.399135" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T00:59:10.404235" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782750,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:10.351103" elapsed="0.053218"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:10.404533" elapsed="0.000601"/>
</return>
<msg time="2026-04-10T00:59:10.405402" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782750,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:10.348650" elapsed="0.056794"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:10.407258" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782750, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:10.406571" elapsed="0.000730"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:10.407384" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T00:59:10.407651" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782750, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:10.405943" elapsed="0.001749"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:10.408258" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:10.407974" elapsed="0.000323"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:10.409112" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:10.408632" elapsed="0.000520"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:10.409862" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:10.409414" elapsed="0.000486"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:10.410739" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:10.410162" elapsed="0.000681">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:10.337824" elapsed="0.073189">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:11.423950" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:11.423567" elapsed="0.000417"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:11.424044" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:59:11.424215" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:11.423157" elapsed="0.001084"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:11.431242" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:11.430973" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:11.431740" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:11.431451" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:11.444256" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:11.444338" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:11 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:11 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782751,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:11.444619" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:11.434072" elapsed="0.010612"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:11.431862" elapsed="0.012945"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:11.445328" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:11.444878" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:11.431841" elapsed="0.013686"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:11.453983" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782751,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:11.448073" elapsed="0.005977"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:11.447495" elapsed="0.006597"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:11.447452" elapsed="0.006667"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:11.457420" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:11.454427" elapsed="0.003044"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:11.454183" elapsed="0.003323"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:11.454164" elapsed="0.003367"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:11.458260" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:11.457755" elapsed="0.000534"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:11.458629" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:11.458364" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:11.459429" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:11.458884" elapsed="0.000574"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:11.458715" elapsed="0.000780"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:11.458345" elapsed="0.001172"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:11.460081" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:11.459705" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:11.460431" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:11.460192" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:11.461247" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:11.460696" elapsed="0.000579"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:11.460513" elapsed="0.000799"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:11.460173" elapsed="0.001161"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:11.461498" elapsed="0.000479"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:11.462492" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:11.462147" elapsed="0.000371"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:11.462698" elapsed="0.013347"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:11.446441" elapsed="0.029676"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:11.476301" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T00:59:11.476189" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:11.476170" elapsed="0.000238"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:11.476584" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:11.476658" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:11.479082" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782751,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:11.424626" elapsed="0.054486"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:11.479166" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:11.479324" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782751,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:11.422600" elapsed="0.056750"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:11.480664" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782751, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:11.480216" elapsed="0.000477"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:11.480743" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:11.480902" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782751, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:11.479848" elapsed="0.001081"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:11.481332" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:11.481143" elapsed="0.000216"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:11.481892" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:11.481566" elapsed="0.000353"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:11.482418" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:11.482097" elapsed="0.000348"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:11.483012" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:11.482646" elapsed="0.000440">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:11.412009" elapsed="0.071191">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:12.495261" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:12.494729" elapsed="0.000578"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:12.495391" elapsed="0.000060"/>
</return>
<msg time="2026-04-10T00:59:12.495661" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:12.494164" elapsed="0.001536"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:12.505099" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:12.504829" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:12.505595" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:12.505308" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:12.512701" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:12.512760" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:12 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:12 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782752,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:12.512856" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:12.507869" elapsed="0.005014"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:12.505718" elapsed="0.007209"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:12.513113" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:12.512955" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:12.505697" elapsed="0.007503"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:12.517078" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782752,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:12.514336" elapsed="0.002793"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:12.514104" elapsed="0.003061"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:12.514084" elapsed="0.003106"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:12.520188" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:12.517479" elapsed="0.002757"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:12.517248" elapsed="0.003023"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:12.517230" elapsed="0.003065"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:12.520892" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:12.520476" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:12.521227" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:12.520990" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:12.522034" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:12.521471" elapsed="0.000591"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:12.521309" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:12.520972" elapsed="0.001147"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:12.522787" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:12.522278" elapsed="0.000549"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:12.523271" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:12.522930" elapsed="0.000494"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:12.524539" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:12.523730" elapsed="0.000873"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:12.523465" elapsed="0.001193"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:12.522904" elapsed="0.001786"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:12.524923" elapsed="0.000764"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:12.526419" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:12.525939" elapsed="0.000518"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:12.526713" elapsed="0.015413"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:12.513618" elapsed="0.028589"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:12.542414" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:59:12.542293" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:12.542269" elapsed="0.000242"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:12.542697" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:12.542771" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:12.545479" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782752,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:12.496214" elapsed="0.049296"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:12.545719" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:59:12.545887" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782752,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:12.493365" elapsed="0.052548"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:12.547089" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782752, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:12.546610" elapsed="0.000515"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:12.547185" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:59:12.547368" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782752, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:12.546164" elapsed="0.001235"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:12.547793" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:12.547602" elapsed="0.000219"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:12.548344" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:12.548012" elapsed="0.000359"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:12.548901" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:12.548629" elapsed="0.000297"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:12.549475" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:12.549099" elapsed="0.000500">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:12.484176" elapsed="0.065549">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:13.559138" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:13.558656" elapsed="0.000524"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:13.559250" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:59:13.559455" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:13.558151" elapsed="0.001338"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:13.566587" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:13.566312" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:13.567117" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:13.566871" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:13.576256" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:13.576333" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:13 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:13 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782753,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:13.576456" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:13.569375" elapsed="0.007111"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:13.567236" elapsed="0.009296"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:13.576743" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:13.576581" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:13.567215" elapsed="0.009613"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:13.581957" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782753,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:13.577886" elapsed="0.004145"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:13.577660" elapsed="0.004446"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:13.577642" elapsed="0.004501"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:13.586593" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:13.582573" elapsed="0.004068"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:13.582226" elapsed="0.004449"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:13.582201" elapsed="0.004499"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:13.587275" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:13.586883" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:13.587629" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:13.587373" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:13.588391" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:13.587875" elapsed="0.000545"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:13.587711" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:13.587355" elapsed="0.001122"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:13.589019" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:13.588654" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:13.589351" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:13.589116" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:13.590150" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:13.589631" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:13.589431" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:13.589099" elapsed="0.001136"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:13.590390" elapsed="0.000464"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:13.591348" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:13.591022" elapsed="0.000353"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:13.591532" elapsed="0.012829"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:13.577206" elapsed="0.027230"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:13.604942" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:59:13.604823" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:13.604800" elapsed="0.000238"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:13.605204" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:13.605277" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:13.607679" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782753,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:13.559956" elapsed="0.047753"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:13.607762" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:13.607916" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782753,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:13.557283" elapsed="0.050659"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:13.608998" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782753, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:13.608586" elapsed="0.000442"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:13.609076" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:13.609231" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782753, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:13.608174" elapsed="0.001083"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:13.609669" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:13.609436" elapsed="0.000259"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:13.610189" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:13.609871" elapsed="0.000345"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:13.610823" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:13.610387" elapsed="0.000462"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:13.611369" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:13.611020" elapsed="0.000420">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:13.550506" elapsed="0.061059">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:14.628260" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:14.627881" elapsed="0.000412"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:14.628353" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:59:14.628525" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:14.627480" elapsed="0.001084"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:14.635409" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:14.635141" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:14.635878" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:14.635632" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:14.643007" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:14.643066" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:14 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:14 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782754,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:14.643173" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:14.638121" elapsed="0.005079"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:14.635996" elapsed="0.007302"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:14.643483" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:14.643328" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:14.635975" elapsed="0.007624"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:14.647387" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782754,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:14.644638" elapsed="0.002798"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:14.644394" elapsed="0.003083"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:14.644376" elapsed="0.003126"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:14.650481" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:14.647805" elapsed="0.002724"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:14.647578" elapsed="0.003000"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:14.647560" elapsed="0.003044"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:14.651199" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:14.650808" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:14.651535" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:14.651297" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:14.652377" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:14.651798" elapsed="0.000608"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:14.651634" elapsed="0.000809"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:14.651279" elapsed="0.001186"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:14.653022" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:14.652659" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:14.653349" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:14.653119" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:14.654111" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:14.653606" elapsed="0.000532"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:14.653429" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:14.653101" elapsed="0.001093"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:14.654348" elapsed="0.000494"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:14.655337" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:14.655011" elapsed="0.000353"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:14.655523" elapsed="0.013359"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:14.643970" elapsed="0.024984"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:14.669142" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:59:14.669031" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:14.669011" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:14.669392" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:14.669463" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:59:14.671813" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782754,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:14.628911" elapsed="0.042930"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:14.671892" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:59:14.672040" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782754,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:14.626240" elapsed="0.045826"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:14.673305" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782754, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:14.672903" elapsed="0.000431"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:14.673382" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:14.673539" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782754, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:14.672368" elapsed="0.001215"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:14.673943" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:14.673763" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:14.674446" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:14.674144" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:14.674966" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:14.674699" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:14.675512" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:14.675162" elapsed="0.000441">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:14.612520" elapsed="0.063195">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:15.688836" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:15.688436" elapsed="0.000433"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:15.688930" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:59:15.689103" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:15.688071" elapsed="0.001056"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:15.696260" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:15.695998" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:15.696730" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:15.696463" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:15.703995" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:15.704056" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:15 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:15 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782755,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:15.704152" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:15.698998" elapsed="0.005181"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:15.696850" elapsed="0.007373"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:15.704407" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:15.704252" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:15.696829" elapsed="0.007663"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:15.708785" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782755,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:15.705602" elapsed="0.003256"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:15.705349" elapsed="0.003559"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:15.705330" elapsed="0.003613"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:15.713337" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:15.709343" elapsed="0.004061"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:15.709023" elapsed="0.004432"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:15.708999" elapsed="0.004491"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:15.714344" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:15.713779" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:15.714941" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:15.714584" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:15.715947" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:15.715333" elapsed="0.000642"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:15.715061" elapsed="0.000951"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:15.714530" elapsed="0.001503"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:15.716593" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:15.716198" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:15.716947" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:15.716694" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:15.717758" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:15.717201" elapsed="0.000585"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:15.717033" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:15.716675" elapsed="0.001170"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:15.718020" elapsed="0.000462"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:15.719266" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:15.718702" elapsed="0.000593"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:15.719452" elapsed="0.012919"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:15.704914" elapsed="0.027524"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:15.732812" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:59:15.732509" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:15.732490" elapsed="0.000414"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:15.733056" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:15.733127" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:15.735629" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782755,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:15.689479" elapsed="0.046180"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:15.735712" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:15.735867" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782755,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:15.687587" elapsed="0.048306"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:15.737154" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782755, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:15.736466" elapsed="0.000716"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:15.737230" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:15.737385" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782755, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:15.736118" elapsed="0.001293"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:15.737862" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:15.737612" elapsed="0.000276"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:15.738369" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:15.738066" elapsed="0.000329"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:15.738848" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:15.738583" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:15.739465" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:15.739085" elapsed="0.000452">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:15.676708" elapsed="0.062960">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:16.751392" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:16.750900" elapsed="0.000535"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:16.751512" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T00:59:16.751802" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:16.750360" elapsed="0.001483"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:16.760873" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:16.760603" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:16.761335" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:16.761084" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:16.770856" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:16.770920" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:16 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:16 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782756,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:16.771019" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:16.763878" elapsed="0.007168"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:16.761466" elapsed="0.009624"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:16.771280" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:16.771120" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:16.761445" elapsed="0.009922"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:16.775276" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782756,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:16.772458" elapsed="0.002869"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:16.772226" elapsed="0.003137"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:16.772208" elapsed="0.003181"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:16.779346" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:16.775694" elapsed="0.003720"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:16.775447" elapsed="0.004017"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:16.775430" elapsed="0.004068"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:16.780376" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:16.779817" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:16.780877" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:16.780514" elapsed="0.000444"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:16.782022" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:16.781224" elapsed="0.000837"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:16.780993" elapsed="0.001120"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:16.780489" elapsed="0.001655"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:16.782995" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:16.782446" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:16.783486" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:16.783143" elapsed="0.000470"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:16.784654" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:16.783933" elapsed="0.000803"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:16.783649" elapsed="0.001127"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:16.783110" elapsed="0.001688"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:16.784958" elapsed="0.000475"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:16.785957" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:16.785621" elapsed="0.000364"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:16.786145" elapsed="0.013270"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:16.771758" elapsed="0.027725"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:16.799685" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T00:59:16.799572" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:16.799537" elapsed="0.000244"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:16.799978" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:16.800052" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:59:16.802748" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782756,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:16.752333" elapsed="0.050446"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:16.802832" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:59:16.802990" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782756,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:16.749585" elapsed="0.053433"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:16.804067" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782756, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:16.803615" elapsed="0.000482"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:16.804147" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:59:16.804328" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782756, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:16.803245" elapsed="0.001112"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:16.804751" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:16.804560" elapsed="0.000219"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:16.805275" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:16.804961" elapsed="0.000341"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:16.805914" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:16.805495" elapsed="0.000446"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:16.806481" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:16.806121" elapsed="0.000446">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:16.740944" elapsed="0.065741">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:17.818476" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:17.817960" elapsed="0.000563"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:17.818627" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T00:59:17.818868" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:17.817382" elapsed="0.001523"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:17.826965" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:17.826590" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:17.827569" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:17.827301" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:17.836641" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:17.836766" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:17 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782757,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:17.836963" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:17.829982" elapsed="0.007024"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:17.827700" elapsed="0.009389"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:17.837446" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:17.837142" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:17.827676" elapsed="0.009927"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:17.843681" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782757,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:17.839283" elapsed="0.004497"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:17.838925" elapsed="0.004922"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:17.838896" elapsed="0.004996"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:17.847375" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:17.844447" elapsed="0.002990"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:17.843995" elapsed="0.003485"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:17.843965" elapsed="0.003546"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:17.848228" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:17.847773" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:17.848657" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:17.848338" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:17.849442" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:17.848912" elapsed="0.000557"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:17.848745" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:17.848316" elapsed="0.001212"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:17.850099" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:17.849721" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:17.850438" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:17.850200" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:17.851204" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:17.850698" elapsed="0.000533"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:17.850520" elapsed="0.000747"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:17.850181" elapsed="0.001107"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:17.851458" elapsed="0.000470"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:17.852484" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:17.852097" elapsed="0.000414"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:17.852718" elapsed="0.013750"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:17.838205" elapsed="0.028388"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:17.866830" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-10T00:59:17.866703" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:17.866674" elapsed="0.000399"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:17.867290" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:17.867365" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:17.870207" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782757,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:17.819427" elapsed="0.050814"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:17.870302" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:59:17.870469" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782757,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:17.816487" elapsed="0.054008"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:17.871944" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782757, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:17.871444" elapsed="0.000530"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:17.872026" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:59:17.872190" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782757, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:17.871013" elapsed="0.001203"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:17.873043" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:17.872448" elapsed="0.000623"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:17.873586" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:17.873253" elapsed="0.000363"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:17.874054" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:17.873789" elapsed="0.000291"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:17.874635" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:17.874255" elapsed="0.000454">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:17.807687" elapsed="0.067139">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:18.888151" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:18.887781" elapsed="0.000404"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:18.888244" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:59:18.888413" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:18.887367" elapsed="0.001072"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:18.895540" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:18.895213" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:18.896084" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:18.895817" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:18.905265" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:18.905358" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:18 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782758,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:18.905501" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:18.898521" elapsed="0.007009"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:18.896223" elapsed="0.009391"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:18.906041" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:18.905743" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:18.896196" elapsed="0.009977"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:18.912090" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782758,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:18.907840" elapsed="0.004337"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:18.907466" elapsed="0.004769"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:18.907437" elapsed="0.004837"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:18.917275" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:18.912753" elapsed="0.004610"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:18.912368" elapsed="0.005059"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:18.912340" elapsed="0.005126"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:18.918236" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:18.917786" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:18.918645" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:18.918345" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:18.919413" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:18.918896" elapsed="0.000544"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:18.918730" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:18.918324" elapsed="0.001175"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:18.920053" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:18.919680" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:18.920390" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:18.920152" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:18.921181" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:18.920653" elapsed="0.000555"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:18.920471" elapsed="0.000772"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:18.920134" elapsed="0.001130"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:18.921431" elapsed="0.000470"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:18.922409" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:18.922071" elapsed="0.000364"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:18.922610" elapsed="0.013386"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:18.906780" elapsed="0.029328"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:18.936344" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-10T00:59:18.936215" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:18.936183" 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-04-10T00:59:18.936671" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:18.936747" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:18.939252" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782758,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:18.888824" elapsed="0.050458"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:18.939337" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:18.939496" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782758,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:18.886379" elapsed="0.053143"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:18.941135" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782758, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:18.940620" elapsed="0.000544"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:18.941213" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:18.941369" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782758, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:18.940099" elapsed="0.001296"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:18.941778" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:18.941592" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:18.942293" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:18.941983" elapsed="0.000336"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:18.942785" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:18.942493" elapsed="0.000318"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:18.943355" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:18.942984" elapsed="0.000444">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:18.875741" elapsed="0.068168">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:19.955880" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:19.955306" elapsed="0.000814"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:19.956203" elapsed="0.000070"/>
</return>
<msg time="2026-04-10T00:59:19.956488" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:19.954752" elapsed="0.001787"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:19.965035" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:19.964685" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:19.965747" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:19.965274" elapsed="0.000538"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:19.979389" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:19.979593" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:19 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782759,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:19.979863" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:19.968577" elapsed="0.011350"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:19.965922" elapsed="0.014120"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:19.980536" elapsed="0.000084"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:19.980118" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:19.965892" elapsed="0.014875"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:19.988432" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782759,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:19.983252" elapsed="0.005280"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:19.982734" elapsed="0.005901"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:19.982693" elapsed="0.005988"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:19.994002" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:19.989191" elapsed="0.004901"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:19.988790" elapsed="0.005370"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:19.988758" elapsed="0.005449"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:19.995280" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:19.994583" elapsed="0.000740"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:19.995985" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:19.995596" elapsed="0.000480"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:19.997257" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:19.996391" elapsed="0.000909"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:19.996112" elapsed="0.001245"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:19.995540" elapsed="0.001849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:19.998258" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:19.997685" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:19.998791" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:19.998410" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:19.999943" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:19.999158" elapsed="0.000825"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:19.998915" elapsed="0.001123"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:19.998381" elapsed="0.001689"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:20.000313" elapsed="0.000713"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:20.001892" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:20.001312" elapsed="0.000610"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:20.002086" elapsed="0.014305"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:19.981694" elapsed="0.034814"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:20.017119" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:59:20.016980" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:20.016948" 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-04-10T00:59:20.017434" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:20.017595" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:59:20.020199" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782759,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:19.957297" elapsed="0.062942"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:20.020298" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:59:20.020466" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782759,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:19.953868" elapsed="0.066625"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:20.021859" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782759, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:20.021267" elapsed="0.000622"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:20.021938" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:20.022098" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782759, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:20.020844" elapsed="0.001281"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:20.022515" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:20.022311" elapsed="0.000459"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:20.023337" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:20.022960" elapsed="0.000408"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:20.023937" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:20.023572" elapsed="0.000392"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:20.025069" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:20.024142" elapsed="0.001004">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:19.944844" elapsed="0.080443">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:21.036889" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:21.036370" elapsed="0.000562"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:21.037009" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:59:21.037236" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:21.035855" elapsed="0.001415"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:21.045718" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:21.045442" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:21.046191" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:21.045924" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:21.055597" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:21.055660" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:21 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782761,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:21.055756" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:21.048435" elapsed="0.007349"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:21.046311" elapsed="0.009520"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:21.056013" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:21.055858" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:21.046290" elapsed="0.009807"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:21.060575" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782761,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:21.057130" elapsed="0.003519"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:21.056907" elapsed="0.003791"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:21.056889" elapsed="0.003843"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:21.064943" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:21.061120" elapsed="0.003889"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:21.060810" elapsed="0.004250"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:21.060786" elapsed="0.004308"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:21.066152" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:21.065336" elapsed="0.000877"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:21.066691" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:21.066321" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:21.067680" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:21.067153" elapsed="0.000554"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:21.066800" elapsed="0.000945"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:21.066293" elapsed="0.001474"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:21.068294" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:21.067927" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:21.068657" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:21.068392" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:21.069400" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:21.068901" elapsed="0.000579"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:21.068740" elapsed="0.000778"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:21.068374" elapsed="0.001166"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:21.069713" elapsed="0.000515"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:21.070762" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:21.070410" elapsed="0.000378"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:21.070945" elapsed="0.015304"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:21.056465" elapsed="0.029905"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:21.086635" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-10T00:59:21.086487" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:21.086456" elapsed="0.000287"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:21.086963" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:21.087068" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:59:21.089798" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782761,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:21.037771" elapsed="0.052061"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:21.089887" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:21.090046" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782761,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:21.035169" elapsed="0.054904"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:21.091313" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782761, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:21.090855" elapsed="0.000487"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:21.091390" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:21.091561" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782761, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:21.090420" elapsed="0.001170"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:21.091959" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:21.091770" elapsed="0.000214"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:21.092466" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:21.092159" elapsed="0.000334"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:21.093308" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:21.093041" elapsed="0.000293"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:21.093880" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:21.093507" elapsed="0.000446">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:21.026296" elapsed="0.067771">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:22.106216" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:22.105841" elapsed="0.000407"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:22.106307" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:59:22.106477" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:22.105455" elapsed="0.001048"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:22.113467" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:22.113204" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:22.114023" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:22.113770" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:22.124878" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:22.124962" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:22 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:22 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782762,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:22.125090" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:22.116336" elapsed="0.008784"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:22.114143" elapsed="0.011032"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:22.125420" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:22.125211" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:22.114122" elapsed="0.011388"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:22.129564" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782762,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:22.126707" elapsed="0.002911"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:22.126421" elapsed="0.003234"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:22.126400" elapsed="0.003280"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:22.135092" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:22.129967" elapsed="0.005194"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:22.129737" elapsed="0.005475"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:22.129720" elapsed="0.005527"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:22.136072" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:22.135496" elapsed="0.000615"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:22.136574" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:22.136211" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:22.137700" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:22.136923" elapsed="0.000816"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:22.136693" elapsed="0.001099"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:22.136186" elapsed="0.001637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:22.138594" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:22.138050" elapsed="0.000583"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:22.139111" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:22.138776" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:22.140102" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:22.139453" elapsed="0.000677"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:22.139227" elapsed="0.000940"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:22.138750" elapsed="0.001439"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:22.140345" elapsed="0.000550"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:22.141394" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:22.141067" elapsed="0.000354"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:22.141594" elapsed="0.013356"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:22.125951" elapsed="0.029112"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:22.155307" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-10T00:59:22.155174" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:22.155142" elapsed="0.000352"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:22.155720" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:22.155799" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:22.158580" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782762,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:22.106899" elapsed="0.051713"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:22.158701" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:22.158857" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782762,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:22.104959" elapsed="0.053925"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:22.160038" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782762, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:22.159581" elapsed="0.000485"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:22.160114" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:22.160268" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782762, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:22.159159" elapsed="0.001134"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:22.160712" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:22.160473" elapsed="0.000266"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:22.161232" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:22.160916" elapsed="0.000342"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:22.161755" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:22.161432" elapsed="0.000349"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:22.162312" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:22.161955" elapsed="0.000428">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:22.095139" elapsed="0.067354">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:23.176704" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:23.176206" elapsed="0.000540"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:23.176823" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:59:23.177044" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:23.175689" elapsed="0.001392"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:23.185536" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:23.185213" elapsed="0.000402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:23.186216" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:23.185912" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:23.196312" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:23.196424" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:23 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:23 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782763,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:23.196610" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:23.189204" elapsed="0.007444"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:23.186365" elapsed="0.010364"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:23.197154" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:23.196869" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:23.186338" elapsed="0.010941"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:23.202942" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782763,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:23.198943" elapsed="0.004079"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:23.198630" elapsed="0.004447"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:23.198606" elapsed="0.004507"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:23.207282" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:23.203567" elapsed="0.003795"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:23.203199" elapsed="0.004218"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:23.203172" elapsed="0.004283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:23.208350" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:23.207780" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:23.208878" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:23.208488" elapsed="0.000466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:23.209866" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:23.209210" elapsed="0.000696"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:23.208985" elapsed="0.000968"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:23.208461" elapsed="0.001519"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:23.210780" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:23.210192" elapsed="0.000623"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:23.211205" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:23.210908" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:23.212198" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:23.211582" elapsed="0.000650"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:23.211350" elapsed="0.000925"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:23.210885" elapsed="0.001415"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:23.212515" elapsed="0.000596"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:23.213764" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:23.213332" elapsed="0.000459"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:23.213954" elapsed="0.015980"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:23.197822" elapsed="0.032239"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:23.230365" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-04-10T00:59:23.230201" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:23.230158" elapsed="0.000339"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:23.230783" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:23.230881" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:59:23.234410" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782763,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:23.177531" elapsed="0.056920"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:23.234524" elapsed="0.000060"/>
</return>
<msg time="2026-04-10T00:59:23.234757" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782763,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:23.174810" elapsed="0.059984"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:23.236448" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782763, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:23.235834" elapsed="0.000652"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:23.236908" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:59:23.237144" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782763, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:23.235147" elapsed="0.002036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:23.237739" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:23.237447" elapsed="0.000331"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:23.238481" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:23.238034" elapsed="0.000483"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:23.239182" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:23.238790" elapsed="0.000429"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:23.240019" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:23.239492" elapsed="0.000616">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:23.163949" elapsed="0.076299">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.251357" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:24.250826" elapsed="0.000579"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:24.251488" elapsed="0.000079"/>
</return>
<msg time="2026-04-10T00:59:24.251761" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:24.250249" elapsed="0.001592"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.259484" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.259213" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.260091" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.259824" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:24.269140" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:24.269208" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:24 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:24 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782764,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:24.269311" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:24.262414" elapsed="0.006924"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.260216" elapsed="0.009168"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:24.269609" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:24.269416" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.260194" elapsed="0.009507"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.274675" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782764,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.270807" elapsed="0.003980"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.270567" elapsed="0.004299"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.270531" elapsed="0.004389"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.279091" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.275581" elapsed="0.003559"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.275043" elapsed="0.004133"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.275006" elapsed="0.004195"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.279856" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:24.279390" elapsed="0.000496"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:24.280304" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:24.280052" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.281100" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:24.280576" elapsed="0.000551"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.280389" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.280032" elapsed="0.001154"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.281738" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:24.281348" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:24.282083" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:24.281838" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.282895" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:24.282345" elapsed="0.000579"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.282167" elapsed="0.000794"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.281819" elapsed="0.001164"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:24.283337" elapsed="0.000534"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:24.284411" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:24.284066" elapsed="0.000373"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:24.284617" elapsed="0.013805"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:24.270099" elapsed="0.028409"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:24.298939" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:59:24.298812" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.298785" elapsed="0.000257"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:24.299222" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:24.299316" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T00:59:24.301816" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782764,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:24.252439" elapsed="0.049408"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:24.301900" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:24.302057" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782764,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:24.249447" elapsed="0.052636"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.303432" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782764, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:24.302991" elapsed="0.000470"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:24.303510" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:24.303686" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782764, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:24.302360" elapsed="0.001353"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:24.304129" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:24.303939" elapsed="0.000216"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.304668" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:24.304335" elapsed="0.000359"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.305136" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:24.304868" elapsed="0.000294"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:59:24.305336" elapsed="0.000400"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:59:24.241504" elapsed="0.064297"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:59:06.082994" elapsed="18.222862"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:06.082589" elapsed="18.223332"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:06.077864" elapsed="18.228100"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:59:06.077722" elapsed="18.228287"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.318336" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:24.317991" elapsed="0.000374"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:24.318424" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:59:24.318622" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:24.317623" elapsed="0.001024"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.329382" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.328957" elapsed="0.000495"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.330080" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.329704" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:24.342230" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:24.342312" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:24 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:24 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782764,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:24.342427" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:24.333537" elapsed="0.008917"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.330261" elapsed="0.012245"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:24.342745" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:24.342539" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.330223" elapsed="0.012611"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.346623" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782764,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.344037" elapsed="0.002638"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.343751" elapsed="0.002959"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.343730" elapsed="0.003005"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.350002" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.347021" elapsed="0.003054"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.346791" elapsed="0.003335"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.346774" elapsed="0.003388"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.351075" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:24.350422" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:24.351630" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:24.351239" elapsed="0.000480"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.352529" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:24.352027" elapsed="0.000568"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.351755" elapsed="0.000896"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.351210" elapsed="0.001472"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.353504" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:24.352922" elapsed="0.000643"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:24.354134" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:24.353769" elapsed="0.000452"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.354979" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:24.354503" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.354258" elapsed="0.000815"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.353739" elapsed="0.001367"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:24.355340" elapsed="0.000620"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:24.356677" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:24.356219" elapsed="0.000499"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:24.356941" elapsed="0.002540"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:24.343263" elapsed="0.016307"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:24.359765" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T00:59:24.359647" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.359627" elapsed="0.000271"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:24.360053" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:24.360127" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:24.362528" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782764,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:24.319149" elapsed="0.043427"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:24.362633" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:24.362790" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782764,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:24.317113" elapsed="0.045703"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:59:24.362866" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:59:24.363012" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782764,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:59:24.312210" elapsed="0.050828"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.364139" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 9000, 'timestamp': 1775782764, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:24.363669" elapsed="0.000499"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:24.364217" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:24.364374" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 9000, 'timestamp': 1775782764, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:24.363283" elapsed="0.001117"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:24.364785" level="INFO">${value} = 9000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:24.364600" elapsed="0.000210"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.365296" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:59:24.365003" elapsed="0.000352"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 9000.</doc>
<status status="PASS" start="2026-04-10T00:59:24.311662" elapsed="0.053754"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:24.306219" elapsed="0.059232"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:59:24.306072" elapsed="0.059417"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_del_ten_percent}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:59:06.012264" elapsed="18.353306"/>
</kw>
<kw name="Add Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Add Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.377366" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:24.376995" elapsed="0.000403"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:24.377455" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:59:24.377644" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:24.376498" elapsed="0.001171"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.392503" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.392131" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.393000" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.392754" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.393444" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.393200" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.393901" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.393661" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:24.394797" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:59:24.394581" elapsed="0.000242"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:59:24.395152" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:59:24.394979" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:59:24.395329" elapsed="0.000207"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.395984" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.395711" elapsed="0.000316"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:59:24.396075" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:59:24.396358" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:59:24.394154" elapsed="0.002234"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:24.408192" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Content-Length': '401', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:59:24.408254" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:24.408396" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:24.399082" elapsed="0.009343"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.396479" elapsed="0.012001"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:24.408722" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:24.408514" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.396455" elapsed="0.012360"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.417014" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.411319" elapsed="0.005794"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.410787" elapsed="0.006406"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.410741" elapsed="0.006515"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.422218" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.417979" elapsed="0.004297"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.417400" elapsed="0.004911"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.417361" elapsed="0.004975"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.422973" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:24.422532" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:24.423315" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:24.423071" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.424103" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:24.423750" elapsed="0.000381"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.423571" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.423053" elapsed="0.001136"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.424740" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:24.424351" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:24.425076" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:24.424837" elapsed="0.000482"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.425823" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:24.425503" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.425342" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.424819" elapsed="0.001087"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:24.426065" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:24.426957" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:24.426650" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:24.427319" elapsed="0.002568"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:24.409612" elapsed="0.020345"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:59:24.430144" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:24.430033" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.430014" elapsed="0.000203"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:59:24.432844" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:59:24.430365" elapsed="0.002506"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:59:24.432919" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:59:24.433090" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:24.389065" elapsed="0.044050"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:24.433182" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:59:24.433332" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:59:24.386122" elapsed="0.047235"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:24.433469" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:59:24.433634" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:24.376002" elapsed="0.057657"/>
</kw>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Add Bulk Flow in member 1 according to ${json_body_add}.</doc>
<status status="PASS" start="2026-04-10T00:59:24.371227" elapsed="0.062499"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.441518" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:24.441214" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:24.441609" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:24.441760" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:24.440856" elapsed="0.000929"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.449605" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.449296" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.450446" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.450085" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:24.457751" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:24.457840" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:24 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:24 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782764,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:24.457988" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:24.453167" elapsed="0.004862"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.450767" elapsed="0.007328"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:24.458386" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:24.458144" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.450738" elapsed="0.007780"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.463434" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782764,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.460025" elapsed="0.003484"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.459679" elapsed="0.003900"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.459651" elapsed="0.003968"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.467310" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:24.464062" elapsed="0.003310"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.463705" elapsed="0.003712"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.463681" elapsed="0.003768"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.468296" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:24.467721" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:24.468800" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:24.468433" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.469642" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:24.469151" elapsed="0.000535"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.468916" elapsed="0.000816"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.468407" elapsed="0.001352"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.470432" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:24.469982" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:24.470903" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:24.470577" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.471668" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:24.471240" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:24.471018" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.470534" elapsed="0.001246"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:24.472009" elapsed="0.000616"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:24.473216" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:24.472843" elapsed="0.000406"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:24.473457" elapsed="0.003508"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:24.459060" elapsed="0.018000"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:24.477564" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-10T00:59:24.477402" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:24.477375" elapsed="0.000312"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:24.477892" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:24.477992" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:59:24.481127" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782764,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:24.442127" elapsed="0.039036"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:24.481227" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:59:24.481420" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782764,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:24.440300" elapsed="0.041155"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.482819" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782764, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:24.482262" elapsed="0.000597"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:24.482924" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:59:24.483145" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782764, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:24.481789" elapsed="0.001392"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:24.483672" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:24.483421" elapsed="0.000283"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.484371" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:24.483980" elapsed="0.000424"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.484987" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:24.484650" elapsed="0.000370"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:24.485740" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:24.485247" elapsed="0.000601">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:24.434978" elapsed="0.051035">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.498582" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:25.498187" elapsed="0.000430"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:25.498678" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T00:59:25.498852" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:25.497819" elapsed="0.001059"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.506323" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:25.505960" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.506806" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:25.506535" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:25.513462" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:25.513522" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:25 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:25 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782765,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:25.513642" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:25.509106" elapsed="0.004563"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:25.506926" elapsed="0.006847"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:25.513962" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:25.513804" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.506904" elapsed="0.007152"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.517965" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782765,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:25.515096" elapsed="0.002939"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:25.514870" elapsed="0.003215"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.514852" elapsed="0.003267"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.522031" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:25.518514" elapsed="0.003583"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:25.518199" elapsed="0.003948"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.518175" elapsed="0.004006"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.523007" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:25.522430" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:25.523482" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:25.523146" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.524297" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:25.523857" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:25.523628" elapsed="0.000778"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.523120" elapsed="0.001318"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.525245" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:25.524767" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:25.525606" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:25.525348" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.526157" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:25.525853" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:25.525690" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.525330" elapsed="0.000911"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:25.526396" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:25.527255" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:25.526930" elapsed="0.000354"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:25.527476" elapsed="0.002600"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:25.514422" elapsed="0.015720"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:25.530324" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:59:25.530216" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.530197" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:25.530584" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:25.530658" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:59:25.533390" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782765,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:25.499415" elapsed="0.034006"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:25.533474" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:25.533657" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782765,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:25.497316" elapsed="0.036370"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.534790" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782765, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:25.534336" elapsed="0.000486"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:25.534879" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:59:25.535049" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782765, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:25.533959" elapsed="0.001117"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:25.535462" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:25.535259" elapsed="0.000229"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.536001" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:25.535686" elapsed="0.000343"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.536494" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:25.536203" elapsed="0.000318"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:59:25.536751" elapsed="0.000323"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:59:25.486948" elapsed="0.050189"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:59:24.434366" elapsed="1.102821"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 1.</doc>
<status status="PASS" start="2026-04-10T00:59:24.433963" elapsed="1.103284"/>
</kw>
<arg>${temp_json_config_add_ten_percent}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Add Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:59:24.370687" elapsed="1.166616"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.547844" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:59:25.547416" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.548348" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:59:25.548050" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:59:25.548419" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:25.548642" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:59:25.547035" elapsed="0.001634"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.559659" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:25.559336" elapsed="0.000351"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:25.559733" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:25.559883" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:25.558983" elapsed="0.000925"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.574195" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:25.573919" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.574660" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:25.574401" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.575139" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:25.574874" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.575653" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:25.575365" elapsed="0.000335"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:25.576524" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:59:25.576304" elapsed="0.000261"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:59:25.576893" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:59:25.576723" elapsed="0.000195"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:59:25.577111" elapsed="0.000211"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.577782" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:25.577511" elapsed="0.000316"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:59:25.577871" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:25.578025" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:59:25.575903" elapsed="0.002147"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:25.595768" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:59:25.595930" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:25.596210" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:25.580226" elapsed="0.016051"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:25.578121" elapsed="0.018283"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:25.597007" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:25.596518" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.578103" elapsed="0.019115"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.605386" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:25.599849" elapsed="0.005595"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:25.599281" elapsed="0.006207"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.599237" elapsed="0.006276"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.608517" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:25.605821" elapsed="0.002767"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:25.605588" elapsed="0.003043"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.605570" elapsed="0.003089"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.609274" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:25.608854" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:25.609661" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:25.609375" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.610248" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:25.609919" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:25.609752" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.609356" elapsed="0.000978"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.610940" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:25.610497" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:25.611285" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:25.611042" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.611947" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:25.611631" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:25.611369" elapsed="0.000641"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.611024" elapsed="0.001007"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:25.612189" elapsed="0.000421"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:25.613099" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:25.612794" elapsed="0.000332"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:25.613283" elapsed="0.004528"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:25.598152" elapsed="0.019796"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:59:25.618144" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:25.618026" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.618007" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:59:25.620914" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:59:25.618365" elapsed="0.002576"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:59:25.620990" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:59:25.621157" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:25.571025" elapsed="0.050156"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:25.621248" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:59:25.621414" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:59:25.568289" elapsed="0.053155"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:25.621499" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:25.621666" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:25.558515" elapsed="0.063175"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:59:25.553792" elapsed="0.067960"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:25.548880" elapsed="0.072906"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:59:25.548737" elapsed="0.073085"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.633947" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:25.633629" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:25.634024" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:59:25.634201" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:25.633261" elapsed="0.000965"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.641425" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:25.641148" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.641902" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:25.641649" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:25.652084" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:25.652168" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:25 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:25 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782765,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:25.652274" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:25.644217" elapsed="0.008084"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:25.642017" elapsed="0.010326"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:25.652614" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:25.652370" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.641998" elapsed="0.010712"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.661655" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782765,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:25.654740" elapsed="0.007051"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:25.654146" elapsed="0.007691"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.654105" elapsed="0.007763"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.665281" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:25.662223" elapsed="0.003112"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:25.661943" elapsed="0.003431"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.661920" elapsed="0.003481"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.666094" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:25.665644" elapsed="0.000662"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:25.666648" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:25.666384" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.667466" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:25.666922" elapsed="0.000573"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:25.666733" elapsed="0.000800"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.666363" elapsed="0.001210"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.668234" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:25.667782" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:25.668644" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:25.668342" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.669448" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:25.668898" elapsed="0.000579"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:25.668731" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.668324" elapsed="0.001212"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:25.669726" elapsed="0.000480"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:25.670744" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:25.670379" elapsed="0.000400"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:25.670955" elapsed="0.014069"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:25.653135" elapsed="0.032001"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:25.685403" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-10T00:59:25.685257" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:25.685213" 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-04-10T00:59:25.685986" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:25.686067" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:59:25.689060" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782765,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:25.634601" elapsed="0.054497"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:25.689162" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:59:25.689357" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782765,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:25.632788" elapsed="0.056602"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.690660" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782765, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:25.690146" elapsed="0.000544"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:25.690740" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:59:25.690902" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782765, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:25.689717" elapsed="0.001292"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:25.691445" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:25.691196" elapsed="0.000277"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.692028" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:25.691674" elapsed="0.000383"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.692969" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:25.692233" elapsed="0.000765"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:25.693604" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:25.693183" elapsed="0.000501">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:25.628113" elapsed="0.065686">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:26.705382" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:26.704845" elapsed="0.000583"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:26.705512" elapsed="0.000078"/>
</return>
<msg time="2026-04-10T00:59:26.705780" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:26.704269" elapsed="0.001549"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:26.714694" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:26.714323" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:26.715171" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:26.714925" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:26.725069" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:26.725231" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:26 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:26 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782766,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:26.725426" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:26.717578" elapsed="0.007891"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:26.715300" elapsed="0.010281"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:26.725926" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:26.725635" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:26.715276" elapsed="0.010782"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:26.732163" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782766,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:26.727776" elapsed="0.004476"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:26.727389" elapsed="0.004922"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:26.727356" elapsed="0.004995"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:26.736204" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:26.732896" elapsed="0.003382"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:26.732453" elapsed="0.003877"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:26.732419" elapsed="0.003947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:26.737167" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:26.736655" elapsed="0.000544"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:26.737581" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:26.737289" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:26.738417" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:26.737852" elapsed="0.000740"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:26.737669" elapsed="0.000965"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:26.737265" elapsed="0.001392"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:26.739252" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:26.738862" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:26.739627" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:26.739355" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:26.740448" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:26.739879" elapsed="0.000598"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:26.739713" elapsed="0.000801"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:26.739336" elapsed="0.001199"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:26.740723" elapsed="0.000483"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:26.741728" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:26.741377" elapsed="0.000378"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:26.741915" elapsed="0.014370"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:26.726691" elapsed="0.029707"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:26.756659" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-10T00:59:26.756506" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:26.756475" elapsed="0.000291"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:26.756971" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:26.757048" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:59:26.759816" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782766,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:26.706328" elapsed="0.053522"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:26.759908" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:59:26.760074" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782766,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:26.703421" elapsed="0.056680"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:26.761362" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782766, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:26.760833" elapsed="0.000558"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:26.761441" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:26.761623" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782766, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:26.760394" elapsed="0.001258"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:26.762024" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:26.761834" elapsed="0.000216"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:26.762574" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:26.762236" elapsed="0.000366"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:26.763048" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:26.762779" elapsed="0.000296"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:26.763968" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:26.763259" elapsed="0.000784">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:26.694774" elapsed="0.069384">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:27.776467" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:27.776085" elapsed="0.000418"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:27.776582" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:59:27.776759" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:27.775692" elapsed="0.001093"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:27.784309" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:27.783984" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:27.784801" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:27.784533" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:27.794325" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:27.794413" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:27 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782767,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:27.794565" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:27.787170" elapsed="0.007428"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:27.784926" elapsed="0.009749"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:27.794950" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:27.794724" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:27.784903" elapsed="0.010142"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:27.801360" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782767,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:27.796905" elapsed="0.004559"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:27.796528" elapsed="0.004996"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:27.796498" elapsed="0.005103"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:27.806253" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:27.802124" elapsed="0.004182"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:27.801757" elapsed="0.004588"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:27.801725" elapsed="0.004647"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:27.807021" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:27.806604" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:27.807371" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:27.807123" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:27.808156" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:27.807639" elapsed="0.000544"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:27.807455" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:27.807103" elapsed="0.001139"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:27.808787" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:27.808405" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:27.809120" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:27.808885" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:27.809929" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:27.809365" elapsed="0.000591"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:27.809202" elapsed="0.000791"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:27.808867" elapsed="0.001151"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:27.810201" elapsed="0.000469"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:27.811251" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:27.810914" elapsed="0.000364"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:27.811437" elapsed="0.013753"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:27.795670" elapsed="0.029631"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:27.825537" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-04-10T00:59:27.825406" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:27.825378" elapsed="0.000289"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:27.825901" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:27.825992" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T00:59:27.829052" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782767,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:27.777146" elapsed="0.051942"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:27.829150" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:59:27.829322" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782767,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:27.775004" elapsed="0.054346"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:27.830637" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782767, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:27.830142" elapsed="0.000525"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:27.830717" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:27.830879" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782767, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:27.829650" elapsed="0.001263"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:27.831323" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:27.831127" elapsed="0.000222"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:27.832141" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:27.831530" elapsed="0.000640"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:27.832639" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:27.832346" elapsed="0.000320"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:27.833228" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:27.832843" elapsed="0.000477">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:27.765113" elapsed="0.068351">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:28.848791" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:28.848287" elapsed="0.000541"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:28.848894" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T00:59:28.849077" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:28.847859" elapsed="0.001245"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:28.856507" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:28.856183" elapsed="0.000409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:28.857028" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:28.856764" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:28.864197" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:28.864338" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:28 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782768,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:28.864442" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:28.859394" elapsed="0.005076"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:28.857157" elapsed="0.007359"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:28.864756" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:28.864572" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:28.857133" elapsed="0.007719"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:28.868789" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782768,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:28.865961" elapsed="0.002882"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:28.865727" elapsed="0.003154"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:28.865707" elapsed="0.003200"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:28.872129" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:28.869200" elapsed="0.002980"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:28.868967" elapsed="0.003250"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:28.868949" elapsed="0.003294"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:28.872868" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:28.872428" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:28.873221" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:28.872974" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:28.874045" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:28.873476" elapsed="0.000597"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:28.873309" elapsed="0.000803"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:28.872954" elapsed="0.001181"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:28.874790" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:28.874377" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:28.875147" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:28.874903" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:28.875950" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:28.875397" elapsed="0.000582"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:28.875231" elapsed="0.000785"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:28.874884" elapsed="0.001154"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:28.876196" elapsed="0.000487"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:28.877199" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:28.876856" elapsed="0.000370"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:28.877386" elapsed="0.013297"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:28.865251" elapsed="0.025500"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:28.890937" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T00:59:28.890824" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:28.890804" elapsed="0.000253"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:28.891229" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:28.891307" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:28.894170" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782768,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:28.849486" elapsed="0.044807"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:28.894360" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:59:28.894532" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782768,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:28.846984" elapsed="0.047591"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:28.895748" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782768, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:28.895243" elapsed="0.000536"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:28.895831" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:28.895995" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782768, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:28.894834" elapsed="0.001189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:28.896428" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:28.896233" elapsed="0.000223"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:28.896986" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:28.896661" elapsed="0.000354"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:28.897497" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:28.897216" elapsed="0.000309"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:28.898510" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:28.898044" elapsed="0.000562">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:28.834458" elapsed="0.064266">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:29.909759" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:29.909235" elapsed="0.000568"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:29.909880" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:59:29.910106" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:29.908730" elapsed="0.001412"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:29.919431" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:29.919144" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:29.919920" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:29.919658" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:29.927257" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:29.927317" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:29 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782769,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:29.927412" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:29.922198" elapsed="0.005240"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:29.920068" elapsed="0.007414"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:29.927699" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:29.927511" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:29.920044" elapsed="0.007742"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:29.932000" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782769,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:29.928894" elapsed="0.003178"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:29.928610" elapsed="0.003586"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:29.928592" elapsed="0.003641"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:29.936633" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:29.932666" elapsed="0.004035"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:29.932315" elapsed="0.004434"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:29.932290" elapsed="0.004494"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:29.937601" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:29.937033" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:29.938233" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:29.937742" elapsed="0.000577"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:29.939328" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:29.938604" elapsed="0.000751"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:29.938353" elapsed="0.001039"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:29.937717" elapsed="0.001696"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:29.939958" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:29.939593" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:29.940289" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:29.940056" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:29.941061" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:29.940529" elapsed="0.000559"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:29.940370" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:29.940038" elapsed="0.001107"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:29.941305" elapsed="0.000468"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:29.942270" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:29.941940" elapsed="0.000356"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:29.942452" elapsed="0.012895"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:29.928166" elapsed="0.027249"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:29.955613" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:59:29.955487" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:29.955469" 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-04-10T00:59:29.955945" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:29.956021" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:59:29.958559" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782769,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:29.910635" elapsed="0.047955"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:29.958643" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:29.958795" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782769,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:29.908038" elapsed="0.050845"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:29.959884" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782769, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:29.959470" elapsed="0.000442"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:29.959960" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:29.960113" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782769, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:29.959120" elapsed="0.001100"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:29.960839" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:29.960407" elapsed="0.000459"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:29.961351" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:29.961046" elapsed="0.000331"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:29.961832" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:29.961567" elapsed="0.000291"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:29.962381" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:29.962032" elapsed="0.000422">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:29.899876" elapsed="0.062707">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:30.976882" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:30.976494" elapsed="0.000421"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:30.976976" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:59:30.977147" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:30.976011" elapsed="0.001161"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:30.984005" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:30.983744" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:30.984447" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:30.984209" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:30.996287" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:30.996367" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:30 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782770,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:30.996702" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:30.986714" elapsed="0.010016"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:30.984579" elapsed="0.012201"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:30.997006" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:30.996815" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:30.984557" elapsed="0.012534"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:31.005661" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782770,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:30.999400" elapsed="0.006373"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:30.998862" elapsed="0.006990"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:30.998820" elapsed="0.007086"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:31.010491" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:31.006526" elapsed="0.004031"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:31.006030" elapsed="0.004565"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:31.005993" elapsed="0.004626"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:31.011218" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:31.010814" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:31.011592" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:31.011317" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:31.012355" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:31.011841" elapsed="0.000541"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:31.011675" elapsed="0.000809"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:31.011298" elapsed="0.001210"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:31.013076" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:31.012704" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:31.013412" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:31.013175" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:31.014180" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:31.013674" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:31.013495" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:31.013157" elapsed="0.001109"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:31.014426" elapsed="0.000469"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:31.015429" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:31.015065" elapsed="0.000393"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:31.015633" elapsed="0.012469"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:30.997835" elapsed="0.030338"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:31.028361" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T00:59:31.028250" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:31.028230" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:31.028849" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:31.028922" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:31.031291" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782770,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:30.977513" elapsed="0.053806"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:31.031371" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:59:31.031560" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782770,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:30.974887" elapsed="0.056701"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:31.032768" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782770, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:31.032178" elapsed="0.000620"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:31.032848" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:31.033005" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782770, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:31.031826" elapsed="0.001205"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:31.033394" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:31.033214" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:31.033920" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:31.033612" elapsed="0.000334"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:31.034383" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:31.034121" elapsed="0.000288"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:31.034948" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:31.034597" elapsed="0.000422">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:30.963528" elapsed="0.071601">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:32.046043" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:32.045528" elapsed="0.000743"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:32.046358" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:59:32.046649" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:32.045027" elapsed="0.001660"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:32.054282" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:32.054008" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:32.054760" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:32.054493" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:32.062293" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:32.062353" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:32 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:32 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782772,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:32.062449" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:32.057318" elapsed="0.005157"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:32.054881" elapsed="0.007637"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:32.062731" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:32.062574" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:32.054860" elapsed="0.007958"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:32.066608" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782772,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:32.063859" elapsed="0.002800"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:32.063637" elapsed="0.003056"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:32.063619" elapsed="0.003098"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:32.070345" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:32.067030" elapsed="0.003381"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:32.066793" elapsed="0.003666"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:32.066769" elapsed="0.003724"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:32.071298" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:32.070759" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:32.071806" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:32.071434" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:32.072927" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:32.072170" elapsed="0.000795"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:32.071920" elapsed="0.001095"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:32.071408" elapsed="0.001637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:32.073796" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:32.073265" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:32.074253" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:32.073930" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:32.075356" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:32.074610" elapsed="0.000785"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:32.074366" elapsed="0.001078"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:32.073905" elapsed="0.001568"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:32.075732" elapsed="0.000639"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:32.076905" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:32.076541" elapsed="0.000543"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:32.077253" elapsed="0.013099"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:32.063188" elapsed="0.027233"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:32.090624" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:59:32.090494" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:32.090475" 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-04-10T00:59:32.090874" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:32.090946" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:59:32.093398" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782772,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:32.047180" elapsed="0.046249"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:32.093484" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:32.093827" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782772,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:32.044350" elapsed="0.049505"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:32.095096" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782772, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:32.094684" elapsed="0.000441"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:32.095175" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:32.095331" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782772, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:32.094082" elapsed="0.001276"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:32.095917" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:32.095538" elapsed="0.000424"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:32.096449" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:32.096144" elapsed="0.000331"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:32.096963" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:32.096665" elapsed="0.000325"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:32.097684" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:32.097189" elapsed="0.000567">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:32.036090" elapsed="0.061778">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:33.110291" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:33.109791" elapsed="0.000545"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:33.110414" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:59:33.110675" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:33.109272" elapsed="0.001440"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:33.118371" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:33.118107" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:33.118836" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:33.118589" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:33.126042" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:33.126161" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:33 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:33 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782773,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:33.126260" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:33.121142" elapsed="0.005145"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:33.118954" elapsed="0.007382"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:33.126518" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:33.126363" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:33.118934" elapsed="0.007697"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:33.132894" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782773,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:33.127666" elapsed="0.005299"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:33.127420" elapsed="0.005594"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:33.127403" elapsed="0.005646"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:33.137325" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:33.133445" elapsed="0.003928"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:33.133129" elapsed="0.004279"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:33.133105" elapsed="0.004328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:33.138023" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:33.137630" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:33.138359" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:33.138124" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:33.139129" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:33.138619" elapsed="0.000538"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:33.138440" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:33.138105" elapsed="0.001110"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:33.139756" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:33.139375" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:33.140087" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:33.139854" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:33.140913" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:33.140354" elapsed="0.000587"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:33.140168" elapsed="0.000809"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:33.139836" elapsed="0.001162"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:33.141152" elapsed="0.000462"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:33.142104" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:33.141781" elapsed="0.000349"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:33.142284" elapsed="0.013385"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:33.126992" elapsed="0.028776"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:33.155991" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-10T00:59:33.155864" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:33.155838" 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-04-10T00:59:33.156292" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:33.156375" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:59:33.159090" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782773,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:33.111197" elapsed="0.047989"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:33.159248" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:59:33.159436" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782773,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:33.108608" elapsed="0.050857"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:33.160855" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782773, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:33.160119" elapsed="0.000766"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:33.160937" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:33.161097" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782773, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:33.159733" elapsed="0.001391"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:33.161501" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:33.161308" elapsed="0.000219"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:33.162038" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:33.161725" elapsed="0.000340"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:33.162527" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:33.162239" elapsed="0.000333"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:33.163115" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:33.162754" elapsed="0.000432">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:33.098829" elapsed="0.064472">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:34.175432" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:34.175051" elapsed="0.000413"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:34.175523" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:59:34.175709" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:34.174677" elapsed="0.001058"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:34.182908" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:34.182644" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:34.183370" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:34.183119" 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-04-10T00:59:34.191252" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:34.191313" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:34 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782774,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:34.191412" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:34.185707" elapsed="0.005732"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:34.183490" elapsed="0.007994"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:34.191691" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:34.191511" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:34.183470" elapsed="0.008310"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:34.196486" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782774,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:34.192815" elapsed="0.003767"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:34.192589" elapsed="0.004115"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:34.192570" elapsed="0.004181"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:34.201030" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:34.197221" elapsed="0.003913"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:34.196846" elapsed="0.004339"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:34.196819" elapsed="0.004400"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:34.201861" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:34.201445" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:34.202203" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:34.201961" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:34.202988" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:34.202456" elapsed="0.000560"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:34.202286" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:34.201943" elapsed="0.001130"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:34.203619" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:34.203236" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:34.203952" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:34.203717" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:34.204728" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:34.204194" elapsed="0.000562"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:34.204033" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:34.203699" elapsed="0.001115"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:34.204968" elapsed="0.000470"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:34.205951" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:34.205624" elapsed="0.000354"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:34.206135" elapsed="0.012767"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:34.192145" elapsed="0.026827"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:34.219154" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:59:34.219044" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:34.219025" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:34.219397" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:34.219467" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:34.222047" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782774,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:34.176087" elapsed="0.045990"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:34.222131" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:34.222285" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782774,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:34.174164" elapsed="0.048147"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:34.223310" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782774, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:34.222914" elapsed="0.000425"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:34.223388" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:34.223558" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782774, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:34.222559" elapsed="0.001071"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:34.224001" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:34.223816" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:34.224518" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:34.224206" elapsed="0.000602"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:34.225280" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:34.224989" elapsed="0.000318"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:34.226005" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:34.225482" elapsed="0.000595">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:34.164259" elapsed="0.061927">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:35.239670" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:35.239294" elapsed="0.000406"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:35.239758" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:59:35.239924" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:35.238933" elapsed="0.001017"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:35.246825" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:35.246564" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:35.247281" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:35.247033" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:35.257693" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:35.257757" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:35 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:35 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782775,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:35.257856" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:35.249566" elapsed="0.008317"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:35.247400" elapsed="0.010527"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:35.258113" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:35.257956" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:35.247378" elapsed="0.010820"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:35.267404" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782775,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:35.260365" elapsed="0.007119"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:35.259864" elapsed="0.007673"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:35.259823" elapsed="0.007776"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:35.271984" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:35.268044" elapsed="0.003993"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:35.267692" elapsed="0.004380"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:35.267664" elapsed="0.004434"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:35.272784" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:35.272290" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:35.273180" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:35.272912" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:35.274124" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:35.273490" elapsed="0.000671"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:35.273265" elapsed="0.001019"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:35.272886" elapsed="0.001424"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:35.274912" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:35.274477" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:35.275288" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:35.275012" elapsed="0.000339"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:35.276199" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:35.275593" elapsed="0.000647"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:35.275399" elapsed="0.000890"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:35.274994" elapsed="0.001325"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:35.276533" elapsed="0.000627"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:35.277919" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:35.277390" elapsed="0.000571"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:35.278192" elapsed="0.015445"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:35.258867" elapsed="0.034883"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:35.294078" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:59:35.293954" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:35.293927" 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-04-10T00:59:35.294368" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:35.294443" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:59:35.296972" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782775,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:35.240298" elapsed="0.056704"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:35.297054" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:35.297208" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782775,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:35.238422" elapsed="0.058812"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:35.298369" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782775, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:35.297927" elapsed="0.000471"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:35.298446" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:35.298618" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782775, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:35.297485" elapsed="0.001159"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:35.299061" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:35.298825" elapsed="0.000262"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:35.299820" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:35.299268" elapsed="0.000579"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:35.300287" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:35.300023" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:35.300851" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:35.300485" elapsed="0.000437">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:35.227094" elapsed="0.073938">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:36.313765" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:36.313205" elapsed="0.000712"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:36.314000" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T00:59:36.314267" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:36.312693" elapsed="0.001612"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:36.324056" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:36.323751" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:36.324525" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:36.324275" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:36.332200" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:36.332262" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:36 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:36 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782776,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:36.332357" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:36.326853" elapsed="0.005530"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:36.324665" elapsed="0.007762"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:36.332708" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:36.332456" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:36.324644" elapsed="0.008187"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:36.338328" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782776,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:36.334362" elapsed="0.004037"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:36.333989" elapsed="0.004460"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:36.333962" elapsed="0.004521"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:36.342689" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:36.338906" elapsed="0.003832"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:36.338586" elapsed="0.004187"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:36.338539" elapsed="0.004258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:36.343401" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:36.342985" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:36.343758" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:36.343500" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:36.344520" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:36.344006" elapsed="0.000556"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:36.343842" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:36.343482" elapsed="0.001140"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:36.345170" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:36.344796" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:36.345516" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:36.345267" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:36.346356" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:36.345804" elapsed="0.000579"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:36.345635" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:36.345249" elapsed="0.001191"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:36.346613" elapsed="0.000466"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:36.347613" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:36.347250" elapsed="0.000432"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:36.347846" elapsed="0.013070"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:36.333334" elapsed="0.027649"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:36.361168" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:59:36.361056" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:36.361037" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:36.361414" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:36.361494" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:59:36.364126" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782776,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:36.314962" elapsed="0.049193"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:36.364208" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:36.364362" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782776,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:36.311997" elapsed="0.052391"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:36.365397" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782776, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:36.364994" elapsed="0.000432"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:36.365475" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:59:36.365872" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782776, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:36.364642" elapsed="0.001257"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:36.366308" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:36.366082" elapsed="0.000253"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:36.366842" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:36.366515" elapsed="0.000355"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:36.367309" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:36.367046" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:36.367882" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:36.367508" elapsed="0.000448">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:36.302010" elapsed="0.066058">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.380840" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:37.380292" elapsed="0.000595"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:37.380968" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T00:59:37.381212" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:37.379724" elapsed="0.001524"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.388993" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.388726" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.389622" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.389349" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:37.399704" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:37.399883" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:37 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:37 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782777,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:37.400030" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:37.391922" elapsed="0.008148"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.389744" elapsed="0.010391"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:37.400410" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:37.400176" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.389722" elapsed="0.010817"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.406317" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782777,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.402126" elapsed="0.004266"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.401788" elapsed="0.004656"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.401761" elapsed="0.004720"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.410367" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.406940" elapsed="0.003486"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.406587" elapsed="0.003875"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.406559" elapsed="0.003928"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.411124" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:37.410694" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:37.411463" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:37.411224" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.412289" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:37.411731" elapsed="0.000586"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.411565" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.411205" elapsed="0.001169"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.412919" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:37.412535" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:37.413249" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:37.413016" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.414007" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:37.413488" elapsed="0.000546"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.413328" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.412998" elapsed="0.001092"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:37.414245" elapsed="0.000465"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:37.415249" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:37.414914" elapsed="0.000362"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:37.415463" elapsed="0.015238"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:37.401124" elapsed="0.029710"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:37.431091" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-10T00:59:37.430943" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.430914" 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-04-10T00:59:37.431433" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:37.431521" elapsed="0.000233"/>
</return>
<msg time="2026-04-10T00:59:37.434698" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782777,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:37.381784" elapsed="0.053081"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:37.434942" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:59:37.435109" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782777,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:37.378982" elapsed="0.056154"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.436487" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782777, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:37.436037" elapsed="0.000478"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:37.436583" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:37.436742" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782777, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:37.435397" elapsed="0.001372"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:37.437145" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:37.436961" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.437677" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:37.437349" elapsed="0.000355"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.438153" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:37.437877" elapsed="0.000302"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:59:37.438355" elapsed="0.000337"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:59:37.369003" elapsed="0.069753"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:59:25.627452" elapsed="11.811380"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:25.626990" elapsed="11.811909"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:25.622058" elapsed="11.816883"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:59:25.621907" elapsed="11.817074"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.450718" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:37.450390" elapsed="0.000356"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:37.450813" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T00:59:37.450969" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:37.450038" elapsed="0.000955"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.457794" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.457526" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.458236" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.457995" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:37.466943" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:37.467026" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:37 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:37 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782777,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:37.467168" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:37.460496" elapsed="0.006710"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.458350" elapsed="0.008918"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:37.467529" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:37.467312" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.458330" elapsed="0.009398"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.471522" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782777,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.468822" elapsed="0.002792"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.468592" elapsed="0.003075"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.468572" elapsed="0.003130"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.476010" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.472134" elapsed="0.003953"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.471786" elapsed="0.004359"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.471762" elapsed="0.004421"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.477332" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:37.476471" elapsed="0.000925"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:37.477930" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:37.477521" elapsed="0.000501"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.479220" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:37.478326" elapsed="0.000955"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.478060" elapsed="0.001305"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.477490" elapsed="0.001911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.480048" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:37.479668" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:37.480395" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:37.480146" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.480983" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:37.480677" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.480479" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.480128" elapsed="0.001203"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:37.481754" elapsed="0.000849"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:37.483729" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:37.483056" elapsed="0.000732"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:37.484141" elapsed="0.005968"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:37.468123" elapsed="0.022132"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:37.490696" elapsed="0.000069"/>
</return>
<status status="PASS" start="2026-04-10T00:59:37.490421" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.490376" elapsed="0.000555"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:37.491270" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:37.491433" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:59:37.497346" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782777,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:37.451333" elapsed="0.046106"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:37.497633" elapsed="0.000121"/>
</return>
<msg time="2026-04-10T00:59:37.498075" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782777,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:37.449579" elapsed="0.048557"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:59:37.498242" elapsed="0.000061"/>
</return>
<msg time="2026-04-10T00:59:37.498616" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782777,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:59:37.444663" elapsed="0.054213"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.501655" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782777, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:37.500416" elapsed="0.001306"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:37.501832" elapsed="0.000064"/>
</return>
<msg time="2026-04-10T00:59:37.502180" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782777, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:37.499498" elapsed="0.002739"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:37.503163" level="INFO">${value} = 10000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:37.502674" elapsed="0.000547"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.503882" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:59:37.503585" elapsed="0.000408"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 10000.</doc>
<status status="PASS" start="2026-04-10T00:59:37.444196" elapsed="0.059861"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:37.439190" elapsed="0.064904"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:59:37.439043" elapsed="0.065090"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:59:25.546452" elapsed="11.957746"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T00:59:05.894677" elapsed="31.609564"/>
</iter>
<iter>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.504806" level="INFO">2</msg>
<arg>${index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.504531" elapsed="0.000320"/>
</kw>
<kw name="Delete Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Delete Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.515911" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:37.515604" elapsed="0.000334"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:37.515985" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:37.516133" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:37.515230" elapsed="0.000928"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.530260" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.530009" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.530719" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.530463" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.531199" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.530955" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.531649" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.531394" elapsed="0.000297"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:37.532502" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:59:37.532301" elapsed="0.000229"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:59:37.532875" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:59:37.532701" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:59:37.533053" elapsed="0.000207"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.533689" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.533418" elapsed="0.000316"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:59:37.533776" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:59:37.533933" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:59:37.531892" elapsed="0.002066"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:37.548474" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Content-Length': '402', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:59:37.548744" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:37.548931" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:37.536202" elapsed="0.012771"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.534040" elapsed="0.015019"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:37.549404" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:37.549110" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.534018" elapsed="0.015521"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.557910" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.551491" elapsed="0.006528"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.551128" elapsed="0.006979"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.551099" elapsed="0.007068"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.563981" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.558894" elapsed="0.005148"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.558306" elapsed="0.005779"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.558264" elapsed="0.005849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.564800" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:37.564343" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:37.565157" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:37.564907" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.565737" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:37.565408" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.565241" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.564886" elapsed="0.000936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.566350" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:37.565984" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:37.566701" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:37.566449" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.567266" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:37.566968" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.566784" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.566432" elapsed="0.000916"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:37.567512" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:37.568336" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:37.568045" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:37.568521" elapsed="0.002570"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:37.550150" elapsed="0.021013"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:59:37.571358" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:37.571245" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.571224" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:59:37.574104" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:59:37.571606" elapsed="0.002526"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:59:37.574181" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T00:59:37.574348" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:37.527255" elapsed="0.047119"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:37.574581" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:37.574740" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:59:37.524420" elapsed="0.050346"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:37.574819" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:59:37.575015" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:37.514712" elapsed="0.060328"/>
</kw>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Delete Bulk Flow in member 1 according to ${json_body_del}.</doc>
<status status="PASS" start="2026-04-10T00:59:37.509992" elapsed="0.065113"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.582256" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:37.581936" elapsed="0.000349"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:37.582334" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:59:37.582490" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:37.581575" elapsed="0.000939"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.589831" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.589510" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.590296" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.590049" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:37.597796" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:37.597915" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:37 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:37 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782777,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:37.598110" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:37.592673" elapsed="0.005489"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.590419" elapsed="0.007836"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:37.598585" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:37.598312" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.590397" elapsed="0.008279"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.602454" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782777,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.599849" elapsed="0.002664"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.599605" elapsed="0.002961"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.599585" elapsed="0.003009"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.606476" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:37.602932" elapsed="0.003644"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.602654" elapsed="0.003977"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.602636" elapsed="0.004033"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.607594" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:37.606985" elapsed="0.000650"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:37.608101" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:37.607745" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.608945" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:37.608468" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.608223" elapsed="0.000815"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.607717" elapsed="0.001457"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.609997" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:37.609423" elapsed="0.000615"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:37.610496" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:37.610144" elapsed="0.000466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.611376" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:37.610936" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:37.610647" elapsed="0.000821"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.610117" elapsed="0.001375"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:37.611673" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:37.612491" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:37.612193" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:37.612692" elapsed="0.002642"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:37.599116" elapsed="0.016290"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:37.615611" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:59:37.615479" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:37.615461" elapsed="0.000244"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:37.615860" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:37.615933" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:37.618296" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782777,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:37.582901" elapsed="0.035424"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:37.618378" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:37.618533" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782777,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:37.581089" elapsed="0.037484"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.619611" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782777, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:37.619197" elapsed="0.000442"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:37.619689" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:37.619843" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782777, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:37.618812" elapsed="0.001057"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:37.620232" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:37.620050" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.620758" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:37.620434" elapsed="0.000351"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.621223" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:37.620959" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:37.621786" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:37.621419" elapsed="0.000438">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:37.576451" elapsed="0.045515">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.636334" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:38.635785" elapsed="0.000596"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:38.636612" elapsed="0.000081"/>
</return>
<msg time="2026-04-10T00:59:38.636975" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:38.635175" elapsed="0.001858"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.645974" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:38.645710" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.646432" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:38.646177" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:38.653575" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:38.653637" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:38 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:38 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782778,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:38.653748" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:38.648782" elapsed="0.004994"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:38.646567" elapsed="0.007253"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:38.654005" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:38.653848" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.646530" elapsed="0.007563"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.657768" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782778,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:38.655143" elapsed="0.002675"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:38.654916" elapsed="0.002937"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.654898" elapsed="0.002980"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.660868" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:38.658160" elapsed="0.002778"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:38.657934" elapsed="0.003055"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.657917" elapsed="0.003106"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.661898" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:38.661286" elapsed="0.000653"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:38.662395" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:38.662043" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.663258" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:38.662800" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:38.662517" elapsed="0.000834"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.662018" elapsed="0.001363"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.664262" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:38.663711" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:38.664799" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:38.664408" elapsed="0.000482"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.665640" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:38.665170" elapsed="0.000521"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:38.664926" elapsed="0.000820"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.664382" elapsed="0.001395"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:38.666009" elapsed="0.000522"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:38.667250" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:38.666824" elapsed="0.000467"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:38.667630" elapsed="0.004047"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:38.654467" elapsed="0.017310"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:38.672058" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:59:38.671896" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.671867" elapsed="0.000318"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:38.672410" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:38.672519" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T00:59:38.674938" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782778,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:38.637835" elapsed="0.037133"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:38.675020" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:38.675174" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782778,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:38.634293" elapsed="0.040910"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.676232" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782778, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:38.675815" elapsed="0.000446"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:38.676311" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:38.676467" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782778, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:38.675425" elapsed="0.001069"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:38.676884" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:38.676692" elapsed="0.000226"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.677411" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:38.677102" elapsed="0.000336"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.677909" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:38.677630" elapsed="0.000308"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:59:38.678113" elapsed="0.000319"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:59:38.622884" elapsed="0.055610"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:59:37.575825" elapsed="1.102741"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 1.</doc>
<status status="PASS" start="2026-04-10T00:59:37.575368" elapsed="1.103262"/>
</kw>
<arg>${temp_json_config_del_ten_percent}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Delete Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:59:37.509487" elapsed="1.169197"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.689012" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:59:38.688516" elapsed="0.000526"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.689580" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:59:38.689221" elapsed="0.000393"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:59:38.689673" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:59:38.689885" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:59:38.688086" elapsed="0.001833"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.701395" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:38.701056" elapsed="0.000370"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:38.701474" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:59:38.701651" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:38.700623" elapsed="0.001054"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.716463" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:38.716200" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.716958" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:38.716709" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.717411" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:38.717163" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.717869" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:38.717626" elapsed="0.000287"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:38.718742" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:59:38.718523" elapsed="0.000245"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:59:38.719097" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:59:38.718925" elapsed="0.000197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:59:38.719274" elapsed="0.000194"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.719925" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:38.719674" elapsed="0.000295"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:59:38.720012" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:38.720168" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:59:38.718117" elapsed="0.002076"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:38.733299" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:59:38.733406" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:38.733689" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:38.722506" elapsed="0.011257"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:38.720269" elapsed="0.013600"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:38.734274" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:38.733929" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.720250" elapsed="0.014221"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.742146" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:38.737118" elapsed="0.005081"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:38.736488" elapsed="0.005755"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.736423" elapsed="0.005849"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.745072" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:38.742618" elapsed="0.002500"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:38.742338" elapsed="0.002815"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.742318" elapsed="0.002859"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.745782" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:38.745361" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:38.746118" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:38.745880" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.746778" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:38.746444" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:38.746199" elapsed="0.000644"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.745862" elapsed="0.001002"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.747399" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:38.747027" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:38.747801" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:38.747514" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.748346" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:38.748047" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:38.747887" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.747477" elapsed="0.000953"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:38.748606" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:38.749440" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:38.749130" elapsed="0.000336"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:38.749645" elapsed="0.002487"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:38.735282" elapsed="0.016918"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:59:38.752387" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:38.752277" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.752257" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:59:38.755114" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:59:38.752625" elapsed="0.002517"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:59:38.755191" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:59:38.755356" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:38.713390" elapsed="0.041992"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:38.755449" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:59:38.755677" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:59:38.710406" elapsed="0.045297"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:38.755767" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:59:38.755945" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:38.700133" elapsed="0.055838"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:59:38.695123" elapsed="0.060914"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:38.690178" elapsed="0.065895"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:59:38.689998" elapsed="0.066118"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.769337" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:38.768984" elapsed="0.000387"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:38.769430" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:59:38.769615" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:38.768406" elapsed="0.001235"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.777089" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:38.776760" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.777688" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:38.777420" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:38.787013" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:38.787098" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:38 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:38 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782778,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:38.787232" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:38.780076" elapsed="0.007186"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:38.777817" elapsed="0.009505"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:38.787642" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:38.787360" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.777793" elapsed="0.009954"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.791926" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782778,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:38.788955" elapsed="0.003030"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:38.788709" elapsed="0.003319"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.788687" elapsed="0.003367"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.796393" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:38.792372" elapsed="0.004092"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:38.792121" elapsed="0.004395"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.792100" elapsed="0.004495"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.797470" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:38.796877" elapsed="0.000635"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:38.798001" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:38.797645" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.799148" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:38.798364" elapsed="0.000825"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:38.798122" elapsed="0.001258"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.797617" elapsed="0.001797"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.800346" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:38.799794" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:38.800773" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:38.800493" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.801535" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:38.801022" elapsed="0.000560"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:38.800856" elapsed="0.000763"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.800466" elapsed="0.001175"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:38.801805" elapsed="0.000452"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:38.802774" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:38.802429" elapsed="0.000372"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:38.802960" elapsed="0.013501"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:38.788197" elapsed="0.028444"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:38.816962" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:59:38.816830" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:38.816799" 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-04-10T00:59:38.817268" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:38.817345" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:38.820086" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782778,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:38.769996" elapsed="0.050121"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:38.820172" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:38.820329" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782778,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:38.767896" elapsed="0.052460"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.821482" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782778, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:38.821030" elapsed="0.000481"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:38.821928" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:59:38.822091" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782778, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:38.820629" elapsed="0.001489"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:38.822532" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:38.822337" elapsed="0.000239"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.823068" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:38.822759" elapsed="0.000337"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.823573" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:38.823270" elapsed="0.000337"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:38.824139" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:38.823784" elapsed="0.000426">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:38.762597" elapsed="0.061726">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:39.837058" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:39.836482" elapsed="0.000620"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:39.837182" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:59:39.837411" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:39.835885" elapsed="0.001561"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:39.845367" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:39.845108" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:39.845865" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:39.845612" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:39.853528" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:39.853611" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:39 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:39 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782779,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:39.853708" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:39.848213" elapsed="0.005521"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:39.845985" elapsed="0.007855"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:39.854028" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:39.853870" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:39.845965" elapsed="0.008148"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:39.858489" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782779,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:39.855154" elapsed="0.003432"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:39.854928" elapsed="0.003715"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:39.854910" elapsed="0.003767"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:39.863293" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:39.859071" elapsed="0.004291"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:39.858757" elapsed="0.004656"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:39.858733" elapsed="0.004714"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:39.864353" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:39.863715" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:39.864977" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:39.864498" elapsed="0.000539"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:39.865751" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:39.865223" elapsed="0.000556"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:39.865061" elapsed="0.000755"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:39.864472" elapsed="0.001365"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:39.866367" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:39.866005" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:39.866729" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:39.866464" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:39.867470" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:39.866967" elapsed="0.000531"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:39.866810" elapsed="0.000723"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:39.866446" elapsed="0.001125"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:39.867735" elapsed="0.000473"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:39.868719" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:39.868376" elapsed="0.000370"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:39.868903" elapsed="0.014538"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:39.854477" elapsed="0.029090"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:39.883809" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T00:59:39.883681" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:39.883650" 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-04-10T00:59:39.884142" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:39.884217" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:39.887234" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782779,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:39.838021" elapsed="0.049259"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:39.887348" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T00:59:39.887521" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782779,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:39.835130" elapsed="0.052441"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:39.888944" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782779, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:39.888433" elapsed="0.000541"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:39.889024" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:39.889188" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782779, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:39.887953" elapsed="0.001263"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:39.889626" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:39.889401" elapsed="0.000253"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:39.890155" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:39.889837" elapsed="0.000346"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:39.890694" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:39.890360" elapsed="0.000360"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:39.891263" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:39.890897" elapsed="0.000440">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:39.825223" elapsed="0.066229">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:40.907566" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:40.907073" elapsed="0.000533"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:40.907675" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:59:40.907877" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:40.906628" elapsed="0.001278"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:40.916315" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:40.915929" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:40.916838" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:40.916567" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:40.924947" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:40.925043" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:40 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:40 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782780,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:40.925190" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:40.919213" elapsed="0.006006"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:40.916971" elapsed="0.008310"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:40.925540" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:40.925321" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:40.916946" elapsed="0.008702"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:40.929685" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782780,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:40.926827" elapsed="0.002914"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:40.926580" elapsed="0.003196"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:40.926559" elapsed="0.003242"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:40.932819" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:40.930087" elapsed="0.002783"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:40.929858" elapsed="0.003049"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:40.929841" elapsed="0.003090"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:40.933534" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:40.933124" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:40.934196" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:40.933834" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:40.935366" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:40.934610" elapsed="0.000796"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:40.934318" elapsed="0.001142"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:40.933804" elapsed="0.001687"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:40.936320" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:40.935759" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:40.936884" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:40.936465" elapsed="0.000505"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:40.938033" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:40.937246" elapsed="0.000828"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:40.937006" elapsed="0.001121"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:40.936438" elapsed="0.001721"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:40.938393" elapsed="0.000706"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:40.939995" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:40.939350" elapsed="0.000685"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:40.940270" elapsed="0.013940"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:40.926079" elapsed="0.028223"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:40.954524" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-04-10T00:59:40.954401" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:40.954375" elapsed="0.000267"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:40.954827" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:40.954900" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:59:40.957340" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782780,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:40.908353" elapsed="0.049017"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:40.957425" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:40.957844" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782780,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:40.905814" elapsed="0.052057"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:40.958986" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782780, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:40.958512" elapsed="0.000503"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:40.959064" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:40.959220" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782780, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:40.958118" elapsed="0.001129"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:40.959632" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:40.959431" elapsed="0.000227"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:40.960151" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:40.959837" elapsed="0.000341"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:40.960645" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:40.960353" elapsed="0.000341"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:40.961328" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:40.960962" elapsed="0.000437">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:40.893184" elapsed="0.068327">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:41.971233" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:41.970772" elapsed="0.000502"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:41.971344" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:59:41.971568" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:41.970274" elapsed="0.001328"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:41.981047" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:41.980609" elapsed="0.000513"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:41.981739" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:41.981402" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:41.993305" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:41.993434" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:41 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:41 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782781,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:41.993630" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:41.984893" elapsed="0.008775"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:41.981900" elapsed="0.011843"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:41.994073" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:41.993791" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:41.981871" elapsed="0.012315"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:41.999520" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782781,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:41.995709" elapsed="0.003919"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:41.995362" elapsed="0.004327"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:41.995334" elapsed="0.004395"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:42.004302" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:42.000194" elapsed="0.004196"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:41.999831" elapsed="0.004617"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:41.999800" elapsed="0.004687"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:42.005429" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:42.004823" elapsed="0.000639"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:42.005908" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:42.005584" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:42.006974" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:42.006227" elapsed="0.000784"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:42.006010" elapsed="0.001048"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:42.005538" elapsed="0.001547"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:42.007797" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:42.007300" elapsed="0.000531"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:42.008227" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:42.007924" elapsed="0.000376"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:42.009185" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:42.008562" elapsed="0.000767"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:42.008330" elapsed="0.001047"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:42.007901" elapsed="0.001503"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:42.009639" elapsed="0.000565"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:42.010859" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:42.010420" elapsed="0.000473"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:42.011102" elapsed="0.016355"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:41.994747" elapsed="0.033166"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:42.028192" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-10T00:59:42.028040" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:42.028006" elapsed="0.000313"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:42.028591" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:42.028684" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:59:42.031402" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782781,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:41.972059" elapsed="0.059375"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:42.031491" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:59:42.031890" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782781,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:41.969455" elapsed="0.062463"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:42.033088" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782781, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:42.032617" elapsed="0.000499"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:42.033164" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:42.033364" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782781, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:42.032186" elapsed="0.001204"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:42.033777" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:42.033586" elapsed="0.000217"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:42.034294" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:42.033981" elapsed="0.000339"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:42.034778" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:42.034495" elapsed="0.000309"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:42.035334" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:42.034979" elapsed="0.000427">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:41.962419" elapsed="0.073100">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:43.048565" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:43.048100" elapsed="0.000506"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:43.048684" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:59:43.048986" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:43.047614" elapsed="0.001407"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:43.059317" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:43.058752" elapsed="0.000633"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:43.060208" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:43.059713" elapsed="0.000559"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:43.068004" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:43.068063" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:43 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782783,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:43.068160" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:43.063013" elapsed="0.005173"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:43.060376" elapsed="0.007855"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:43.068416" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:43.068259" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:43.060347" elapsed="0.008157"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:43.072414" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782783,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:43.069626" elapsed="0.002843"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:43.069372" elapsed="0.003134"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:43.069354" elapsed="0.003177"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:43.077240" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:43.072920" elapsed="0.004395"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:43.072624" elapsed="0.004743"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:43.072602" elapsed="0.004800"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:43.078392" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:43.077715" elapsed="0.000719"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:43.078883" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:43.078562" elapsed="0.000383"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:43.079829" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:43.079178" elapsed="0.000685"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:43.078969" elapsed="0.000939"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:43.078513" elapsed="0.001423"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:43.080537" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:43.080146" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:43.080892" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:43.080654" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:43.081710" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:43.081156" elapsed="0.000582"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:43.080989" elapsed="0.000785"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:43.080635" elapsed="0.001190"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:43.081988" elapsed="0.000457"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:43.082984" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:43.082635" elapsed="0.000376"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:43.083171" elapsed="0.013154"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:43.068936" elapsed="0.027490"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:43.096673" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T00:59:43.096529" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:43.096500" elapsed="0.000369"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:43.097076" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:43.097155" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:43.100064" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782783,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:43.049508" elapsed="0.050592"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:43.100162" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:59:43.100329" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782783,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:43.046933" elapsed="0.053422"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:43.101884" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782783, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:43.101076" elapsed="0.000844"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:43.101978" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:59:43.102140" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782783, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:43.100654" elapsed="0.001512"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:43.102533" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:43.102349" elapsed="0.000227"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:43.103068" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:43.102757" elapsed="0.000339"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:43.103528" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:43.103267" elapsed="0.000302"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:43.104290" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:43.103742" elapsed="0.000620">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:43.036765" elapsed="0.067707">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:44.116854" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:44.116427" elapsed="0.000459"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:44.116944" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:59:44.117110" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:44.116065" elapsed="0.001071"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:44.124057" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:44.123783" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:44.124507" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:44.124265" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:44.135283" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:44.135376" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:44 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782784,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:44.135521" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:44.126918" elapsed="0.008667"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:44.124644" elapsed="0.011009"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:44.136029" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:44.135771" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:44.124622" elapsed="0.011544"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:44.143756" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782784,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:44.137795" elapsed="0.006018"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:44.137420" elapsed="0.006430"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:44.137393" elapsed="0.006483"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:44.146965" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:44.144192" elapsed="0.002822"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:44.143938" elapsed="0.003111"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:44.143919" elapsed="0.003155"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:44.147700" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:44.147273" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:44.148042" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:44.147801" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:44.148880" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:44.148338" elapsed="0.000570"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:44.148141" elapsed="0.000804"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:44.147782" elapsed="0.001185"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:44.149510" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:44.149131" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:44.149865" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:44.149627" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:44.150706" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:44.150106" elapsed="0.000629"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:44.149946" elapsed="0.000824"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:44.149609" elapsed="0.001182"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:44.150952" elapsed="0.000483"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:44.151981" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:44.151650" elapsed="0.000358"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:44.152165" elapsed="0.013312"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:44.136756" elapsed="0.028851"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:44.165844" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-10T00:59:44.165716" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:44.165685" 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-04-10T00:59:44.166149" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:44.166224" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:59:44.169238" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782784,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:44.117482" elapsed="0.051792"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:44.169338" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:59:44.169509" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782784,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:44.115557" elapsed="0.053983"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:44.171487" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782784, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:44.170978" elapsed="0.000540"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:44.171595" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T00:59:44.171782" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782784, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:44.170218" elapsed="0.001593"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:44.172188" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:44.171997" elapsed="0.000217"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:44.172773" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:44.172406" elapsed="0.000403"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:44.173260" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:44.172989" elapsed="0.000297"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:44.174114" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:44.173473" elapsed="0.000718">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:44.105317" elapsed="0.068990">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:45.186272" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:45.185733" elapsed="0.000588"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:45.186401" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T00:59:45.186669" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:45.185117" elapsed="0.001589"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:45.194664" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:45.194273" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:45.195199" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:45.194896" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:45.203539" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:45.203675" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:45 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782785,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:45.203817" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:45.197599" elapsed="0.006250"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:45.195340" elapsed="0.008592"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:45.204270" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:45.203984" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:45.195310" elapsed="0.009091"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:45.210721" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782785,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:45.206181" elapsed="0.004625"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:45.205824" elapsed="0.005038"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:45.205793" elapsed="0.005110"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:45.214388" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:45.211472" elapsed="0.002972"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:45.211100" elapsed="0.003384"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:45.211069" elapsed="0.003442"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:45.215215" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:45.214757" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:45.215668" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:45.215398" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:45.216471" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:45.215941" elapsed="0.000558"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:45.215765" elapsed="0.000772"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:45.215376" elapsed="0.001202"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:45.217141" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:45.216752" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:45.217485" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:45.217242" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:45.218301" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:45.217771" elapsed="0.000558"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:45.217598" elapsed="0.000769"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:45.217224" elapsed="0.001166"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:45.218576" elapsed="0.000529"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:45.219633" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:45.219280" elapsed="0.000381"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:45.219832" elapsed="0.013596"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:45.205068" elapsed="0.028465"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:45.233790" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-10T00:59:45.233659" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:45.233629" 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-04-10T00:59:45.234119" elapsed="0.000093"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:45.234268" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:45.236834" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782785,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:45.187294" elapsed="0.049572"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:45.236922" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:45.237081" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782785,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:45.184160" elapsed="0.052955"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:45.238305" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782785, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:45.237837" elapsed="0.000497"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:45.238383" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:45.238813" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782785, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:45.237369" elapsed="0.001475"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:45.239279" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:45.239078" elapsed="0.000229"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:45.239825" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:45.239490" elapsed="0.000363"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:45.240379" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:45.240085" elapsed="0.000320"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:45.241329" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:45.240881" elapsed="0.000521">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:45.175397" elapsed="0.066119">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:46.254141" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:46.253777" elapsed="0.000396"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:46.254231" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:59:46.254396" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:46.253397" elapsed="0.001025"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:46.261368" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:46.261109" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:46.261835" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:46.261590" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:46.269515" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:46.269600" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:46 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:46 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782786,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:46.269698" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:46.264156" elapsed="0.005569"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:46.261956" elapsed="0.007813"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:46.270007" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:46.269798" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:46.261936" elapsed="0.008193"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:46.275588" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782786,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:46.271635" elapsed="0.004026"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:46.271265" elapsed="0.004445"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:46.271240" elapsed="0.004504"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:46.279939" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:46.276136" elapsed="0.003851"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:46.275822" elapsed="0.004201"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:46.275798" elapsed="0.004250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:46.280883" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:46.280228" elapsed="0.000684"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:46.281226" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:46.280985" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:46.282001" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:46.281468" elapsed="0.000561"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:46.281306" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:46.280966" elapsed="0.001121"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:46.282679" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:46.282247" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:46.283013" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:46.282778" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:46.283829" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:46.283257" elapsed="0.000659"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:46.283095" elapsed="0.000859"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:46.282760" elapsed="0.001217"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:46.284135" elapsed="0.000471"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:46.285103" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:46.284774" elapsed="0.000355"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:46.285286" elapsed="0.013549"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:46.270666" elapsed="0.028244"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:46.299098" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T00:59:46.298986" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:46.298966" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:46.299349" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:46.299421" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:59:46.302435" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782786,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:46.254784" elapsed="0.047683"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:46.302534" elapsed="0.000248"/>
</return>
<msg time="2026-04-10T00:59:46.302929" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782786,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:46.252908" elapsed="0.050049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:46.304043" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782786, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:46.303622" elapsed="0.000450"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:46.304120" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:46.304277" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782786, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:46.303204" elapsed="0.001100"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:46.304679" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:46.304484" elapsed="0.000221"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:46.305190" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:46.304884" elapsed="0.000332"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:46.305667" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:46.305389" elapsed="0.000304"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:46.306265" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:46.305866" elapsed="0.000470">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:46.242399" elapsed="0.064049">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:47.320873" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:47.320042" elapsed="0.000893"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:47.320995" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:59:47.321162" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:47.319208" elapsed="0.001980"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:47.328312" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:47.328031" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:47.328877" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:47.328620" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:47.338184" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:47.338246" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:47 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:47 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782787,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:47.338343" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:47.331314" elapsed="0.007056"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:47.328999" elapsed="0.009415"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:47.338621" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:47.338442" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:47.328979" elapsed="0.009730"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:47.342517" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782787,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:47.339753" elapsed="0.002832"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:47.339511" elapsed="0.003110"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:47.339492" elapsed="0.003154"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:47.346162" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:47.342961" elapsed="0.003267"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:47.342708" elapsed="0.003569"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:47.342686" elapsed="0.003625"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:47.347150" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:47.346595" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:47.347647" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:47.347290" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:47.348753" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:47.347990" elapsed="0.000801"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:47.347762" elapsed="0.001083"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:47.347264" elapsed="0.001614"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:47.349748" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:47.349200" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:47.350212" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:47.349886" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:47.351303" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:47.350599" elapsed="0.000742"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:47.350331" elapsed="0.001062"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:47.349861" elapsed="0.001562"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:47.351661" elapsed="0.000688"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:47.353024" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:47.352609" elapsed="0.000441"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:47.353208" elapsed="0.012629"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:47.339084" elapsed="0.026821"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:47.366090" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:59:47.365980" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:47.365960" 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-04-10T00:59:47.366389" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:47.366461" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T00:59:47.369047" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782787,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:47.321540" elapsed="0.047536"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:47.369130" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:47.369287" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782787,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:47.318120" elapsed="0.051194"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:47.370313" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782787, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:47.369910" elapsed="0.000433"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:47.370392" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:47.370797" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782787, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:47.369557" elapsed="0.001270"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:47.371192" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:47.371009" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:47.371726" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:47.371396" elapsed="0.000358"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:47.372224" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:47.371928" elapsed="0.000323"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:47.372800" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:47.372426" elapsed="0.000444">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:47.307333" elapsed="0.065647">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:48.384420" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:48.383916" elapsed="0.000547"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:48.384541" elapsed="0.000119"/>
</return>
<msg time="2026-04-10T00:59:48.384891" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:48.383371" elapsed="0.001565"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:48.393371" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:48.393100" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:48.393876" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:48.393597" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:48.404097" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:48.404161" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:48 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:48 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782788,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:48.404283" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:48.396221" elapsed="0.008090"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:48.394002" elapsed="0.010355"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:48.404670" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:48.404445" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:48.393980" elapsed="0.010788"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:48.410346" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782788,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:48.406268" elapsed="0.004156"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:48.405923" elapsed="0.004552"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:48.405895" elapsed="0.004614"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:48.415171" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:48.410962" elapsed="0.004279"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:48.410617" elapsed="0.004675"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:48.410589" elapsed="0.004737"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:48.416219" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:48.415629" elapsed="0.000629"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:48.416806" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:48.416360" elapsed="0.000535"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:48.417706" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:48.417142" elapsed="0.000592"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:48.416929" elapsed="0.000843"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:48.416334" elapsed="0.001459"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:48.418363" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:48.417957" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:48.418746" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:48.418474" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:48.419594" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:48.418993" elapsed="0.000632"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:48.418828" elapsed="0.000833"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:48.418446" elapsed="0.001236"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:48.419838" elapsed="0.000485"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:48.420898" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:48.420502" elapsed="0.000423"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:48.421087" elapsed="0.013205"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:48.405259" elapsed="0.029123"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:48.434602" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-10T00:59:48.434461" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:48.434440" elapsed="0.000267"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:48.434884" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:48.434966" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:59:48.437605" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782788,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:48.385425" elapsed="0.052211"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:48.437690" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:48.437864" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782788,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:48.382678" elapsed="0.055219"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:48.439002" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782788, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:48.438568" elapsed="0.000463"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:48.439081" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:48.439240" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782788, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:48.438135" elapsed="0.001131"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:48.439921" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:48.439466" elapsed="0.000484"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:48.440462" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:48.440134" elapsed="0.000360"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:48.441007" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:48.440711" elapsed="0.000324"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:48.441607" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:48.441210" elapsed="0.000473">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:48.374045" elapsed="0.067750">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:49.454635" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:49.454102" elapsed="0.000579"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:49.454782" elapsed="0.000080"/>
</return>
<msg time="2026-04-10T00:59:49.455060" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:49.453488" elapsed="0.001609"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:49.464766" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:49.464471" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:49.465251" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:49.464978" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:49.472778" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:49.472869" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:49 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:49 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782789,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:49.472974" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:49.467571" elapsed="0.005431"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:49.465375" elapsed="0.007671"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:49.473292" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:49.473096" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:49.465353" elapsed="0.008028"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:49.477327" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782789,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:49.474447" elapsed="0.002932"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:49.474218" elapsed="0.003196"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:49.474200" elapsed="0.003239"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:49.481577" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:49.477747" elapsed="0.003900"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:49.477495" elapsed="0.004203"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:49.477478" elapsed="0.004253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:49.482527" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:49.481982" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:49.483160" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:49.482815" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:49.484251" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:49.483505" elapsed="0.000784"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:49.483276" elapsed="0.001064"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:49.482787" elapsed="0.001583"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:49.485134" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:49.484620" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:49.485790" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:49.485367" elapsed="0.000508"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:49.486634" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:49.486108" elapsed="0.000554"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:49.485909" elapsed="0.000789"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:49.485336" elapsed="0.001385"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:49.486879" elapsed="0.000450"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:49.487843" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:49.487496" elapsed="0.000374"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:49.488025" elapsed="0.012811"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:49.473777" elapsed="0.027131"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:49.501096" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T00:59:49.500982" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:49.500963" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:49.501362" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:49.501435" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:59:49.504037" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782789,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:49.455636" elapsed="0.048431"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:49.504120" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:49.504273" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782789,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:49.452532" elapsed="0.051767"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:49.505404" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782789, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:49.504946" elapsed="0.000487"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:49.505481" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:49.505843" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782789, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:49.504589" elapsed="0.001281"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:49.506231" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:49.506050" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:49.506756" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:49.506431" elapsed="0.000352"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:49.507216" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:49.506955" elapsed="0.000286"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:49.507847" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:49.507410" elapsed="0.000517">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:49.442786" elapsed="0.065270">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:50.520212" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:50.519850" elapsed="0.000394"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:50.520301" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:59:50.520467" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:50.519473" elapsed="0.001020"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:50.527332" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:50.527068" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:50.527796" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:50.527534" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:50.537654" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:50.537738" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:50 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:50 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782790,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:50.537889" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:50.530068" elapsed="0.007858"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:50.527912" elapsed="0.010075"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:50.538244" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:50.538024" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:50.527893" elapsed="0.010468"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:50.543797" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782790,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:50.539802" elapsed="0.004066"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:50.539467" elapsed="0.004450"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:50.539442" elapsed="0.004509"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:50.548089" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:50.544341" elapsed="0.003814"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:50.544030" elapsed="0.004175"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:50.544006" elapsed="0.004232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:50.549044" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:50.548483" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:50.549516" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:50.549183" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:50.550460" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:50.549914" elapsed="0.000573"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:50.549653" elapsed="0.000870"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:50.549157" elapsed="0.001422"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:50.551107" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:50.550744" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:50.551437" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:50.551203" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:50.552198" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:50.551701" elapsed="0.000576"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:50.551518" elapsed="0.000797"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:50.551186" elapsed="0.001151"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:50.552494" elapsed="0.000481"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:50.553465" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:50.553143" elapsed="0.000349"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:50.553667" elapsed="0.012831"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:50.538878" elapsed="0.027704"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:50.566766" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:59:50.566656" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:50.566638" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:50.567012" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:50.567084" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T00:59:50.569660" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782790,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:50.520852" elapsed="0.048838"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:50.569742" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:59:50.569910" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782790,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:50.518996" elapsed="0.050939"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:50.571017" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782790, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:50.570619" elapsed="0.000427"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:50.571093" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:50.571248" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782790, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:50.570163" elapsed="0.001111"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:50.571825" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:50.571452" elapsed="0.000398"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:50.572329" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:50.572027" elapsed="0.000329"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:50.572804" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:50.572526" elapsed="0.000303"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:50.573345" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:50.573000" elapsed="0.000417">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:50.509032" elapsed="0.064494">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.584937" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:51.584416" elapsed="0.000565"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:51.585057" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:59:51.585286" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:51.583910" elapsed="0.001411"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.593023" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.592763" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.593567" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.593303" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:51.602942" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:51.603004" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:51 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:51 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782791,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:51.603113" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:51.595903" elapsed="0.007252"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.593688" elapsed="0.009528"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:51.603491" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:51.603254" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.593667" elapsed="0.009980"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.609057" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782791,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.605097" elapsed="0.004031"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.604779" elapsed="0.004398"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.604753" elapsed="0.004458"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.613706" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.609625" elapsed="0.004151"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.609288" elapsed="0.004538"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.609265" elapsed="0.004595"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.614751" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:51.614110" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:51.615195" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:51.614894" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.616040" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:51.615481" elapsed="0.000587"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.615278" elapsed="0.000828"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.614868" elapsed="0.001259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.616742" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:51.616291" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:51.617094" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:51.616842" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.617877" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:51.617338" elapsed="0.000566"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.617176" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.616824" elapsed="0.001139"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:51.618118" elapsed="0.000521"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:51.619141" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:51.618808" elapsed="0.000362"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:51.619327" elapsed="0.012917"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:51.604145" elapsed="0.028169"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:51.632512" elapsed="0.000077"/>
</return>
<status status="PASS" start="2026-04-10T00:59:51.632401" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.632378" elapsed="0.000341"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:51.632878" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:51.632951" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:51.635797" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782791,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:51.585824" elapsed="0.050014"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:51.635913" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:59:51.636128" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782791,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:51.583218" elapsed="0.052951"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.637866" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782791, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:51.637257" elapsed="0.000649"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:51.637976" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:59:51.638194" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782791, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:51.636505" elapsed="0.001727"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:51.638885" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:51.638612" elapsed="0.000309"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.639484" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:51.639153" elapsed="0.000358"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.639972" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:51.639703" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:59:51.640169" elapsed="0.000327"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:59:51.574478" elapsed="0.066290"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:59:38.761900" elapsed="12.878924"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:38.761299" elapsed="12.879591"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:38.756358" elapsed="12.884568"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:59:38.756184" elapsed="12.884778"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.659252" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:51.658866" elapsed="0.000415"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:51.659330" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:51.659482" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:51.658292" elapsed="0.001215"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.666388" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.666090" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.666879" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.666617" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:51.674799" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:51.674861" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:51 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:51 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782791,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:51.675018" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:51.669292" elapsed="0.005754"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.666994" elapsed="0.008095"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:51.675334" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:51.675116" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.666975" elapsed="0.008480"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.680457" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782791,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.676972" elapsed="0.003555"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.676641" elapsed="0.003959"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.676615" elapsed="0.004021"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.684156" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.681055" elapsed="0.003149"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.680715" elapsed="0.003523"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.680691" elapsed="0.003572"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.684856" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:51.684439" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:51.685213" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:51.684956" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.685785" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:51.685459" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.685296" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.684937" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.686432" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:51.686039" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:51.686789" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:51.686533" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.687344" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:51.687043" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.686870" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.686515" elapsed="0.000913"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:51.687600" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:51.688434" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:51.688141" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:51.688639" elapsed="0.002844"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:51.676009" elapsed="0.015556"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:51.691747" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:59:51.691638" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.691619" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:51.691989" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:51.692060" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:51.694466" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782791,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:51.659859" elapsed="0.034637"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:51.694564" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:51.694719" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782791,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:51.657602" elapsed="0.037190"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T00:59:51.694841" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:51.694988" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782791,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T00:59:51.646635" elapsed="0.048379"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.696015" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 9000, 'timestamp': 1775782791, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:51.695615" elapsed="0.000429"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:51.696092" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:51.696412" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 9000, 'timestamp': 1775782791, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:51.695254" elapsed="0.001205"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:51.696850" level="INFO">${value} = 9000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:51.696664" elapsed="0.000212"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.697365" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T00:59:51.697055" elapsed="0.000367"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 9000.</doc>
<status status="PASS" start="2026-04-10T00:59:51.645958" elapsed="0.051523"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:51.641168" elapsed="0.056346"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:59:51.641022" elapsed="0.056541"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_del_ten_percent}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:59:38.687442" elapsed="13.010182"/>
</kw>
<kw name="Add Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Add Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.708822" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:51.708478" elapsed="0.000372"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:51.708897" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:51.709071" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:51.708134" elapsed="0.000968"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.723444" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.723182" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.723910" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.723668" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.724353" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.724111" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.724807" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.724564" elapsed="0.000286"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:51.725667" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:59:51.725458" elapsed="0.000235"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:59:51.726016" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:59:51.725848" elapsed="0.000192"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:59:51.726194" elapsed="0.000190"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.726828" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.726579" elapsed="0.000292"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:59:51.726913" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:51.727067" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:59:51.725050" elapsed="0.002041"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:51.737862" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Content-Length': '401', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:59:51.737911" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:51.738000" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:51.729339" elapsed="0.008686"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.727163" elapsed="0.010908"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:51.738258" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:51.738100" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.727145" elapsed="0.011200"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.746186" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.740028" elapsed="0.006264"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.739450" elapsed="0.006927"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.739403" elapsed="0.007081"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.749633" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.747160" elapsed="0.002522"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.746651" elapsed="0.003066"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.746610" elapsed="0.003131"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.750278" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:51.749907" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:51.750653" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:51.750376" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.751200" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:51.750896" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.750736" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.750358" elapsed="0.000924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.751816" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:51.751440" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:51.752192" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:51.751912" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.752755" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:51.752436" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.752276" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.751894" elapsed="0.000943"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:51.752992" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:51.753811" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:51.753521" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:51.753993" elapsed="0.002701"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:51.738761" elapsed="0.017998"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:59:51.756947" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:51.756834" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.756814" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:59:51.759800" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:59:51.757208" elapsed="0.002620"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:59:51.759915" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:51.760074" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:51.720172" elapsed="0.039928"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:51.760195" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:59:51.760358" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:59:51.717456" elapsed="0.042927"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:51.760435" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:59:51.760601" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:51.707690" elapsed="0.052935"/>
</kw>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Add Bulk Flow in member 1 according to ${json_body_add}.</doc>
<status status="PASS" start="2026-04-10T00:59:51.703062" elapsed="0.057624"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.767776" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:51.767450" elapsed="0.000353"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:51.767850" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:51.768000" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:51.767092" elapsed="0.000933"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.775152" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.774898" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.775635" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.775356" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:51.782119" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:51.782177" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:51 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:51 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782791,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:51.782268" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:51.778060" elapsed="0.004233"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.775746" elapsed="0.006589"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:51.782559" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:51.782361" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.775729" elapsed="0.006920"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.786371" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782791,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.783661" elapsed="0.002783"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.783421" elapsed="0.003060"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.783404" elapsed="0.003102"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.790174" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:51.786805" elapsed="0.003434"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.786579" elapsed="0.003707"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.786561" elapsed="0.003761"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.791156" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:51.790617" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:51.791801" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:51.791352" elapsed="0.000555"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.792819" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:51.792270" elapsed="0.000594"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.791952" elapsed="0.000965"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.791324" elapsed="0.001624"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.793730" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:51.793182" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:51.794204" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:51.793872" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.795044" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:51.794620" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:51.794320" elapsed="0.000806"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.793846" elapsed="0.001302"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:51.795304" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:51.796128" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:51.795845" elapsed="0.000309"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:51.796327" elapsed="0.002485"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:51.783002" elapsed="0.015876"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:51.799060" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T00:59:51.798950" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:51.798931" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:51.799304" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:51.799376" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:51.801787" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782791,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:51.768378" elapsed="0.033439"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:51.801870" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:51.802024" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782791,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:51.766634" elapsed="0.035416"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.803053" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782791, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:51.802652" elapsed="0.000430"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:51.803132" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:51.803287" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782791, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:51.802278" elapsed="0.001035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:51.803692" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:51.803493" elapsed="0.000225"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.804197" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:51.803895" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.804676" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:51.804397" elapsed="0.000305"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:51.805320" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:51.804878" elapsed="0.000569">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:51.761932" elapsed="0.043650">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.815177" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:52.814635" elapsed="0.000586"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:52.815295" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T00:59:52.815510" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:52.814124" elapsed="0.001435"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.825164" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:52.824721" elapsed="0.000518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.825798" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:52.825459" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:52.834877" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:52.835149" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:52 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:52 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782792,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:52.835469" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:52.828955" elapsed="0.006628"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:52.825964" elapsed="0.009763"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:52.836336" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:52.835819" elapsed="0.000708"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:52.825933" elapsed="0.010692"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.843526" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782792,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:52.839791" elapsed="0.003838"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:52.839083" elapsed="0.004600"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:52.839022" elapsed="0.004698"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.847607" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:52.844141" elapsed="0.003538"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:52.843809" elapsed="0.003921"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:52.843783" elapsed="0.003984"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.848607" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:52.848049" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:52.849068" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:52.848744" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.849822" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:52.849399" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:52.849175" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:52.848719" elapsed="0.001214"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.850646" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:52.850151" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:52.851217" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:52.850774" elapsed="0.000720"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.852172" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:52.851773" elapsed="0.000434"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:52.851526" elapsed="0.001002"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:52.850750" elapsed="0.001827"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:52.852805" elapsed="0.000467"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:52.853894" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:52.853493" elapsed="0.000436"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:52.854137" elapsed="0.003848"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:52.837752" elapsed="0.020336"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:52.858354" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-10T00:59:52.858205" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:52.858172" 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-04-10T00:59:52.858730" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:52.858825" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:59:52.862063" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782792,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:52.816027" elapsed="0.046080"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:52.862183" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T00:59:52.862396" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782792,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:52.813311" elapsed="0.049120"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.864023" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782792, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:52.863400" elapsed="0.000662"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:52.864125" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T00:59:52.864326" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782792, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:52.862802" elapsed="0.001559"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:52.864855" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:52.864618" elapsed="0.000271"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.865529" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:52.865128" elapsed="0.000456"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.866165" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:52.865817" elapsed="0.000381"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T00:59:52.866427" elapsed="0.000432"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T00:59:52.806324" elapsed="0.060617"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:59:51.761308" elapsed="1.105728"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 1.</doc>
<status status="PASS" start="2026-04-10T00:59:51.760905" elapsed="1.106222"/>
</kw>
<arg>${temp_json_config_add_ten_percent}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Add Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T00:59:51.702566" elapsed="1.164634"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.881211" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T00:59:52.880419" elapsed="0.000834"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.881900" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T00:59:52.881479" elapsed="0.000455"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T00:59:52.882100" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T00:59:52.882324" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T00:59:52.879905" elapsed="0.002452"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.899817" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:52.899413" elapsed="0.000442"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:52.899915" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:59:52.900122" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:52.898986" elapsed="0.001173"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.915381" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:52.915057" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.915886" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:52.915633" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.916399" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:52.916107" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.916872" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:52.916621" elapsed="0.000297"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:52.918022" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T00:59:52.917644" elapsed="0.000418"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T00:59:52.918424" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T00:59:52.918242" elapsed="0.000209"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T00:59:52.918630" elapsed="0.000206"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.919291" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:52.919000" elapsed="0.000336"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T00:59:52.919382" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T00:59:52.919576" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T00:59:52.917175" elapsed="0.002428"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:52.934351" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T00:59:52.934525" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:52.934908" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:52.922119" elapsed="0.012874"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:52.919689" elapsed="0.015468"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:52.935676" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:52.935229" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:52.919667" elapsed="0.016241"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.943434" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:52.938707" elapsed="0.004807"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:52.938143" elapsed="0.005458"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:52.938099" elapsed="0.005544"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.947861" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:52.944112" elapsed="0.003824"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:52.943740" elapsed="0.004250"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:52.943712" elapsed="0.004315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.949049" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:52.948416" elapsed="0.000675"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:52.949596" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:52.949202" elapsed="0.000490"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.950436" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:52.949976" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:52.949728" elapsed="0.000801"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:52.949174" elapsed="0.001410"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.951433" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:52.950825" elapsed="0.000649"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:52.951957" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:52.951605" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.952577" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:52.952261" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:52.952078" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:52.951576" elapsed="0.001087"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:52.952850" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:52.953748" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:52.953400" elapsed="0.000376"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:52.953936" elapsed="0.002688"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:52.936823" elapsed="0.019881"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T00:59:52.956921" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-10T00:59:52.956797" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:52.956773" elapsed="0.000264"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T00:59:52.959932" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T00:59:52.957249" elapsed="0.002712"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T00:59:52.960012" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T00:59:52.960185" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:52.912085" elapsed="0.048126"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:52.960278" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T00:59:52.960432" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T00:59:52.909119" elapsed="0.051338"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:52.960511" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T00:59:52.960680" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:52.898308" elapsed="0.062397"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T00:59:52.890031" elapsed="0.070739"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:52.882629" elapsed="0.078177"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:59:52.882437" elapsed="0.078405"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.973005" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:52.972642" elapsed="0.000396"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:52.973200" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T00:59:52.973372" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:52.972253" elapsed="0.001145"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.981117" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:52.980647" elapsed="0.000552"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:52.981841" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:52.981447" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:52.992742" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:52.992836" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:52 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:52 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782792,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:52.992980" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:52.985324" elapsed="0.007687"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:52.982025" elapsed="0.011048"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:52.993338" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:52.993112" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:52.981992" elapsed="0.011437"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:53.000247" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782792,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:52.994929" elapsed="0.005439"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:52.994608" elapsed="0.005846"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:52.994582" elapsed="0.005928"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:53.006127" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:53.001190" elapsed="0.005035"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:53.000677" elapsed="0.005614"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:53.000635" elapsed="0.005703"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:53.007311" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:53.006706" elapsed="0.000640"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:53.007874" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:53.007449" elapsed="0.000503"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:53.008921" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:53.008216" elapsed="0.000743"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:53.007984" elapsed="0.001023"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:53.007422" elapsed="0.001612"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:53.009816" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:53.009269" elapsed="0.000583"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:53.010273" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:53.009952" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:53.011282" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:53.010616" elapsed="0.000700"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:53.010380" elapsed="0.000981"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:53.009925" elapsed="0.001464"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:53.011627" elapsed="0.000567"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:53.012865" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:53.012416" elapsed="0.000563"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:53.013197" elapsed="0.017300"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:52.993982" elapsed="0.036667"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:53.030938" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T00:59:53.030782" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:53.030745" elapsed="0.000322"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:53.031399" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:53.031495" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T00:59:53.035323" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782792,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:52.973772" elapsed="0.061597"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:53.035448" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T00:59:53.035683" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782792,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:52.971709" elapsed="0.064008"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:53.037596" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782792, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:53.036968" elapsed="0.000666"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:53.037695" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T00:59:53.037892" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782792, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:53.036082" elapsed="0.001844"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:53.038401" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:53.038168" elapsed="0.000266"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:53.039073" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:53.038687" elapsed="0.000450"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:53.039736" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:53.039371" elapsed="0.000397"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:53.040446" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:53.039999" elapsed="0.000684">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:52.967029" elapsed="0.073808">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:54.054025" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:54.053652" elapsed="0.000406"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:54.054116" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T00:59:54.054286" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:54.053268" elapsed="0.001044"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:54.061160" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:54.060902" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:54.061621" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:54.061364" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:54.070904" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:54.070964" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:54 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:54 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782794,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:54.071123" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:54.063888" elapsed="0.007263"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:54.061739" elapsed="0.009459"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:54.071383" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:54.071228" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:54.061719" elapsed="0.009751"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:54.076686" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782794,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:54.072710" elapsed="0.004047"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:54.072376" elapsed="0.004430"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:54.072351" elapsed="0.004489"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:54.080791" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:54.077232" elapsed="0.003607"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:54.076919" elapsed="0.003956"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:54.076895" elapsed="0.004004"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:54.081473" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:54.081077" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:54.081825" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:54.081588" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:54.082599" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:54.082068" elapsed="0.000560"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:54.081906" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:54.081569" elapsed="0.001116"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:54.083210" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:54.082845" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:54.083569" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:54.083308" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:54.084323" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:54.083826" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:54.083664" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:54.083290" elapsed="0.001116"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:54.084578" elapsed="0.000446"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:54.085518" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:54.085191" elapsed="0.000367"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:54.085717" elapsed="0.013073"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:54.071890" elapsed="0.026966"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:54.099032" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T00:59:54.098926" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:54.098908" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:54.099285" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:54.099357" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:54.101918" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782794,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:54.054693" elapsed="0.047316"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:54.102065" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:54.102219" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782794,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:54.052716" elapsed="0.049529"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:54.103217" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782794, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:54.102823" elapsed="0.000423"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:54.103294" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T00:59:54.103448" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782794, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:54.102466" elapsed="0.001008"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:54.104101" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:54.103917" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:54.104619" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:54.104303" elapsed="0.000343"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:54.105078" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:54.104819" elapsed="0.000284"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:54.105636" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:54.105274" elapsed="0.000433">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:54.041833" elapsed="0.063984">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:55.120220" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:55.119833" elapsed="0.000424"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:55.120316" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:59:55.120482" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:55.119459" elapsed="0.001049"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:55.127354" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:55.127040" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:55.127824" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:55.127578" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:55.134853" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:55.134912" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:55 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:55 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782795,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:55.135015" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:55.130112" elapsed="0.004930"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:55.127941" elapsed="0.007144"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:55.135268" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:55.135112" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:55.127920" elapsed="0.007435"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:55.139944" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782795,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:55.136425" elapsed="0.003589"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:55.136158" elapsed="0.003971"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:55.136140" elapsed="0.004025"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:55.144386" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:55.140616" elapsed="0.003837"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:55.140280" elapsed="0.004225"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:55.140252" elapsed="0.004287"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:55.145323" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:55.144808" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:55.145676" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:55.145421" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:55.146433" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:55.145921" elapsed="0.000539"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:55.145759" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:55.145403" elapsed="0.001115"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:55.147057" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:55.146695" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:55.147388" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:55.147154" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:55.148156" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:55.147660" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:55.147469" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:55.147137" elapsed="0.001122"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:55.148415" elapsed="0.000459"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:55.149368" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:55.149040" elapsed="0.000354"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:55.149566" elapsed="0.062298"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:55.135734" elapsed="0.076233"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:55.212198" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:59:55.212071" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:55.212040" elapsed="0.000303"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:55.212538" elapsed="0.000168"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:55.212758" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:55.215183" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782795,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:55.120865" elapsed="0.094349"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:55.215271" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:55.215424" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782795,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:55.118979" elapsed="0.096471"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:55.216666" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782795, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:55.216118" elapsed="0.000577"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:55.216744" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:55.216897" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782795, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:55.215714" elapsed="0.001276"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:55.217360" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:55.217177" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:55.218034" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:55.217718" elapsed="0.000342"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:55.218503" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:55.218235" elapsed="0.000293"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:55.219078" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:55.218723" elapsed="0.000432">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:55.106907" elapsed="0.112362">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:56.233196" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:56.232642" elapsed="0.000600"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:56.233324" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T00:59:56.233584" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:56.231846" elapsed="0.001776"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:56.242188" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:56.241880" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:56.242677" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:56.242406" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:56.250054" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:56.250134" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:56 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:56 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782796,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:56.250251" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:56.244994" elapsed="0.005286"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:56.242802" elapsed="0.007532"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:56.250588" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:56.250371" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:56.242779" elapsed="0.007903"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:56.255163" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782796,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:56.251874" elapsed="0.003357"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:56.251622" elapsed="0.003655"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:56.251598" elapsed="0.003712"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:56.259976" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:56.255719" elapsed="0.004347"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:56.255386" elapsed="0.004742"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:56.255363" elapsed="0.004808"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:56.261381" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:56.260522" elapsed="0.000915"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:56.262116" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:56.261612" elapsed="0.000617"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:56.263292" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:56.262509" elapsed="0.000823"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:56.262265" elapsed="0.001210"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:56.261571" elapsed="0.001940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:56.264369" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:56.263807" elapsed="0.000602"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:56.264962" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:56.264515" elapsed="0.000535"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:56.265947" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:56.265317" elapsed="0.000659"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:56.265085" elapsed="0.000931"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:56.264488" elapsed="0.001550"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:56.266205" elapsed="0.000536"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:56.267422" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:56.266976" elapsed="0.000481"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:56.267704" elapsed="0.016265"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:56.251120" elapsed="0.032958"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:56.284375" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-04-10T00:59:56.284191" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:56.284155" elapsed="0.000361"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:56.284846" elapsed="0.000039"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:56.284957" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T00:59:56.287504" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782796,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:56.234114" elapsed="0.053422"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:56.287888" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T00:59:56.288062" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782796,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:56.230992" elapsed="0.057098"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:56.289324" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782796, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:56.288803" elapsed="0.000550"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:56.289405" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T00:59:56.289619" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782796, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:56.288345" elapsed="0.001308"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:56.290069" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:56.289868" elapsed="0.000229"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:56.290662" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:56.290281" elapsed="0.000409"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:56.291172" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:56.290890" elapsed="0.000309"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:56.292095" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:56.291378" elapsed="0.000793">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:56.220333" elapsed="0.071956">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:57.300910" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:57.300435" elapsed="0.000612"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:57.301123" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T00:59:57.301335" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:57.299971" elapsed="0.001455"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:57.311079" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:57.310665" elapsed="0.000486"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:57.311719" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:57.311370" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:57.890284" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:57.890434" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:57 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:57 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782797,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:57.890676" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:57.315996" elapsed="0.574726"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:57.311884" elapsed="0.578923"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:57.891171" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:57.890859" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:57.311855" elapsed="0.579451"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:57.897393" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782797,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:57.893020" elapsed="0.004467"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:57.892659" elapsed="0.004941"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:57.892630" elapsed="0.005016"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:57.902674" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:57.898242" elapsed="0.004512"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:57.897848" elapsed="0.004963"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:57.897815" elapsed="0.005033"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:57.903817" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:57.903155" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:57.904334" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:57.903971" elapsed="0.000451"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:57.905475" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:57.904723" elapsed="0.000792"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:57.904457" elapsed="0.001134"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:57.903942" elapsed="0.001682"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:57.906429" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:57.905887" elapsed="0.000582"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:57.906970" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:57.906617" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:57.908098" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:57.907335" elapsed="0.000803"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:57.907092" elapsed="0.001100"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:57.906589" elapsed="0.001633"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:57.908461" elapsed="0.000684"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:57.909946" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:57.909396" elapsed="0.000711"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:57.910345" elapsed="0.013513"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:57.891928" elapsed="0.032039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:57.924209" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T00:59:57.924078" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:57.924045" 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-04-10T00:59:57.924523" elapsed="0.000057"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:57.924635" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:57.927715" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782797,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:57.301906" elapsed="0.625841"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:57.927805" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T00:59:57.927965" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782797,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:57.299312" elapsed="0.628679"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:57.929174" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782797, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:57.928695" elapsed="0.000508"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:57.929253" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T00:59:57.929409" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782797, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:57.928258" elapsed="0.001178"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:57.930125" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:57.929935" elapsed="0.000216"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:57.930664" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:57.930334" elapsed="0.000358"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:57.931138" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:57.930869" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:57.931751" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:57.931340" elapsed="0.000486">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:57.293029" elapsed="0.638908">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:58.944833" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:58.944442" elapsed="0.000423"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T00:59:58.944923" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T00:59:58.945090" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T00:59:58.944065" elapsed="0.001052"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:58.952418" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:58.952151" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:58.952908" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:58.952654" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T00:59:58.960601" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T00:59:58.960766" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 00:59:58 GMT', 'Expires': 'Thu, 09 Apr 2026 23:59:58 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782798,"status":200} 
 </msg>
<msg time="2026-04-10T00:59:58.960903" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T00:59:58.955229" elapsed="0.005712"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:58.953030" elapsed="0.007973"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:58.961265" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:58.961043" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:58.953009" elapsed="0.008379"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:58.966763" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782798,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:58.962894" elapsed="0.003941"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:58.962576" elapsed="0.004310"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:58.962531" elapsed="0.004389"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T00:59:58.971208" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T00:59:58.967321" elapsed="0.003955"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:58.967001" elapsed="0.004327"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:58.966977" elapsed="0.004385"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:58.971971" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:58.971572" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:58.972316" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:58.972073" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:58.973114" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:58.972588" elapsed="0.000554"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:58.972402" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:58.972055" elapsed="0.001146"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:58.973758" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:58.973365" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:58.974096" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T00:59:58.973858" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T00:59:58.974887" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T00:59:58.974357" elapsed="0.000558"/>
</kw>
<status status="PASS" start="2026-04-10T00:59:58.974177" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:58.973840" elapsed="0.001134"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T00:59:58.975165" elapsed="0.000495"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T00:59:58.976180" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:58.975835" elapsed="0.000372"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T00:59:58.976367" elapsed="0.013453"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T00:59:58.961927" elapsed="0.027996"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T00:59:58.990143" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T00:59:58.990020" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T00:59:58.989993" elapsed="0.000253"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T00:59:58.990920" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T00:59:58.991002" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T00:59:58.994034" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782798,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T00:59:58.945492" elapsed="0.048650"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T00:59:58.994213" elapsed="0.000081"/>
</return>
<msg time="2026-04-10T00:59:58.994447" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782798,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:58.943573" elapsed="0.050901"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T00:59:58.995731" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782798, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T00:59:58.995220" elapsed="0.000541"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T00:59:58.995813" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T00:59:58.995979" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782798, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T00:59:58.994791" elapsed="0.001215"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T00:59:58.996384" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T00:59:58.996195" elapsed="0.000215"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:58.997137" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:58.996812" elapsed="0.000372"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T00:59:58.998090" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T00:59:58.997395" elapsed="0.000722"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T00:59:58.998728" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T00:59:58.998326" elapsed="0.000479">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:58.932897" elapsed="0.066028">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:00.009271" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:00.008822" elapsed="0.000491"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:00.009383" elapsed="0.000049"/>
</return>
<msg time="2026-04-10T01:00:00.009606" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:00.008323" elapsed="0.001317"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:00.019752" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:00.019238" elapsed="0.000590"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:00.020358" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:00.020046" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:00.028507" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:00.028634" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:00 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782800,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:00.028787" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:00.023604" elapsed="0.005223"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:00.020518" elapsed="0.008380"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:00.029181" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:00.028943" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:00.020489" elapsed="0.008821"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:00.035223" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782800,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:00.030966" elapsed="0.004332"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:00.030600" elapsed="0.004829"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:00.030572" elapsed="0.004886"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:00.038488" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:00.035768" elapsed="0.002769"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:00.035519" elapsed="0.003081"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:00.035501" elapsed="0.003125"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:00.039223" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:00.038823" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:00.039582" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:00.039324" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:00.040351" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:00.039834" elapsed="0.000544"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:00.039667" elapsed="0.000749"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:00.039305" elapsed="0.001132"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:00.040987" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:00.040618" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:00.041322" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:00.041086" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:00.042098" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:00.041584" elapsed="0.000542"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:00.041405" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:00.041068" elapsed="0.001115"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:00.042356" elapsed="0.000495"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:00.043346" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:00.043021" elapsed="0.000352"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:00.043531" elapsed="0.012749"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:00.029915" elapsed="0.026432"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:00.056529" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T01:00:00.056420" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:00.056401" elapsed="0.000241"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:00.056795" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:00.056867" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:00.059660" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782800,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:00.010091" elapsed="0.049599"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:00.059744" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:00.059897" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782800,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:00.007513" elapsed="0.052411"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:00.060910" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782800, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:00.060497" elapsed="0.000442"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:00.060988" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:00.061141" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782800, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:00.060149" elapsed="0.001061"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:00.061598" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:00.061397" elapsed="0.000229"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:00.062111" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:00.061805" elapsed="0.000334"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:00.062623" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:00.062313" elapsed="0.000336"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:00.063190" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:00.062839" elapsed="0.000422">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T00:59:59.999875" elapsed="0.063496">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:01.079019" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:01.078151" elapsed="0.000945"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:01.079228" elapsed="0.000084"/>
</return>
<msg time="2026-04-10T01:00:01.079712" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:01.077183" elapsed="0.002594"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:01.087307" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:01.087038" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:01.087803" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:01.087532" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:01.097512" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:01.097600" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:01 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:01 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782801,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:01.097895" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:01.090094" elapsed="0.007827"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:01.087927" elapsed="0.010040"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:01.098164" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:01.097999" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:01.087905" elapsed="0.010345"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:01.103036" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782801,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:01.099343" elapsed="0.003766"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:01.099112" elapsed="0.004047"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:01.099093" elapsed="0.004109"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:01.107501" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:01.103668" elapsed="0.003925"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:01.103295" elapsed="0.004349"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:01.103271" elapsed="0.004407"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:01.108495" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:01.107928" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:01.108856" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:01.108612" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:01.109651" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:01.109106" elapsed="0.000573"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:01.108940" elapsed="0.000839"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:01.108594" elapsed="0.001211"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:01.110347" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:01.109973" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:01.110715" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:01.110446" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:01.111675" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:01.110961" elapsed="0.000753"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:01.110799" elapsed="0.000959"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:01.110429" elapsed="0.001353"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:01.111953" elapsed="0.000470"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:01.112981" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:01.112638" elapsed="0.000370"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:01.113223" elapsed="0.013401"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:01.098667" elapsed="0.028041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:01.126930" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T01:00:01.126806" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:01.126781" elapsed="0.000249"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:01.127204" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:01.127277" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:01.130076" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782801,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:01.080532" elapsed="0.049575"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:01.130162" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:01.130318" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782801,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:01.075785" elapsed="0.054559"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:01.131488" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782801, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:01.130990" elapsed="0.000534"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:01.131597" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:01.131758" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782801, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:01.130611" elapsed="0.001174"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:01.132150" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:01.131970" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:01.132686" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:01.132354" elapsed="0.000358"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:01.133156" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:01.132888" elapsed="0.000293"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:01.133955" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:01.133351" elapsed="0.000679">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:01.064270" elapsed="0.070017">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:02.146512" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:02.146148" elapsed="0.000499"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:02.146709" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T01:00:02.146889" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:02.145782" elapsed="0.001133"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:02.154122" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:02.153860" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:02.154616" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:02.154355" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:02.163975" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:02.164060" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:02 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:02 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782802,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:02.164192" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:02.156916" elapsed="0.007313"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:02.154738" elapsed="0.009553"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:02.164571" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:02.164330" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:02.154717" elapsed="0.009979"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:02.169970" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782802,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:02.166118" elapsed="0.003922"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:02.165808" elapsed="0.004280"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:02.165782" elapsed="0.004341"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:02.174317" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:02.170516" elapsed="0.003868"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:02.170203" elapsed="0.004230"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:02.170179" elapsed="0.004289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:02.175264" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:02.174729" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:02.175767" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:02.175402" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:02.176863" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:02.176128" elapsed="0.000774"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:02.175883" elapsed="0.001069"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:02.175377" elapsed="0.001606"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:02.177750" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:02.177211" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:02.178211" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:02.177885" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:02.179353" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:02.178595" elapsed="0.000796"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:02.178324" elapsed="0.001117"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:02.177861" elapsed="0.001610"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:02.179713" elapsed="0.000694"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:02.180964" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:02.180637" elapsed="0.000394"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:02.181212" elapsed="0.013039"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:02.165198" elapsed="0.029123"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:02.194509" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T01:00:02.194397" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:02.194377" 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-04-10T01:00:02.194776" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:02.194847" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:02.198846" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782802,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:02.147265" elapsed="0.051611"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:02.198930" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:02.199084" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782802,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:02.145289" elapsed="0.053821"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:02.200197" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782802, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:02.199764" elapsed="0.000461"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:02.200274" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:02.200429" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782802, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:02.199341" elapsed="0.001114"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:02.201050" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:02.200676" elapsed="0.000399"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:02.201967" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:02.201247" elapsed="0.000750"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:02.202436" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:02.202172" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:02.202995" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:02.202648" elapsed="0.000419">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:02.135212" elapsed="0.067964">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:03.212487" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:03.212089" elapsed="0.000495"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:03.212648" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T01:00:03.212830" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:03.211689" elapsed="0.001166"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:03.219919" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:03.219641" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:03.220440" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:03.220168" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:03.228437" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:03.228659" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:03 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:03 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782803,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:03.228780" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:03.223045" elapsed="0.005763"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:03.220615" elapsed="0.008241"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:03.229062" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:03.228887" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:03.220591" elapsed="0.008560"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:03.234604" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782803,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:03.230520" elapsed="0.004158"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:03.230194" elapsed="0.004534"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:03.230167" elapsed="0.004596"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:03.239121" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:03.235176" elapsed="0.004036"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:03.234848" elapsed="0.004429"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:03.234823" elapsed="0.004499"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:03.240449" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:03.239696" elapsed="0.000806"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:03.241232" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:03.240731" elapsed="0.000620"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:03.242376" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:03.241693" elapsed="0.000721"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:03.241399" elapsed="0.001066"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:03.240692" elapsed="0.001804"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:03.243258" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:03.242773" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:03.243631" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:03.243368" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:03.244441" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:03.243880" elapsed="0.000589"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:03.243715" elapsed="0.000790"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:03.243349" elapsed="0.001213"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:03.244732" elapsed="0.000465"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:03.245751" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:03.245370" elapsed="0.000408"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:03.245942" elapsed="0.014860"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:03.229564" elapsed="0.031363"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:03.261207" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-04-10T01:00:03.261059" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:03.261024" elapsed="0.000329"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:03.261628" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:03.261731" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T01:00:03.264974" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782803,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:03.213213" elapsed="0.051891"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:03.265189" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T01:00:03.265403" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782803,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:03.211163" elapsed="0.054275"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:03.267295" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782803, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:03.266370" elapsed="0.000968"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:03.267411" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:00:03.267644" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782803, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:03.265835" elapsed="0.001843"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:03.268141" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:03.267913" elapsed="0.000261"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:03.268888" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:03.268398" elapsed="0.000528"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:03.269533" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:03.269174" elapsed="0.000412"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:03.270222" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:03.269773" elapsed="0.000528">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:03.204345" elapsed="0.066083">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:04.283330" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:04.282963" elapsed="0.000399"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:04.283419" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T01:00:04.283602" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:04.282589" elapsed="0.001040"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:04.290632" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:04.290355" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:04.291092" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:04.290841" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:04.300746" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:04.300832" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:04 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:04 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782804,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:04.300968" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:04.293388" elapsed="0.007618"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:04.291210" elapsed="0.009888"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:04.301371" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:04.301139" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:04.291189" elapsed="0.010310"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:04.307246" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782804,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:04.303069" elapsed="0.004249"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:04.302727" elapsed="0.004711"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:04.302699" elapsed="0.004778"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:04.312019" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:04.307929" elapsed="0.004160"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:04.307584" elapsed="0.004557"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:04.307536" elapsed="0.004641"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:04.313056" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:04.312438" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:04.313625" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:04.313221" elapsed="0.000492"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:04.314814" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:04.314034" elapsed="0.000826"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:04.313749" elapsed="0.001174"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:04.313195" elapsed="0.001763"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:04.315880" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:04.315264" elapsed="0.000657"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:04.316381" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:04.316025" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:04.317567" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:04.316783" elapsed="0.000827"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:04.316503" elapsed="0.001161"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:04.315998" elapsed="0.001700"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:04.317927" elapsed="0.000675"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:04.319437" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:04.318876" elapsed="0.000600"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:04.319737" elapsed="0.014054"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:04.302061" elapsed="0.031800"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:04.334046" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T01:00:04.333934" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:04.333915" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:04.334310" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:04.334383" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:04.336795" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782804,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:04.283974" elapsed="0.052851"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:04.336877" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:04.337028" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782804,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:04.282092" elapsed="0.054961"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:04.338322" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782804, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:04.337921" elapsed="0.000429"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:04.338398" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:04.338570" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782804, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:04.337320" elapsed="0.001322"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:04.339007" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:04.338826" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:04.339524" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:04.339210" elapsed="0.000356"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:04.340027" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:04.339744" elapsed="0.000310"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:04.340610" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:04.340230" elapsed="0.000453">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:04.271298" elapsed="0.069497">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:05.352813" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:05.352405" elapsed="0.000441"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:05.352907" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:00:05.353078" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:05.352043" elapsed="0.001061"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:05.360532" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:05.360267" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:05.361006" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:05.360759" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:05.370496" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:05.370592" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:05 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:05 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782805,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:05.370718" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:05.363331" elapsed="0.007424"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:05.361124" elapsed="0.009692"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:05.371074" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:05.370856" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:05.361104" elapsed="0.010091"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:05.376718" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782805,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:05.372683" elapsed="0.004110"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:05.372328" elapsed="0.004517"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:05.372302" elapsed="0.004580"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:05.380485" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:05.377289" elapsed="0.003247"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:05.376964" elapsed="0.003634"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:05.376940" elapsed="0.003686"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:05.381209" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:05.380811" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:05.381577" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:05.381309" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:05.382367" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:05.381852" elapsed="0.000544"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:05.381686" elapsed="0.000819"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:05.381291" elapsed="0.001245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:05.383105" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:05.382725" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:05.383462" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:05.383206" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:05.384382" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:05.383791" elapsed="0.000622"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:05.383566" elapsed="0.000888"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:05.383187" elapsed="0.001290"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:05.384680" elapsed="0.000530"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:05.385791" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:05.385389" elapsed="0.000430"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:05.385983" elapsed="0.013065"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:05.371730" elapsed="0.027391"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:05.399317" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T01:00:05.399201" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:05.399181" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:05.399586" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:05.399660" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T01:00:05.402261" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782805,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:05.353481" elapsed="0.048810"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:05.402345" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:05.402499" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782805,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:05.351559" elapsed="0.050967"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:05.403577" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782805, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:05.403163" elapsed="0.000443"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:05.403657" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:05.403813" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782805, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:05.402788" elapsed="0.001051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:05.404200" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:05.404021" elapsed="0.000204"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:05.404899" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:05.404403" elapsed="0.000523"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:05.405365" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:05.405103" elapsed="0.000287"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:05.405966" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:05.405577" elapsed="0.000464">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:05.341843" elapsed="0.064311">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.418050" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:06.417510" elapsed="0.000671"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:06.418292" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T01:00:06.418533" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:06.417002" elapsed="0.001589"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.427034" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.426698" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.427504" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.427255" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:06.436165" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:06.436226" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:06 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782806,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:06.436324" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:06.429857" elapsed="0.006497"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.427648" elapsed="0.008761"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:06.436643" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:06.436441" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.427625" elapsed="0.009116"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.441569" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782806,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.437883" elapsed="0.003758"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.437653" elapsed="0.004038"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.437634" elapsed="0.004090"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.446143" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.442118" elapsed="0.004120"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.441803" elapsed="0.004487"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.441780" elapsed="0.004544"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.447039" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:06.446592" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:06.447376" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:06.447137" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.448164" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:06.447637" elapsed="0.000555"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.447458" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.447120" elapsed="0.001130"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.448798" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:06.448410" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:06.449130" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:06.448895" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.449905" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:06.449373" elapsed="0.000559"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.449212" elapsed="0.000756"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.448877" elapsed="0.001112"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:06.450145" elapsed="0.000851"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:06.451518" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:06.451182" elapsed="0.000431"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:06.451777" elapsed="0.012705"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:06.437152" elapsed="0.027445"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:06.464786" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T01:00:06.464673" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.464654" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:06.465033" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:06.465105" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:06.467904" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782806,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:06.419177" elapsed="0.048756"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:06.467986" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:06.468140" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782806,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:06.416302" elapsed="0.051864"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.469301" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782806, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:06.468892" elapsed="0.000437"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:06.469377" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:06.469532" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782806, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:06.468395" elapsed="0.001179"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:06.469943" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:06.469760" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.470478" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:06.470143" elapsed="0.000360"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.470960" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:06.470693" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T01:00:06.471171" elapsed="0.000310"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T01:00:06.407147" elapsed="0.064426"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T00:59:52.966335" elapsed="13.505295"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T00:59:52.965795" elapsed="13.505900"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:52.961049" elapsed="13.510680"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T00:59:52.960900" elapsed="13.510865"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.483386" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:06.483082" elapsed="0.000332"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:06.483460" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:06.483639" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:06.482731" elapsed="0.000934"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.490922" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.490671" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.491376" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.491123" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:06.501189" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:06.501305" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:06 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782806,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:06.501439" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:06.493668" elapsed="0.007808"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.491534" elapsed="0.010003"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:06.501832" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:06.501601" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.491514" elapsed="0.010443"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.506984" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782806,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.503409" elapsed="0.003643"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.503103" elapsed="0.003999"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.503076" elapsed="0.004061"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.511263" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.507561" elapsed="0.003770"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.507215" elapsed="0.004167"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.507192" elapsed="0.004225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.512218" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:06.511672" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:06.512714" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:06.512358" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.513500" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:06.513078" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.512835" elapsed="0.000781"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.512333" elapsed="0.001314"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.514469" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:06.513874" elapsed="0.000633"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:06.514888" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:06.514629" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.515421" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:06.515129" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.514970" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.514604" elapsed="0.000899"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:06.515672" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:06.516458" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:06.516183" elapsed="0.000300"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:06.516656" elapsed="0.002459"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:06.502481" elapsed="0.016696"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:06.519351" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T01:00:06.519247" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.519229" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:06.519641" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:06.519715" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:06.522085" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782806,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:06.484198" elapsed="0.037917"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:06.522166" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T01:00:06.522368" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782806,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:06.482243" elapsed="0.040152"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T01:00:06.522443" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:00:06.522604" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782806,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T01:00:06.477473" elapsed="0.045168"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.523606" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782806, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:06.523201" elapsed="0.000433"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:06.523683" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:06.523841" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782806, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:06.522861" elapsed="0.001006"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:06.524222" level="INFO">${value} = 10000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:06.524043" elapsed="0.000205"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.524721" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T01:00:06.524425" elapsed="0.000349"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 10000.</doc>
<status status="PASS" start="2026-04-10T01:00:06.477034" elapsed="0.047798"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:00:06.471968" elapsed="0.052898"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:00:06.471826" elapsed="0.053071"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T00:59:52.878898" elapsed="13.646053"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T00:59:37.504365" elapsed="29.020625"/>
</iter>
<iter>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.525515" level="INFO">3</msg>
<arg>${index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.525256" elapsed="0.000319"/>
</kw>
<kw name="Delete Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Delete Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.536558" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:06.536225" elapsed="0.000363"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:06.536635" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:06.536784" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:06.535827" elapsed="0.000982"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.551158" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.550900" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.551610" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.551359" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.552051" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.551809" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.552504" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.552264" elapsed="0.000314"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:06.553447" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T01:00:06.553194" elapsed="0.000280"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T01:00:06.553820" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T01:00:06.553647" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T01:00:06.553999" elapsed="0.000191"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.554650" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.554383" elapsed="0.000312"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T01:00:06.554739" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:06.554911" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T01:00:06.552788" elapsed="0.002150"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:06.568946" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Content-Length': '402', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T01:00:06.569104" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:06.569370" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:06.557192" elapsed="0.012245"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.555011" elapsed="0.014595"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:06.570147" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:06.569686" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.554993" elapsed="0.015422"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.577805" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.573275" elapsed="0.004595"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.572648" elapsed="0.005274"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.572598" elapsed="0.005360"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.581851" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.578388" elapsed="0.003531"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.578039" elapsed="0.003929"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.578015" elapsed="0.003987"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.582820" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:06.582247" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:06.583158" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:06.582918" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.583727" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:06.583403" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.583240" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.582900" elapsed="0.000913"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.584332" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:06.583973" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:06.584678" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:06.584429" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.585212" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:06.584919" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.584759" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.584412" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:06.585452" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:06.586357" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:06.586049" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:06.586554" elapsed="0.002669"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:06.571395" elapsed="0.017895"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:00:06.589473" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:00:06.589364" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.589346" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:00:06.592240" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:00:06.589710" elapsed="0.002557"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:00:06.592316" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T01:00:06.592476" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:06.548056" elapsed="0.044445"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:06.592587" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:06.592739" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T01:00:06.545360" elapsed="0.047404"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:06.592817" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T01:00:06.592962" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:06.535370" elapsed="0.057616"/>
</kw>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Delete Bulk Flow in member 1 according to ${json_body_del}.</doc>
<status status="PASS" start="2026-04-10T01:00:06.530741" elapsed="0.062308"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.600121" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:06.599811" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:06.600197" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:06.600350" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:06.599429" elapsed="0.000946"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.607609" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.607313" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.608117" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.607848" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:06.615992" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:06.616074" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:06 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782806,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:06.616205" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:06.610471" elapsed="0.005771"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.608246" elapsed="0.008060"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:06.616583" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:06.616343" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.608227" elapsed="0.008543"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.621819" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782806,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.618199" elapsed="0.003691"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.617890" elapsed="0.004050"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.617865" elapsed="0.004109"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.625005" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:06.622418" elapsed="0.002635"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.622055" elapsed="0.003033"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.622030" elapsed="0.003083"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.625699" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:06.625288" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:06.626041" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:06.625800" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.626640" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:06.626289" elapsed="0.000378"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.626124" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.625781" elapsed="0.000944"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.627252" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:06.626887" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:06.627602" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:06.627351" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.628143" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:06.627845" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:06.627684" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.627333" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:06.628383" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:06.629219" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:06.628934" elapsed="0.000311"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:06.629401" elapsed="0.002540"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:06.617274" elapsed="0.014736"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:06.632218" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T01:00:06.632088" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:06.632068" 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-04-10T01:00:06.632474" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:06.632567" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T01:00:06.634986" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782806,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:06.600731" elapsed="0.034284"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:06.635070" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:06.635224" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782806,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:06.598929" elapsed="0.036321"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.636282" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782806, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:06.635875" elapsed="0.000435"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:06.636422" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:06.636597" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782806, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:06.635489" elapsed="0.001135"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:06.636987" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:06.636806" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.637501" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:06.637194" elapsed="0.000334"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.637982" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:06.637719" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:06.638591" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:06.638185" elapsed="0.000480">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:06.594260" elapsed="0.044523">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.656189" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:07.655814" elapsed="0.000407"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:07.656281" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T01:00:07.656451" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:07.655015" elapsed="0.001462"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.663697" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:07.663413" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.664170" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:07.663907" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:07.670923" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:07.670982" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:07 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:07 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782807,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:07.671126" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:07.666576" elapsed="0.004593"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:07.664290" elapsed="0.006922"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:07.671434" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:07.671241" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.664269" elapsed="0.007253"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.676569" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782807,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:07.673453" elapsed="0.003203"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:07.673192" elapsed="0.003515"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.673171" elapsed="0.003571"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.680935" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:07.677167" elapsed="0.003835"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:07.676836" elapsed="0.004214"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.676812" elapsed="0.004273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.681943" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:07.681351" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:07.682500" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:07.682094" elapsed="0.000651"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.683526" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:07.683086" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:07.682782" elapsed="0.000857"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.682056" elapsed="0.001614"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.684230" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:07.683861" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:07.684584" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:07.684329" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.685158" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:07.684837" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:07.684668" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.684310" elapsed="0.000933"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:07.685414" elapsed="0.000383"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:07.686259" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:07.685966" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:07.686445" elapsed="0.002681"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:07.672613" elapsed="0.016578"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:07.689374" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T01:00:07.689263" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.689245" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:07.689637" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:07.689709" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:07.692163" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782807,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:07.656836" elapsed="0.035356"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:07.692254" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:07.692409" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782807,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:07.653882" elapsed="0.038553"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.693456" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782807, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:07.693045" elapsed="0.000439"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:07.693533" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T01:00:07.693706" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782807, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:07.692697" elapsed="0.001036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:07.694096" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:07.693913" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.694626" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:07.694299" elapsed="0.000355"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.695128" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:07.694829" elapsed="0.000325"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T01:00:07.695331" elapsed="0.000334"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T01:00:07.639743" elapsed="0.055983"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T01:00:06.593680" elapsed="1.102138"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 1.</doc>
<status status="PASS" start="2026-04-10T01:00:06.593270" elapsed="1.102610"/>
</kw>
<arg>${temp_json_config_del_ten_percent}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Delete Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T01:00:06.530208" elapsed="1.165730"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.706144" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T01:00:07.705732" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.706655" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T01:00:07.706331" elapsed="0.000370"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T01:00:07.706745" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T01:00:07.706983" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T01:00:07.705320" elapsed="0.001689"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.718653" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:07.718303" elapsed="0.000391"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:07.718742" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:07.718915" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:07.717929" elapsed="0.001012"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.733314" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:07.733051" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.733795" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:07.733522" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.734243" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:07.733998" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.734717" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:07.734444" elapsed="0.000355"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:07.735789" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T01:00:07.735527" elapsed="0.000289"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T01:00:07.736163" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T01:00:07.735973" elapsed="0.000227"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T01:00:07.736373" elapsed="0.000223"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.737028" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:07.736775" elapsed="0.000310"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T01:00:07.737137" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:07.737294" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T01:00:07.735067" elapsed="0.002252"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:07.751095" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T01:00:07.751189" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:07.751378" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:07.739582" elapsed="0.011837"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:07.737393" elapsed="0.014209"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:07.751876" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:07.751646" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.737374" elapsed="0.014631"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.757433" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:07.753679" elapsed="0.003820"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:07.753333" elapsed="0.004237"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.753306" elapsed="0.004304"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.761529" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:07.758022" elapsed="0.003603"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:07.757694" elapsed="0.003983"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.757670" elapsed="0.004043"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.762648" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:07.761960" elapsed="0.000730"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:07.763186" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:07.762794" elapsed="0.000475"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.764043" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:07.763585" elapsed="0.000496"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:07.763304" elapsed="0.000829"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.762768" elapsed="0.001396"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.765109" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:07.764406" elapsed="0.000743"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:07.765655" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:07.765250" elapsed="0.000494"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.766440" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:07.766019" elapsed="0.000468"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:07.765783" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.765224" elapsed="0.001374"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:07.766855" elapsed="0.000551"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:07.768187" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:07.767719" elapsed="0.000505"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:07.768497" elapsed="0.003561"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:07.752665" elapsed="0.019462"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:00:07.772333" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:00:07.772211" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.772193" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:00:07.775413" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:00:07.772585" elapsed="0.002857"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:00:07.775492" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T01:00:07.775687" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:07.730267" elapsed="0.045447"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:07.775784" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:07.775939" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T01:00:07.727614" elapsed="0.048351"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:07.776076" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:07.776229" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:07.717415" elapsed="0.058839"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T01:00:07.712379" elapsed="0.063942"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:00:07.707256" elapsed="0.069099"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:00:07.707100" elapsed="0.069291"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.793401" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:07.793103" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:07.793476" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:07.793644" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:07.792757" elapsed="0.000912"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.801678" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:07.801359" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.802196" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:07.801922" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:07.810597" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:07.810772" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:07 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:07 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782807,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:07.811110" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:07.804581" elapsed="0.006601"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:07.802327" elapsed="0.008965"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:07.811845" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:07.811361" elapsed="0.000679"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.802305" elapsed="0.009789"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.820711" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782807,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:07.815106" elapsed="0.005658"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:07.814381" elapsed="0.006423"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.814331" elapsed="0.006501"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.824023" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:07.821129" elapsed="0.002943"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:07.820893" elapsed="0.003217"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.820874" elapsed="0.003260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.824839" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:07.824318" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:07.825197" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:07.824945" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.825988" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:07.825445" elapsed="0.000571"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:07.825281" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.824926" elapsed="0.001151"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.826751" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:07.826306" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:07.827106" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:07.826853" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.827931" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:07.827353" elapsed="0.000606"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:07.827190" elapsed="0.000807"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.826834" elapsed="0.001186"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:07.828179" elapsed="0.000550"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:07.829240" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:07.828905" elapsed="0.000362"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:07.829427" elapsed="0.014134"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:07.813149" elapsed="0.030523"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:07.844010" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-04-10T01:00:07.843794" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:07.843757" elapsed="0.000400"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:07.844387" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:07.844491" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T01:00:07.848197" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782807,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:07.794054" elapsed="0.054182"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:07.848311" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T01:00:07.848510" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782807,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:07.792282" elapsed="0.056556"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.850296" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782807, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:07.849672" elapsed="0.000668"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:07.850416" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T01:00:07.850679" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782807, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:07.849163" elapsed="0.001558"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:07.851299" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:07.851021" elapsed="0.000320"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.852095" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:07.851640" elapsed="0.000495"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.852863" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:07.852395" elapsed="0.000508"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:07.853797" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:07.853177" elapsed="0.000724">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:07.783766" elapsed="0.070301">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:08.866810" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:08.866147" elapsed="0.000712"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:08.867094" elapsed="0.000066"/>
</return>
<msg time="2026-04-10T01:00:08.867363" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:08.865473" elapsed="0.001930"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:08.876197" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:08.875919" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:08.876679" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:08.876411" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:08.885956" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:08.886042" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:08 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:08 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782808,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:08.886178" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:08.878975" elapsed="0.007241"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:08.876802" elapsed="0.009478"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:08.886542" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:08.886320" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:08.876781" elapsed="0.009916"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:08.892386" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782808,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:08.888385" elapsed="0.004072"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:08.887884" elapsed="0.004624"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:08.887857" elapsed="0.004709"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:08.896737" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:08.892986" elapsed="0.003800"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:08.892664" elapsed="0.004157"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:08.892639" elapsed="0.004207"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:08.897433" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:08.897035" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:08.897796" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:08.897533" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:08.898581" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:08.898050" elapsed="0.000559"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:08.897884" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:08.897515" elapsed="0.001152"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:08.899200" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:08.898829" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:08.899587" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:08.899299" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:08.900349" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:08.899839" elapsed="0.000538"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:08.899673" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:08.899281" elapsed="0.001155"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:08.900609" elapsed="0.000461"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:08.901590" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:08.901242" elapsed="0.000377"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:08.901832" elapsed="0.013506"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:08.887216" elapsed="0.028194"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:08.915662" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T01:00:08.915484" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:08.915466" elapsed="0.000305"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:08.915941" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:08.916026" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T01:00:08.918405" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782808,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:08.868020" elapsed="0.050415"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:08.918489" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:08.918799" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782808,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:08.864533" elapsed="0.054299"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:08.919953" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782808, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:08.919458" elapsed="0.000526"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:08.920036" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:08.920197" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782808, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:08.919078" elapsed="0.001147"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:08.920689" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:08.920410" elapsed="0.000306"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:08.921213" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:08.920900" elapsed="0.000339"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:08.921700" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:08.921413" elapsed="0.000313"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:08.922265" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:08.921906" elapsed="0.000433">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:08.855024" elapsed="0.067430">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:09.935694" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:09.935209" elapsed="0.000525"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:09.935810" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T01:00:09.936025" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:09.934718" elapsed="0.001337"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:09.945617" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:09.945199" elapsed="0.000489"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:09.946209" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:09.945902" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:09.957199" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:09.957305" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:09 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:09 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782809,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:09.957585" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:09.949246" elapsed="0.008377"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:09.946365" elapsed="0.011331"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:09.958016" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:09.957743" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:09.946336" elapsed="0.011788"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:09.963083" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782809,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:09.959513" elapsed="0.003643"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:09.959219" elapsed="0.003986"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:09.959194" elapsed="0.004045"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:09.967042" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:09.963637" elapsed="0.003464"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:09.963319" elapsed="0.003824"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:09.963296" elapsed="0.003878"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:09.967934" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:09.967427" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:09.968374" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:09.968057" elapsed="0.000389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:09.969300" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:09.968705" elapsed="0.000627"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:09.968476" elapsed="0.000902"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:09.968034" elapsed="0.001370"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:09.970079" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:09.969632" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:09.970483" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:09.970196" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:09.971425" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:09.970828" elapsed="0.000631"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:09.970623" elapsed="0.000878"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:09.970174" elapsed="0.001353"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:09.971748" elapsed="0.000586"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:09.973003" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:09.972565" elapsed="0.000473"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:09.973238" elapsed="0.012629"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:09.958655" elapsed="0.027287"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:09.986129" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T01:00:09.986017" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:09.985998" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:09.986378" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:09.986447" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:09.989140" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782809,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:09.936569" elapsed="0.052601"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:09.989224" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:09.989379" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782809,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:09.933970" elapsed="0.055523"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:09.990529" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782809, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:09.990125" elapsed="0.000674"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:09.990850" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:09.991009" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782809, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:09.989759" elapsed="0.001277"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:09.991403" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:09.991221" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:09.991930" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:09.991622" elapsed="0.000336"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:09.992427" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:09.992157" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:09.992992" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:09.992640" elapsed="0.000424">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:09.923486" elapsed="0.069690">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:11.008541" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:11.007728" elapsed="0.001162"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:11.009039" elapsed="0.000085"/>
</return>
<msg time="2026-04-10T01:00:11.009436" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:11.006845" elapsed="0.002652"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:11.016676" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:11.016382" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:11.017139" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:11.016888" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:11.023863" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:11.023923" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:11 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:11 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782811,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:11.024060" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:11.019418" elapsed="0.004672"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:11.017257" elapsed="0.006878"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:11.024321" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:11.024163" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:11.017237" elapsed="0.007170"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:11.028203" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782811,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:11.025471" elapsed="0.002783"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:11.025249" elapsed="0.003039"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:11.025231" elapsed="0.003083"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:11.032495" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:11.028615" elapsed="0.003975"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:11.028371" elapsed="0.004290"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:11.028354" elapsed="0.004354"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:11.033651" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:11.033038" elapsed="0.000653"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:11.034139" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:11.033797" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:11.035251" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:11.034495" elapsed="0.000797"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:11.034260" elapsed="0.001084"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:11.033769" elapsed="0.001610"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:11.036201" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:11.035671" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:11.036772" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:11.036340" elapsed="0.000516"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:11.037576" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:11.037058" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:11.036891" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:11.036315" elapsed="0.001349"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:11.037822" elapsed="0.000450"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:11.038826" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:11.038441" elapsed="0.000413"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:11.039015" elapsed="0.012893"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:11.024825" elapsed="0.027188"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:11.052245" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-10T01:00:11.052116" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:11.052088" 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-04-10T01:00:11.052918" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:11.052998" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:11.055449" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782811,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:11.010092" elapsed="0.045389"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:11.055536" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T01:00:11.055738" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782811,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:11.005694" elapsed="0.050072"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:11.057203" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782811, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:11.056442" elapsed="0.000791"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:11.057282" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:11.057445" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782811, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:11.056031" elapsed="0.001441"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:11.057861" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:11.057671" elapsed="0.000218"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:11.058389" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:11.058072" elapsed="0.000344"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:11.058959" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:11.058686" elapsed="0.000300"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:11.059524" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:11.059161" elapsed="0.000468">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:10.994048" elapsed="0.065699">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:12.069411" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:12.068873" elapsed="0.000584"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:12.069536" elapsed="0.000077"/>
</return>
<msg time="2026-04-10T01:00:12.069795" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:12.068333" elapsed="0.001500"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:12.079359" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:12.079088" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:12.079849" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:12.079590" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:12.087950" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:12.088048" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:12 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:12 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782812,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:12.088188" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:12.082151" elapsed="0.006075"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:12.079972" elapsed="0.008323"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:12.088648" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:12.088349" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:12.079951" elapsed="0.008831"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:12.094710" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782812,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:12.090381" elapsed="0.004407"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:12.090021" elapsed="0.004824"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:12.089986" elapsed="0.004898"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:12.099127" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:12.095322" elapsed="0.003859"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:12.094973" elapsed="0.004246"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:12.094944" elapsed="0.004300"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:12.099916" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:12.099440" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:12.100289" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:12.100032" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:12.101140" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:12.100575" elapsed="0.000597"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:12.100380" elapsed="0.000883"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:12.100012" elapsed="0.001282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:12.101897" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:12.101474" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:12.102263" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:12.102006" elapsed="0.000430"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:12.103189" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:12.102661" elapsed="0.000556"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:12.102465" elapsed="0.000791"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:12.101986" elapsed="0.001293"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:12.103440" elapsed="0.000481"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:12.104426" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:12.104092" elapsed="0.000361"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:12.104637" elapsed="0.014382"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:12.089348" elapsed="0.029757"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:12.119360" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T01:00:12.119205" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:12.119175" elapsed="0.000303"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:12.119841" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:12.119924" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T01:00:12.122673" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782812,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:12.070324" elapsed="0.052382"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:12.122763" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T01:00:12.122945" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782812,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:12.067652" elapsed="0.055326"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:12.124238" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782812, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:12.123726" elapsed="0.000543"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:12.124322" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:12.124509" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782812, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:12.123288" elapsed="0.001250"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:12.125010" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:12.124786" elapsed="0.000260"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:12.126021" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:12.125274" elapsed="0.000782"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:12.126581" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:12.126242" elapsed="0.000375"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:12.127269" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:12.126834" elapsed="0.000530">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:12.060434" elapsed="0.067074">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:13.139582" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:13.139067" elapsed="0.000560"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:13.139705" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T01:00:13.139934" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:13.138495" elapsed="0.001477"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:13.147499" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:13.147158" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:13.147977" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:13.147726" 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-04-10T01:00:13.155491" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:13.155571" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:13 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:13 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782813,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:13.155669" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:13.150320" elapsed="0.005376"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:13.148097" elapsed="0.007644"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:13.155925" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:13.155769" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:13.148076" elapsed="0.007940"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:13.162824" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782813,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:13.157077" elapsed="0.005820"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:13.156824" elapsed="0.006123"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:13.156806" elapsed="0.006177"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:13.166884" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:13.163380" elapsed="0.003552"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:13.163063" elapsed="0.003905"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:13.163039" elapsed="0.003954"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:13.167591" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:13.167173" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:13.167929" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:13.167691" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:13.168874" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:13.168327" elapsed="0.000584"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:13.168016" elapsed="0.000945"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:13.167672" elapsed="0.001316"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:13.169529" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:13.169155" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:13.169941" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:13.169673" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:13.170712" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:13.170186" elapsed="0.000553"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:13.170025" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:13.169655" elapsed="0.001142"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:13.170951" elapsed="0.000456"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:13.171927" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:13.171593" elapsed="0.000360"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:13.172112" elapsed="0.012750"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:13.156380" elapsed="0.028552"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:13.185159" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T01:00:13.185050" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:13.185030" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:13.185400" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:13.185471" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:13.188126" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782813,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:13.140460" elapsed="0.047696"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:13.188211" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:13.188367" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782813,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:13.137784" elapsed="0.050609"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:13.189394" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782813, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:13.188993" elapsed="0.000429"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:13.189472" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:13.189645" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782813, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:13.188637" elapsed="0.001036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:13.190079" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:13.189886" elapsed="0.000219"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:13.190838" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:13.190282" elapsed="0.000586"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:13.191314" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:13.191044" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:13.191875" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:13.191510" elapsed="0.000436">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:13.128505" elapsed="0.063552">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:14.204397" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:14.203848" elapsed="0.000598"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:14.204536" elapsed="0.000083"/>
</return>
<msg time="2026-04-10T01:00:14.204815" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:14.203257" elapsed="0.001595"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:14.213560" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:14.213210" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:14.214040" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:14.213787" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:14.221240" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:14.221303" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:14 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:14 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782814,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:14.221401" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:14.216393" elapsed="0.005036"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:14.214167" elapsed="0.007368"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:14.221749" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:14.221589" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:14.214144" elapsed="0.007693"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:14.225791" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782814,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:14.223004" elapsed="0.002838"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:14.222774" elapsed="0.003104"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:14.222718" elapsed="0.003186"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:14.229749" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:14.226216" elapsed="0.003599"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:14.225962" elapsed="0.003903"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:14.225945" elapsed="0.003954"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:14.230763" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:14.230144" elapsed="0.000658"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:14.231238" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:14.230903" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:14.232313" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:14.231604" elapsed="0.000748"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:14.231355" elapsed="0.001049"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:14.230877" elapsed="0.001557"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:14.233201" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:14.232683" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:14.233691" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:14.233338" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:14.234848" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:14.234041" elapsed="0.000846"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:14.233807" elapsed="0.001131"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:14.233313" elapsed="0.001655"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:14.235161" elapsed="0.000472"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:14.236141" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:14.235803" elapsed="0.000365"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:14.236328" elapsed="0.013063"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:14.222240" elapsed="0.027221"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:14.249785" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T01:00:14.249537" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:14.249517" elapsed="0.000366"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:14.250038" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:14.250113" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:14.252557" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782814,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:14.205372" elapsed="0.047215"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:14.252641" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:14.252797" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782814,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:14.202320" elapsed="0.050504"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:14.254080" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782814, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:14.253442" elapsed="0.000668"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:14.254159" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:14.254318" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782814, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:14.253091" elapsed="0.001254"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:14.254833" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:14.254641" elapsed="0.000218"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:14.255350" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:14.255043" elapsed="0.000334"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:14.255835" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:14.255567" elapsed="0.000294"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:14.256380" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:14.256034" elapsed="0.000415">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:14.193055" elapsed="0.063519">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:15.269352" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:15.268938" elapsed="0.000451"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:15.269454" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T01:00:15.269665" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:15.268488" elapsed="0.001207"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:15.276677" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:15.276398" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:15.277134" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:15.276884" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:15.283968" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:15.284028" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:15 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:15 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782815,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:15.284123" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:15.279456" elapsed="0.004694"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:15.277254" elapsed="0.006939"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:15.284378" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:15.284221" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:15.277234" elapsed="0.007230"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:15.288404" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782815,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:15.285523" elapsed="0.002933"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:15.285296" elapsed="0.003196"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:15.285264" elapsed="0.003252"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:15.291912" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:15.288827" elapsed="0.003170"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:15.288598" elapsed="0.003451"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:15.288580" elapsed="0.003505"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:15.293073" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:15.292346" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:15.293616" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:15.293228" elapsed="0.000478"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:15.294873" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:15.294000" elapsed="0.000916"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:15.293742" elapsed="0.001230"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:15.293200" elapsed="0.001813"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:15.295848" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:15.295267" elapsed="0.000623"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:15.296372" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:15.296000" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:15.297605" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:15.296801" elapsed="0.000846"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:15.296499" elapsed="0.001205"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:15.295972" elapsed="0.001765"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:15.297971" elapsed="0.000721"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:15.299471" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:15.298975" elapsed="0.000537"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:15.299779" elapsed="0.014704"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:15.284856" elapsed="0.029718"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:15.314800" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T01:00:15.314650" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:15.314631" elapsed="0.000313"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:15.315100" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:15.315173" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:15.317759" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782815,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:15.270092" elapsed="0.047697"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:15.317843" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:15.318000" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782815,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:15.267958" elapsed="0.050069"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:15.319081" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782815, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:15.318649" elapsed="0.000463"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:15.319162" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:15.319325" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782815, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:15.318258" elapsed="0.001095"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:15.319754" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:15.319563" elapsed="0.000219"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:15.320335" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:15.319962" elapsed="0.000400"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:15.321139" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:15.320805" elapsed="0.000362"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:15.321753" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:15.321350" elapsed="0.000477">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:15.257511" elapsed="0.064429">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:16.334109" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:16.333601" elapsed="0.000553"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:16.334234" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T01:00:16.334468" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:16.333056" elapsed="0.001446"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:16.343787" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:16.343497" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:16.344261" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:16.344000" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:16.355693" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:16.355781" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:16 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:16 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782816,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:16.355965" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:16.346615" elapsed="0.009397"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:16.344390" elapsed="0.011695"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:16.356367" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:16.356128" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:16.344367" elapsed="0.012129"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:16.362140" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782816,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:16.358056" elapsed="0.004158"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:16.357729" elapsed="0.004537"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:16.357702" elapsed="0.004600"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:16.366225" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:16.362732" elapsed="0.003542"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:16.362383" elapsed="0.003926"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:16.362359" elapsed="0.003975"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:16.366948" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:16.366523" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:16.367288" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:16.367048" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:16.368080" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:16.367535" elapsed="0.000574"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:16.367371" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:16.367029" elapsed="0.001139"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:16.368741" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:16.368332" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:16.369118" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:16.368876" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:16.370000" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:16.369443" elapsed="0.000586"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:16.369272" elapsed="0.000795"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:16.368857" elapsed="0.001233"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:16.370251" elapsed="0.000486"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:16.371244" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:16.370909" elapsed="0.000362"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:16.371431" elapsed="0.013422"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:16.357090" elapsed="0.027836"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:16.385117" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T01:00:16.385000" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:16.384980" elapsed="0.000235"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:16.385372" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:16.385445" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:16.388055" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782816,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:16.335011" elapsed="0.053075"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:16.388144" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:16.388300" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782816,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:16.332277" elapsed="0.056049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:16.389361" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782816, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:16.388958" elapsed="0.000432"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:16.389440" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:16.389834" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782816, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:16.388574" elapsed="0.001288"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:16.390227" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:16.390043" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:16.390758" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:16.390433" elapsed="0.000352"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:16.391227" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:16.390959" elapsed="0.000294"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:16.391796" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:16.391427" elapsed="0.000440">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:16.322865" elapsed="0.069113">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:17.404717" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:17.404191" elapsed="0.000572"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:17.404842" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T01:00:17.405081" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:17.403656" elapsed="0.001463"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:17.414378" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:17.414118" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:17.414962" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:17.414710" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:17.423180" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:17.423251" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:17 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782817,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:17.423364" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:17.417286" elapsed="0.006106"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:17.415102" elapsed="0.008339"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:17.423679" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:17.423473" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:17.415081" elapsed="0.008689"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:17.427705" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782817,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:17.424892" elapsed="0.002866"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:17.424656" elapsed="0.003137"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:17.424636" elapsed="0.003182"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:17.434486" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:17.428099" elapsed="0.006506"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:17.427875" elapsed="0.006790"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:17.427858" elapsed="0.006850"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:17.435675" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:17.435010" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:17.436252" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:17.435851" elapsed="0.000492"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:17.437503" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:17.436664" elapsed="0.000909"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:17.436380" elapsed="0.001251"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:17.435805" elapsed="0.001857"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:17.438475" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:17.437906" elapsed="0.000610"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:17.439067" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:17.438679" elapsed="0.000475"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:17.440209" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:17.439432" elapsed="0.000874"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:17.439190" elapsed="0.001177"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:17.438651" elapsed="0.001748"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:17.440675" elapsed="0.000674"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:17.442102" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:17.441628" elapsed="0.000513"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:17.442376" elapsed="0.014143"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:17.424171" elapsed="0.032464"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:17.456909" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T01:00:17.456789" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:17.456765" 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-04-10T01:00:17.457177" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:17.457250" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:17.459909" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782817,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:17.405654" elapsed="0.054286"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:17.459996" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:17.460153" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782817,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:17.402876" elapsed="0.057305"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:17.461254" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782817, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:17.460829" elapsed="0.000454"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:17.461333" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:17.461490" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782817, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:17.460423" elapsed="0.001094"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:17.462136" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:17.461948" elapsed="0.000214"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:17.462664" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:17.462339" elapsed="0.000351"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:17.463165" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:17.462863" elapsed="0.000332"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:17.463744" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:17.463368" elapsed="0.000448">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:17.392870" elapsed="0.071061">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:18.475839" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:18.475314" elapsed="0.000569"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:18.475966" elapsed="0.000065"/>
</return>
<msg time="2026-04-10T01:00:18.476222" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:18.474757" elapsed="0.001503"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:18.485503" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:18.485186" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:18.485991" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:18.485742" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:18.492509" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:18.492594" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:18 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782818,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:18.492695" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:18.488332" elapsed="0.004390"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:18.486111" elapsed="0.006714"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:18.493018" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:18.492857" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:18.486090" elapsed="0.007016"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:18.497015" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782818,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:18.494203" elapsed="0.002863"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:18.493969" elapsed="0.003132"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:18.493950" elapsed="0.003175"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:18.500199" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:18.497408" elapsed="0.002842"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:18.497183" elapsed="0.003101"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:18.497165" elapsed="0.003144"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:18.500940" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:18.500491" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:18.501288" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:18.501043" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:18.502164" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:18.501642" elapsed="0.000550"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:18.501374" elapsed="0.000855"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:18.501024" elapsed="0.001227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:18.502798" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:18.502414" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:18.503129" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:18.502895" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:18.503901" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:18.503370" elapsed="0.000558"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:18.503212" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:18.502877" elapsed="0.001108"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:18.504140" elapsed="0.000490"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:18.505124" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:18.504798" elapsed="0.000352"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:18.505307" elapsed="0.014649"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:18.493515" elapsed="0.026533"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:18.520302" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T01:00:18.520149" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:18.520122" elapsed="0.000307"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:18.520663" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:18.520766" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T01:00:18.524184" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782818,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:18.476771" elapsed="0.047454"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:18.524298" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T01:00:18.524510" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782818,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:18.474007" elapsed="0.050558"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:18.526053" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782818, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:18.525473" elapsed="0.000620"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:18.526161" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:00:18.526351" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782818, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:18.524950" elapsed="0.001427"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:18.526921" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:18.526735" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:18.527427" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:18.527123" elapsed="0.000331"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:18.527913" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:18.527648" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:18.528459" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:18.528110" elapsed="0.000421">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:18.464961" elapsed="0.063697">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:19.539619" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:19.539094" elapsed="0.000569"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:19.539741" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T01:00:19.539978" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:19.538590" elapsed="0.001457"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:19.548411" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:19.548140" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:19.548882" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:19.548633" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:19.557840" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:19.557904" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:19 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782819,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:19.558003" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:19.551137" elapsed="0.006892"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:19.549001" elapsed="0.009073"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:19.558266" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:19.558103" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:19.548980" elapsed="0.009372"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:19.562485" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782819,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:19.559448" elapsed="0.003089"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:19.559200" elapsed="0.003388"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:19.559181" elapsed="0.003433"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:19.566382" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:19.562902" elapsed="0.003547"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:19.562672" elapsed="0.003829"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:19.562655" elapsed="0.003880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:19.567359" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:19.566805" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:19.567999" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:19.567605" elapsed="0.000481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:19.569140" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:19.568353" elapsed="0.000827"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:19.568121" elapsed="0.001109"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:19.567568" elapsed="0.001693"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:19.570037" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:19.569488" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:19.570501" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:19.570173" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:19.571619" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:19.570868" elapsed="0.000794"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:19.570640" elapsed="0.001072"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:19.570148" elapsed="0.001594"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:19.571990" elapsed="0.000689"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:19.573376" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:19.572917" elapsed="0.000496"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:19.573656" elapsed="0.013585"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:19.558758" elapsed="0.028552"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:19.587495" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T01:00:19.587385" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:19.587366" elapsed="0.000241"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:19.587761" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:19.587833" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:19.590409" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782819,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:19.540586" elapsed="0.049851"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:19.590491" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:19.590661" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782819,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:19.537899" elapsed="0.052789"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:19.591684" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782819, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:19.591269" elapsed="0.000444"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:19.591761" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:19.591917" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782819, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:19.590919" elapsed="0.001041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:19.592329" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:19.592142" elapsed="0.000213"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:19.593032" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:19.592530" elapsed="0.000530"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:19.593501" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:19.593236" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:19.594156" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:19.593796" elapsed="0.000431">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:19.529533" elapsed="0.064803">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.606041" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:20.605508" elapsed="0.000578"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:20.606169" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T01:00:20.606416" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:20.604980" elapsed="0.001473"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.615000" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.614736" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.615523" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.615209" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:20.623260" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:20.623327" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:20 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782820,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:20.623422" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:20.617821" elapsed="0.005627"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.615686" elapsed="0.007805"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:20.623703" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:20.623519" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.615664" elapsed="0.008129"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.627658" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782820,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.624837" elapsed="0.002874"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.624607" elapsed="0.003139"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.624589" elapsed="0.003183"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.630999" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.628059" elapsed="0.002991"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.627831" elapsed="0.003256"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.627813" elapsed="0.003299"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.631931" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:20.631312" elapsed="0.000658"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:20.632411" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:20.632075" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.633640" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:20.632805" elapsed="0.000876"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.632527" elapsed="0.001207"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.632049" elapsed="0.001716"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.634512" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:20.633994" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:20.635105" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:20.634732" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.636254" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:20.635479" elapsed="0.000896"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.635228" elapsed="0.001226"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.634699" elapsed="0.001796"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:20.636779" elapsed="0.000645"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:20.638223" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:20.637687" elapsed="0.000577"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:20.638491" elapsed="0.014727"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:20.624168" elapsed="0.029124"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:20.653485" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T01:00:20.653372" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.653351" 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-04-10T01:00:20.653761" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:20.653836" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:20.656251" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782820,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:20.607020" elapsed="0.049263"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:20.656339" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:20.656496" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782820,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:20.604225" elapsed="0.052297"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.657737" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782820, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:20.657157" elapsed="0.000613"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:20.657820" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T01:00:20.658032" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782820, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:20.656800" elapsed="0.001260"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:20.658431" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:20.658246" elapsed="0.000213"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.658993" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:20.658677" elapsed="0.000342"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.659463" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:20.659197" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T01:00:20.659695" elapsed="0.000322"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T01:00:20.595295" elapsed="0.064787"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T01:00:07.782205" elapsed="12.877932"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:07.781418" elapsed="12.878789"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:00:07.776609" elapsed="12.883634"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:00:07.776447" elapsed="12.883833"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.673771" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:20.673405" elapsed="0.000397"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:20.673855" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T01:00:20.674100" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:20.673040" elapsed="0.001088"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.681013" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.680747" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.681465" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.681220" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:20.691969" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:20.692030" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:20 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782820,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:20.692139" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:20.683734" elapsed="0.008431"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.681598" elapsed="0.010610"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:20.692395" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:20.692236" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.681576" elapsed="0.010903"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.696441" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782820,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.693535" elapsed="0.002979"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.693309" elapsed="0.003276"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.693290" elapsed="0.003333"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.700856" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.697095" elapsed="0.003830"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.696705" elapsed="0.004271"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.696681" elapsed="0.004331"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.701860" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:20.701270" elapsed="0.000630"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:20.702364" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:20.702004" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.703222" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:20.702766" elapsed="0.000496"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.702484" elapsed="0.000836"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.701978" elapsed="0.001374"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.704148" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:20.703609" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:20.704653" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:20.704297" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.705409" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:20.704995" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.704768" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.704266" elapsed="0.001260"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:20.705764" elapsed="0.000489"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:20.707004" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:20.706488" elapsed="0.000562"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:20.707297" elapsed="0.003795"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:20.692880" elapsed="0.018305"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:20.711433" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T01:00:20.711284" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.711258" elapsed="0.000324"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:20.711794" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:20.711896" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T01:00:20.715230" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782820,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:20.674478" elapsed="0.040792"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:20.715353" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:00:20.715598" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782820,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:20.672414" elapsed="0.043224"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T01:00:20.715708" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T01:00:20.715919" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782820,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T01:00:20.666016" elapsed="0.049942"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.717406" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 9000, 'timestamp': 1775782820, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:20.716822" elapsed="0.000626"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:20.717520" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T01:00:20.717772" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 9000, 'timestamp': 1775782820, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:20.716287" elapsed="0.001524"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:20.718345" level="INFO">${value} = 9000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:20.718076" elapsed="0.000307"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.719133" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T01:00:20.718708" elapsed="0.000507"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 9000.</doc>
<status status="PASS" start="2026-04-10T01:00:20.665555" elapsed="0.053742"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:00:20.660487" elapsed="0.058849"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:00:20.660342" elapsed="0.059031"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_del_ten_percent}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T01:00:07.704746" elapsed="13.014685"/>
</kw>
<kw name="Add Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Add Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.730311" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:20.730012" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:20.730381" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:20.730724" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:20.729662" elapsed="0.001086"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.745303" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.745045" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.745773" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.745511" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.746223" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.745978" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.746766" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.746485" elapsed="0.000358"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:20.747683" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T01:00:20.747470" elapsed="0.000239"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T01:00:20.748036" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T01:00:20.747865" elapsed="0.000196"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T01:00:20.748212" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.748928" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.748676" elapsed="0.000297"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T01:00:20.749016" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:20.749172" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T01:00:20.747056" elapsed="0.002141"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:20.762927" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Content-Length': '401', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T01:00:20.762977" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:20.763067" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:20.751463" elapsed="0.011630"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.749270" elapsed="0.013869"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:20.763392" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:20.763167" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.749252" elapsed="0.014371"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.771566" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.765934" elapsed="0.005734"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.765412" elapsed="0.006332"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.765373" elapsed="0.006427"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.776676" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.772423" elapsed="0.004305"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.771925" elapsed="0.004839"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.771888" elapsed="0.004901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.777373" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:20.776977" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:20.777731" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:20.777472" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.778395" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:20.778085" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.777814" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.777454" elapsed="0.001048"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.779052" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:20.778685" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:20.779392" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:20.779150" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.779950" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:20.779654" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.779474" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.779132" elapsed="0.000966"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:20.780258" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:20.781084" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:20.780796" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:20.781269" elapsed="0.002690"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:20.764417" elapsed="0.019609"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:00:20.784208" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:00:20.784100" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.784081" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:00:20.786958" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:00:20.784428" elapsed="0.002557"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:00:20.787035" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T01:00:20.787198" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:20.741921" elapsed="0.045302"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:20.787291" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:00:20.787441" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T01:00:20.739101" elapsed="0.048364"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:20.787518" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T01:00:20.787683" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:20.729206" elapsed="0.058501"/>
</kw>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Add Bulk Flow in member 1 according to ${json_body_add}.</doc>
<status status="PASS" start="2026-04-10T01:00:20.724591" elapsed="0.063181"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.794804" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:20.794484" elapsed="0.000347"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:20.794877" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:20.795025" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:20.794104" elapsed="0.000946"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.802028" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.801771" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.802497" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.802232" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:20.809765" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:20.809824" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:20 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782820,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:20.809918" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:20.804781" elapsed="0.005163"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.802626" elapsed="0.007430"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:20.810243" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:20.810086" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.802606" elapsed="0.007731"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.814243" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782820,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.811406" elapsed="0.002887"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.811178" elapsed="0.003151"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.811159" elapsed="0.003196"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.817227" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:20.814675" elapsed="0.002600"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.814431" elapsed="0.002882"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.814396" elapsed="0.002944"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.817928" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:20.817518" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:20.818266" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:20.818027" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.818874" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:20.818569" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.818349" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.818009" elapsed="0.000951"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.819614" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:20.819122" elapsed="0.000533"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:20.820107" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:20.819758" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.820928" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:20.820468" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:20.820228" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.819732" elapsed="0.001322"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:20.821280" elapsed="0.000528"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:20.822490" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:20.822054" elapsed="0.000475"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:20.822787" elapsed="0.003858"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:20.810743" elapsed="0.015998"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:20.827005" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T01:00:20.826847" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:20.826819" 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-04-10T01:00:20.827361" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:20.827468" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T01:00:20.831181" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782820,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:20.795387" elapsed="0.035836"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:20.831293" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:20.831447" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782820,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:20.793655" elapsed="0.037818"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.832527" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782820, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:20.832129" elapsed="0.000445"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:20.832624" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:20.832779" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782820, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:20.831779" elapsed="0.001026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:20.833164" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:20.832984" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.833687" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:20.833365" elapsed="0.000349"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.834151" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:20.833887" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:20.834738" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:20.834349" elapsed="0.000462">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:20.789013" elapsed="0.045906">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.847882" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:21.847481" elapsed="0.000434"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:21.847976" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T01:00:21.848150" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:21.847109" elapsed="0.001067"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.855193" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:21.854925" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.855829" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:21.855405" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:21.862539" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:21.862620" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:21 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782821,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:21.862718" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:21.858151" elapsed="0.004594"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:21.855953" elapsed="0.006836"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:21.862977" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:21.862818" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:21.855932" elapsed="0.007132"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.866885" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782821,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:21.864118" elapsed="0.002837"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:21.863889" elapsed="0.003116"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:21.863871" elapsed="0.003168"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.870961" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:21.867435" elapsed="0.003593"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:21.867120" elapsed="0.003956"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:21.867096" elapsed="0.004015"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.872092" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:21.871500" elapsed="0.000630"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:21.872589" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:21.872231" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.873390" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:21.872937" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:21.872707" elapsed="0.000771"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:21.872205" elapsed="0.001304"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.874272" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:21.873758" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:21.874764" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:21.874410" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.875531" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:21.875107" elapsed="0.000487"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:21.874881" elapsed="0.000764"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:21.874384" elapsed="0.001291"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:21.875892" elapsed="0.000496"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:21.877055" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:21.876646" elapsed="0.000447"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:21.877355" elapsed="0.002924"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:21.863441" elapsed="0.016906"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:21.880528" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-10T01:00:21.880420" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:21.880401" elapsed="0.000234"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:21.880787" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:21.880858" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:21.883259" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782821,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:21.848536" elapsed="0.034753"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:21.883343" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:21.883497" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782821,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:21.846594" elapsed="0.036928"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.884508" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782821, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:21.884109" elapsed="0.000427"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:21.884601" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:21.884759" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782821, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:21.883767" elapsed="0.001018"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:21.885272" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:21.884963" elapsed="0.000337"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.886002" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:21.885694" elapsed="0.000337"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.886530" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:21.886258" elapsed="0.000315"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T01:00:21.886749" elapsed="0.000318"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T01:00:21.835694" elapsed="0.051435"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T01:00:20.788413" elapsed="1.098767"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 1.</doc>
<status status="PASS" start="2026-04-10T01:00:20.788001" elapsed="1.099244"/>
</kw>
<arg>${temp_json_config_add_ten_percent}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Add Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T01:00:20.724093" elapsed="1.163208"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.897638" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T01:00:21.897238" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.898122" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T01:00:21.897826" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T01:00:21.898193" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:21.898348" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T01:00:21.896833" elapsed="0.001540"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.909046" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:21.908739" elapsed="0.000334"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:21.909121" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:21.909296" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:21.908375" elapsed="0.000946"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.923768" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:21.923492" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.924213" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:21.923972" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.924678" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:21.924413" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.925118" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:21.924877" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:21.926002" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T01:00:21.925804" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T01:00:21.926352" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T01:00:21.926183" elapsed="0.000193"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T01:00:21.926525" elapsed="0.000210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.927139" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:21.926893" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T01:00:21.927223" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:21.927377" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T01:00:21.925384" elapsed="0.002017"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:21.939696" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T01:00:21.939835" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:21.939931" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:21.929662" elapsed="0.010295"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:21.927476" elapsed="0.012527"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:21.940187" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:21.940031" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:21.927457" elapsed="0.012819"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.946022" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:21.941370" elapsed="0.004751"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:21.941101" elapsed="0.005097"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:21.941083" elapsed="0.005171"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.952376" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:21.946917" elapsed="0.005562"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:21.946384" elapsed="0.006201"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:21.946345" elapsed="0.006296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.953952" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:21.953015" elapsed="0.000998"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:21.954534" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:21.954179" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.955100" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:21.954800" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:21.954635" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:21.954130" elapsed="0.001053"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.955722" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:21.955341" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:21.956051" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:21.955818" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.956601" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:21.956290" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:21.956131" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:21.955801" elapsed="0.000882"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:21.956837" elapsed="0.000375"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:21.957675" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:21.957380" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:21.957857" elapsed="0.002470"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:21.940658" elapsed="0.019734"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:00:21.960590" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:00:21.960465" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:21.960447" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:00:21.963591" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:00:21.960807" elapsed="0.002812"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:00:21.963668" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T01:00:21.963837" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:21.920638" elapsed="0.043225"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:21.963973" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:21.964131" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T01:00:21.917970" elapsed="0.046186"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:21.964208" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T01:00:21.964356" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:21.907921" elapsed="0.056459"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T01:00:21.903301" elapsed="0.061142"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:00:21.898585" elapsed="0.065893"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:00:21.898433" elapsed="0.066079"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.976442" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:21.976130" elapsed="0.000341"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:21.976521" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T01:00:21.976702" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:21.975777" elapsed="0.000950"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.983844" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:21.983571" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.984303" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:21.984056" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:21.991940" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:21.992003" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:21 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782821,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:21.992107" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:21.986619" elapsed="0.005514"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:21.984423" elapsed="0.007757"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:21.992380" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:21.992211" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:21.984401" elapsed="0.008066"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:21.996768" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782821,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:21.993622" elapsed="0.003198"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:21.993365" elapsed="0.003491"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:21.993346" elapsed="0.003534"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:22.000947" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:21.997200" elapsed="0.003813"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:21.996937" elapsed="0.004126"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:21.996920" elapsed="0.004177"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:22.001974" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:22.001379" elapsed="0.000633"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:22.002451" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:22.002112" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:22.003538" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:22.002830" elapsed="0.000767"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:22.002592" elapsed="0.001145"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:22.002086" elapsed="0.001683"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:22.004523" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:22.004003" elapsed="0.000580"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:22.005022" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:22.004686" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:22.005942" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:22.005395" elapsed="0.000575"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:22.005178" elapsed="0.000829"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:22.004660" elapsed="0.001369"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:22.006190" elapsed="0.000477"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:22.007171" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:22.006839" elapsed="0.000359"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:22.007360" elapsed="0.013042"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:21.992891" elapsed="0.027619"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:22.020771" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-10T01:00:22.020639" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:22.020609" elapsed="0.000271"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:22.021122" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:22.021199" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:22.023849" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782821,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:21.977068" elapsed="0.046813"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:22.023937" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:22.024094" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782821,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:21.975287" elapsed="0.048834"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:22.025919" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782821, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:22.025001" elapsed="0.000951"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:22.026007" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T01:00:22.026172" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782821, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:22.024381" elapsed="0.001818"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:22.026590" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:22.026387" elapsed="0.000230"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:22.027109" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:22.026798" elapsed="0.000339"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:22.027597" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:22.027314" elapsed="0.000309"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:22.028159" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:22.027801" elapsed="0.000430">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:21.970663" elapsed="0.057681">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:23.044719" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:23.044217" elapsed="0.000536"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:23.044813" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T01:00:23.044993" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:23.043230" elapsed="0.001790"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:23.051975" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:23.051697" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:23.052530" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:23.052253" elapsed="0.000344"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:23.059668" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:23.059728" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:23 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:23 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782823,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:23.059825" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:23.054842" elapsed="0.005011"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:23.052690" elapsed="0.007207"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:23.060133" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:23.059925" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:23.052666" elapsed="0.007560"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:23.064517" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782823,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:23.061294" elapsed="0.003311"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:23.061061" elapsed="0.003583"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:23.061043" elapsed="0.003627"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:23.067767" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:23.064984" elapsed="0.002831"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:23.064732" elapsed="0.003119"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:23.064713" elapsed="0.003162"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:23.068737" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:23.068111" elapsed="0.000668"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:23.069225" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:23.068881" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:23.070330" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:23.069597" elapsed="0.000772"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:23.069340" elapsed="0.001087"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:23.068855" elapsed="0.001602"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:23.071233" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:23.070708" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:23.071729" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:23.071372" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:23.072953" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:23.072109" elapsed="0.000895"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:23.071848" elapsed="0.001221"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:23.071347" elapsed="0.001754"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:23.073356" elapsed="0.000784"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:23.074947" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:23.074463" elapsed="0.000523"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:23.075209" elapsed="0.014855"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:23.060624" elapsed="0.029514"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:23.090328" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T01:00:23.090213" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:23.090195" elapsed="0.000229"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:23.090599" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:23.090673" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T01:00:23.093318" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782823,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:23.045378" elapsed="0.047971"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:23.093405" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:23.093580" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782823,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:23.041873" elapsed="0.051736"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:23.094705" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782823, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:23.094246" elapsed="0.000495"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:23.094804" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:23.094985" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782823, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:23.093875" elapsed="0.001140"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:23.095413" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:23.095225" elapsed="0.000214"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:23.096129" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:23.095642" elapsed="0.000516"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:23.096857" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:23.096335" elapsed="0.000547"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:23.097420" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:23.097063" elapsed="0.000432">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:23.029327" elapsed="0.068299">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:24.112041" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:24.111473" elapsed="0.000612"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:24.112166" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T01:00:24.112416" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:24.110923" elapsed="0.001539"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:24.120722" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:24.120418" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:24.121183" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:24.120935" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:24.131276" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:24.131423" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:24 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:24 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782824,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:24.131571" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:24.123561" elapsed="0.008040"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:24.121303" elapsed="0.010344"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:24.131876" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:24.131676" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:24.121282" elapsed="0.010699"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:24.136260" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782824,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:24.133149" elapsed="0.003184"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:24.132913" elapsed="0.003473"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:24.132889" elapsed="0.003533"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:24.140753" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:24.136852" elapsed="0.003969"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:24.136507" elapsed="0.004373"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:24.136482" elapsed="0.004448"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:24.141776" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:24.141191" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:24.142279" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:24.141928" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:24.143454" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:24.142661" elapsed="0.000833"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:24.142398" elapsed="0.001191"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:24.141896" elapsed="0.001728"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:24.144396" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:24.143856" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:24.144901" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:24.144535" elapsed="0.000463"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:24.146014" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:24.145267" elapsed="0.000787"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:24.145032" elapsed="0.001073"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:24.144510" elapsed="0.001625"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:24.146354" elapsed="0.000672"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:24.147727" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:24.147328" elapsed="0.000427"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:24.147925" elapsed="0.013532"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:24.132410" elapsed="0.029148"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:24.161773" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T01:00:24.161651" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:24.161626" elapsed="0.000249"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:24.162060" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:24.162132" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:24.164614" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782824,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:24.113242" elapsed="0.051466"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:24.164766" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:24.164921" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782824,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:24.110175" elapsed="0.054772"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:24.166167" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782824, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:24.165732" elapsed="0.000464"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:24.166246" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:24.166402" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782824, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:24.165192" elapsed="0.001237"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:24.166812" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:24.166629" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:24.167367" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:24.167014" elapsed="0.000379"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:24.168111" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:24.167843" elapsed="0.000294"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:24.168681" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:24.168311" elapsed="0.000443">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:24.098721" elapsed="0.070147">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:25.181178" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:25.180594" elapsed="0.000630"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:25.181305" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T01:00:25.181541" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:25.180054" elapsed="0.001548"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:25.196085" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:25.195656" elapsed="0.000498"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:25.196612" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:25.196334" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:25.818741" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:25.818914" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:25 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:25 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782825,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:25.819182" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:25.199039" elapsed="0.620209"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:25.196746" elapsed="0.622640"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:25.819945" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:25.819471" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:25.196721" elapsed="0.623430"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:25.828245" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782825,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:25.822787" elapsed="0.005533"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:25.822202" elapsed="0.006253"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:25.822157" elapsed="0.006337"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:25.832857" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:25.828958" elapsed="0.003969"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:25.828624" elapsed="0.004354"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:25.828595" elapsed="0.004419"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:25.833899" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:25.833272" elapsed="0.000668"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:25.834384" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:25.834044" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:25.835507" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:25.834775" elapsed="0.000791"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:25.834502" elapsed="0.001120"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:25.834018" elapsed="0.001635"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:25.836424" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:25.835903" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:25.836958" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:25.836611" elapsed="0.000430"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:25.838159" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:25.837300" elapsed="0.000899"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:25.837075" elapsed="0.001176"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:25.836582" elapsed="0.001699"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:25.838501" elapsed="0.000481"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:25.839482" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:25.839151" elapsed="0.000357"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:25.839684" elapsed="0.013172"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:25.821079" elapsed="0.031883"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:25.853231" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-10T01:00:25.853066" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:25.853039" elapsed="0.000324"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:25.853606" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:25.853732" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:00:25.857513" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782825,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:25.182094" elapsed="0.675484"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:25.857655" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:00:25.857931" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782825,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:25.179323" elapsed="0.678646"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:25.859237" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782825, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:25.858797" elapsed="0.000475"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:25.859324" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:25.859484" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782825, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:25.858353" elapsed="0.001429"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:25.860164" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:25.859974" elapsed="0.000216"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:25.860739" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:25.860398" elapsed="0.000370"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:25.861239" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:25.860953" elapsed="0.000312"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:25.861896" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:25.861470" elapsed="0.000503">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:25.169646" elapsed="0.692447">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:26.875446" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:26.875064" elapsed="0.000417"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:26.875566" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T01:00:26.875744" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:26.874666" elapsed="0.001104"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:26.883048" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:26.882694" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:26.883532" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:26.883282" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:26.891675" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:26.891772" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:26 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:26 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782826,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:26.891914" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:26.885968" elapsed="0.005977"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:26.883681" elapsed="0.008325"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:26.892271" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:26.892044" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:26.883657" elapsed="0.008704"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:26.896575" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782826,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:26.893607" elapsed="0.003036"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:26.893334" elapsed="0.003353"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:26.893314" elapsed="0.003403"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:26.901606" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:26.897058" elapsed="0.004644"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:26.896790" elapsed="0.004975"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:26.896768" elapsed="0.005039"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:26.902797" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:26.902134" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:26.903321" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:26.902955" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:26.904476" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:26.903715" elapsed="0.000802"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:26.903443" elapsed="0.001286"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:26.902924" elapsed="0.001845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:26.905672" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:26.905019" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:26.906175" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:26.905821" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:26.907308" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:26.906539" elapsed="0.000810"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:26.906297" elapsed="0.001106"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:26.905793" elapsed="0.001642"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:26.907704" elapsed="0.000670"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:26.909181" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:26.908649" elapsed="0.000573"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:26.909460" elapsed="0.013074"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:26.892820" elapsed="0.029808"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:26.922813" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T01:00:26.922701" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:26.922682" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:26.923059" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:26.923130" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:26.925515" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782826,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:26.876142" elapsed="0.049574"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:26.925773" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:26.925929" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782826,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:26.873967" elapsed="0.051988"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:26.926972" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782826, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:26.926571" elapsed="0.000429"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:26.927050" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:26.927207" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782826, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:26.926197" elapsed="0.001036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:26.927614" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:26.927414" elapsed="0.000226"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:26.928123" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:26.927818" elapsed="0.000331"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:26.928608" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:26.928326" elapsed="0.000308"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:26.929194" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:26.928809" elapsed="0.000456">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:26.863009" elapsed="0.066368">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:27.941448" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:27.940957" elapsed="0.000660"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:27.941700" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T01:00:27.941934" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:27.940403" elapsed="0.001566"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:27.951437" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:27.951173" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:27.951912" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:27.951665" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:27.958803" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:27.958885" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:27 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782827,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:27.959016" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:27.954217" elapsed="0.004836"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:27.952030" elapsed="0.007084"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:27.959372" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:27.959154" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:27.952009" elapsed="0.007485"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:27.964914" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782827,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:27.960989" elapsed="0.003995"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:27.960675" elapsed="0.004358"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:27.960650" elapsed="0.004418"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:27.969330" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:27.965461" elapsed="0.003934"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:27.965147" elapsed="0.004297"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:27.965124" elapsed="0.004353"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:27.970101" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:27.969705" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:27.970436" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:27.970199" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:27.971196" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:27.970693" elapsed="0.000530"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:27.970517" elapsed="0.000742"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:27.970181" elapsed="0.001100"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:27.971822" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:27.971441" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:27.972151" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:27.971919" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:27.972969" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:27.972394" elapsed="0.000602"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:27.972234" elapsed="0.000799"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:27.971901" elapsed="0.001153"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:27.973209" elapsed="0.000471"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:27.974174" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:27.973848" elapsed="0.000389"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:27.974399" elapsed="0.012646"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:27.960031" elapsed="0.027086"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:27.987306" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T01:00:27.987195" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:27.987174" elapsed="0.000241"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:27.987602" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:27.987677" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:27.990361" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782827,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:27.942461" elapsed="0.047931"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:27.990447" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:27.990622" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782827,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:27.939726" elapsed="0.050922"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:27.991690" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782827, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:27.991252" elapsed="0.000467"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:27.991768" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:27.991925" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782827, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:27.990882" elapsed="0.001069"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:27.992317" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:27.992133" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:27.993214" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:27.992902" elapsed="0.000339"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:27.993701" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:27.993420" elapsed="0.000306"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:27.994255" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:27.993901" elapsed="0.000426">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:27.930317" elapsed="0.064118">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:29.006711" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:29.006325" elapsed="0.000420"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:29.006803" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T01:00:29.006971" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:29.005945" elapsed="0.001052"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:29.013979" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:29.013673" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:29.014508" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:29.014262" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:29.023578" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:29.023787" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:29 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782829,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:29.023998" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:29.016853" elapsed="0.007187"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:29.014662" elapsed="0.009458"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:29.024459" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:29.024171" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:29.014637" elapsed="0.009976"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:29.030501" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782829,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:29.026256" elapsed="0.004355"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:29.025906" elapsed="0.004764"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:29.025877" elapsed="0.004832"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:29.035583" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:29.031157" elapsed="0.004507"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:29.030801" elapsed="0.004920"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:29.030774" elapsed="0.004986"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:29.036716" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:29.036092" elapsed="0.000665"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:29.037229" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:29.036869" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:29.038375" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:29.037616" elapsed="0.000799"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:29.037351" elapsed="0.001118"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:29.036840" elapsed="0.001661"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:29.039311" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:29.038765" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:29.039859" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:29.039456" elapsed="0.000507"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:29.041014" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:29.040240" elapsed="0.000815"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:29.039999" elapsed="0.001110"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:29.039429" elapsed="0.001712"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:29.041379" elapsed="0.000686"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:29.042811" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:29.042316" elapsed="0.000535"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:29.043083" elapsed="0.013963"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:29.025202" elapsed="0.031953"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:29.057390" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T01:00:29.057261" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:29.057232" 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-04-10T01:00:29.057718" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:29.057794" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:29.060600" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782829,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:29.007350" elapsed="0.053360"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:29.060771" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:29.060935" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782829,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:29.005358" elapsed="0.055604"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:29.062122" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782829, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:29.061656" elapsed="0.000495"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:29.062201" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:29.062359" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782829, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:29.061225" elapsed="0.001161"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:29.062768" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:29.062584" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:29.063280" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:29.062973" elapsed="0.000333"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:29.064128" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:29.063480" elapsed="0.000675"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:29.064703" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:29.064330" elapsed="0.000443">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:28.995330" elapsed="0.069556">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:30.076890" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:30.076363" elapsed="0.000571"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:30.077014" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T01:00:30.077243" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:30.075860" elapsed="0.001419"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:30.086525" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:30.086259" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:30.087003" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:30.086751" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:30.096159" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:30.096246" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:30 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782830,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:30.096383" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:30.089315" elapsed="0.007104"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:30.087123" elapsed="0.009359"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:30.096770" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:30.096520" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:30.087102" elapsed="0.009789"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:30.102267" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782830,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:30.098352" elapsed="0.003991"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:30.098035" elapsed="0.004444"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:30.098009" elapsed="0.004509"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:30.106886" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:30.102963" elapsed="0.003998"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:30.102628" elapsed="0.004387"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:30.102602" elapsed="0.004450"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:30.107950" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:30.107333" elapsed="0.000656"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:30.108436" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:30.108095" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:30.109529" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:30.108806" elapsed="0.000817"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:30.108574" elapsed="0.001101"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:30.108069" elapsed="0.001636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:30.110628" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:30.109931" elapsed="0.000739"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:30.111109" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:30.110775" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:30.112208" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:30.111449" elapsed="0.000798"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:30.111223" elapsed="0.001074"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:30.110749" elapsed="0.001578"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:30.112575" elapsed="0.000684"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:30.114040" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:30.113509" elapsed="0.000571"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:30.114316" elapsed="0.014395"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:30.097409" elapsed="0.031403"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:30.129042" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T01:00:30.128914" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:30.128886" elapsed="0.000258"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:30.129338" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:30.129412" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:30.132095" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782830,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:30.077781" elapsed="0.054345"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:30.132180" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:30.132337" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782830,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:30.075120" elapsed="0.057244"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:30.133478" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782830, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:30.133030" elapsed="0.000477"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:30.133571" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:30.133730" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782830, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:30.132630" elapsed="0.001192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:30.134196" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:30.134010" elapsed="0.000212"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:30.134915" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:30.134403" elapsed="0.000540"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:30.135434" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:30.135156" elapsed="0.000304"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:30.136042" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:30.135685" elapsed="0.000431">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:30.065872" elapsed="0.070385">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:31.149585" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:31.149189" elapsed="0.000432"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:31.149686" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T01:00:31.149871" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:31.148820" elapsed="0.001077"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:31.156875" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:31.156600" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:31.157339" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:31.157089" 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-04-10T01:00:31.164370" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:31.164430" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:31 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:31 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782831,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:31.164526" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:31.159634" elapsed="0.004942"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:31.157459" elapsed="0.007162"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:31.164807" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:31.164649" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:31.157438" elapsed="0.007455"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:31.169412" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782831,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:31.165945" elapsed="0.003543"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:31.165717" elapsed="0.003851"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:31.165696" elapsed="0.003914"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:31.174224" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:31.170035" elapsed="0.004262"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:31.169697" elapsed="0.004652"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:31.169671" elapsed="0.004715"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:31.175276" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:31.174672" elapsed="0.000644"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:31.175844" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:31.175423" elapsed="0.000562"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:31.177190" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:31.176351" elapsed="0.000880"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:31.176040" elapsed="0.001324"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:31.175396" elapsed="0.002006"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:31.178251" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:31.177689" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:31.178775" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:31.178401" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:31.179884" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:31.179198" elapsed="0.000715"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:31.178899" elapsed="0.001051"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:31.178373" elapsed="0.001599"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:31.180140" elapsed="0.000507"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:31.181151" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:31.180817" elapsed="0.000360"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:31.181334" elapsed="0.012995"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:31.165265" elapsed="0.029140"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:31.194612" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T01:00:31.194482" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:31.194462" 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-04-10T01:00:31.194869" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:31.194941" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T01:00:31.197624" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782831,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:31.150250" elapsed="0.047404"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:31.197709" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:31.197866" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782831,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:31.148303" elapsed="0.049590"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:31.198918" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782831, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:31.198495" elapsed="0.000452"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:31.198997" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:31.199182" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782831, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:31.198136" elapsed="0.001073"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:31.199593" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:31.199392" elapsed="0.000228"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:31.200111" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:31.199800" elapsed="0.000339"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:31.200643" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:31.200314" elapsed="0.000356"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:31.201235" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:31.200878" elapsed="0.000431">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:31.137271" elapsed="0.064151">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:32.214505" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:32.214096" elapsed="0.000532"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:32.214691" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T01:00:32.214893" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:32.213725" elapsed="0.001195"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:32.222077" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:32.221811" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:32.222529" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:32.222283" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:32.232125" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:32.232210" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:32 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:32 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782832,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:32.232344" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:32.225039" elapsed="0.007343"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:32.222674" elapsed="0.009770"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:32.232731" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:32.232485" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:32.222652" elapsed="0.010222"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:32.238331" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782832,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:32.234396" elapsed="0.004008"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:32.234056" elapsed="0.004408"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:32.234029" elapsed="0.004496"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:32.245470" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:32.239087" elapsed="0.006476"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:32.238659" elapsed="0.006960"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:32.238627" elapsed="0.007028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:32.246482" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:32.245920" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:32.247021" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:32.246649" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:32.248176" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:32.247378" elapsed="0.000838"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:32.247145" elapsed="0.001122"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:32.246622" elapsed="0.001679"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:32.249078" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:32.248532" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:32.249566" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:32.249216" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:32.250644" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:32.249912" elapsed="0.000771"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:32.249685" elapsed="0.001048"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:32.249191" elapsed="0.001630"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:32.251049" elapsed="0.000659"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:32.252246" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:32.251911" elapsed="0.000412"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:32.252486" elapsed="0.013015"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:32.233413" elapsed="0.032175"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:32.265772" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T01:00:32.265662" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:32.265643" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:32.266021" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:32.266094" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:32.268470" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782832,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:32.215276" elapsed="0.053223"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:32.268789" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:32.268948" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782832,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:32.213193" elapsed="0.055782"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:32.269990" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782832, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:32.269585" elapsed="0.000434"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:32.270069" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:32.270225" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782832, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:32.269212" elapsed="0.001039"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:32.270629" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:32.270430" elapsed="0.000226"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:32.271160" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:32.270851" elapsed="0.000336"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:32.271646" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:32.271363" elapsed="0.000310"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:32.272205" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:32.271847" elapsed="0.000430">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:32.202304" elapsed="0.070085">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:33.284805" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:33.284254" elapsed="0.000600"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:33.284938" elapsed="0.000059"/>
</return>
<msg time="2026-04-10T01:00:33.285198" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:33.283671" elapsed="0.001566"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:33.294711" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:33.294301" elapsed="0.000473"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:33.295202" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:33.294946" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:33.302673" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:33.302834" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:33 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:33 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782833,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:33.302968" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:33.297662" elapsed="0.005337"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:33.295352" elapsed="0.007705"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:33.303301" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:33.303095" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:33.295326" elapsed="0.008077"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:33.307986" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782833,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:33.304618" elapsed="0.003445"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:33.304335" elapsed="0.003783"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:33.304315" elapsed="0.003841"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:33.312751" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:33.308632" elapsed="0.004194"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:33.308243" elapsed="0.004637"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:33.308216" elapsed="0.004701"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:33.313820" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:33.313183" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:33.314373" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:33.313970" elapsed="0.000497"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:33.315726" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:33.314920" elapsed="0.000848"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:33.314656" elapsed="0.001174"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:33.313942" elapsed="0.001924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:33.316651" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:33.316096" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:33.317203" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:33.316808" elapsed="0.000486"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:33.318334" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:33.317580" elapsed="0.000794"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:33.317329" elapsed="0.001095"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:33.316782" elapsed="0.001673"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:33.318764" elapsed="0.000477"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:33.319777" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:33.319411" elapsed="0.000394"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:33.319965" elapsed="0.013261"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:33.303851" elapsed="0.029445"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:33.333483" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T01:00:33.333370" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:33.333351" elapsed="0.000253"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:33.333763" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:33.333982" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T01:00:33.336663" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782833,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:33.285787" elapsed="0.050949"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:33.336797" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T01:00:33.336964" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782833,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:33.282767" elapsed="0.054232"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:33.338110" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782833, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:33.337668" elapsed="0.000472"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:33.338190" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:33.338350" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782833, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:33.337241" elapsed="0.001137"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:33.339001" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:33.338809" elapsed="0.000224"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:33.339527" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:33.339215" elapsed="0.000355"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:33.340034" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:33.339750" elapsed="0.000312"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:33.340613" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:33.340238" elapsed="0.000451">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:33.273301" elapsed="0.067501">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.353227" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:34.352841" elapsed="0.000420"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:34.353321" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T01:00:34.353497" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:34.352448" elapsed="0.001075"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.360461" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.360193" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.360940" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.360687" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:34.367852" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:34.367912" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:34 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782834,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:34.368008" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:34.363297" elapsed="0.004738"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.361061" elapsed="0.007017"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:34.368263" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:34.368106" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.361040" elapsed="0.007318"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.372893" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782834,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.369406" elapsed="0.003557"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.369179" elapsed="0.003910"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.369161" elapsed="0.003965"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.377389" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.373525" elapsed="0.003932"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.373207" elapsed="0.004299"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.373183" elapsed="0.004378"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.378387" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:34.377812" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:34.378885" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:34.378527" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.379986" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:34.379231" elapsed="0.000794"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.379002" elapsed="0.001074"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.378501" elapsed="0.001605"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.380898" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:34.380334" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:34.381420" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:34.381037" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.382673" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:34.381790" elapsed="0.000925"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.381541" elapsed="0.001227"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.381012" elapsed="0.001787"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:34.383011" elapsed="0.000500"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:34.384041" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:34.383704" elapsed="0.000364"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:34.384228" elapsed="0.012714"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:34.368746" elapsed="0.028263"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:34.397189" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T01:00:34.397080" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.397062" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:34.397431" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:34.397501" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:34.400123" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782834,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:34.353894" elapsed="0.046258"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:34.400205" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:34.400356" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782834,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:34.351948" elapsed="0.048434"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.401565" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782834, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:34.401143" elapsed="0.000452"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:34.401645" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:34.401804" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782834, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:34.400784" elapsed="0.001090"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:34.402245" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:34.402060" elapsed="0.000242"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.402813" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:34.402483" elapsed="0.000357"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.403280" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:34.403016" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T01:00:34.403478" elapsed="0.000330"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T01:00:34.341843" elapsed="0.062025"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T01:00:21.970050" elapsed="12.433870"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:21.969570" elapsed="12.434413"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:00:21.964726" elapsed="12.439291"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:00:21.964584" elapsed="12.439469"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.415448" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:34.415147" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:34.415522" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T01:00:34.415691" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:34.414794" elapsed="0.000922"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.422923" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.422666" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.423376" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.423129" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:34.430872" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:34.430930" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:34 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782834,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:34.431024" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:34.425670" elapsed="0.005380"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.423491" elapsed="0.007603"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:34.431275" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:34.431120" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.423472" elapsed="0.007906"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.434953" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782834,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.432399" elapsed="0.002622"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.432176" elapsed="0.002893"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.432158" elapsed="0.002946"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.439058" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.435493" elapsed="0.003630"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.435182" elapsed="0.003989"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.435159" elapsed="0.004045"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.439987" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:34.439438" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:34.440459" elapsed="0.000194"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:34.440125" elapsed="0.000590"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.441416" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:34.440986" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.440749" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.440100" elapsed="0.001436"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.442365" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:34.441799" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:34.442856" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:34.442503" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.443402" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:34.443104" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.442939" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.442477" elapsed="0.001008"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:34.443655" elapsed="0.000350"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:34.444450" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:34.444173" elapsed="0.000302"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:34.444648" elapsed="0.002550"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:34.431753" elapsed="0.015521"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:34.447470" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T01:00:34.447358" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.447335" elapsed="0.000249"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:34.447754" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:34.447826" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T01:00:34.450183" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782834,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:34.416051" elapsed="0.034161"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:34.450284" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:34.450440" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782834,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:34.414324" elapsed="0.036142"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T01:00:34.450513" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T01:00:34.450676" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782834,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T01:00:34.409727" elapsed="0.040976"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.451736" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782834, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:34.451302" elapsed="0.000462"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:34.451812" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:34.451977" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782834, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:34.450940" elapsed="0.001067"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:34.452372" level="INFO">${value} = 10000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:34.452189" elapsed="0.000209"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.452884" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T01:00:34.452594" elapsed="0.000348"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 10000.</doc>
<status status="PASS" start="2026-04-10T01:00:34.409268" elapsed="0.043798"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:00:34.404253" elapsed="0.048849"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:00:34.404112" elapsed="0.049031"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T01:00:21.896112" elapsed="12.557113"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T01:00:06.525103" elapsed="27.928173"/>
</iter>
<iter>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.453824" level="INFO">4</msg>
<arg>${index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.453575" elapsed="0.000293"/>
</kw>
<kw name="Delete Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Delete Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.465268" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:34.464964" elapsed="0.000331"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:34.465341" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:34.465489" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:34.464612" elapsed="0.000902"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.479753" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.479486" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.480194" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.479956" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.480653" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.480393" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.481087" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.480849" elapsed="0.000281"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:34.481942" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T01:00:34.481750" elapsed="0.000218"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T01:00:34.482337" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T01:00:34.482121" elapsed="0.000243"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T01:00:34.482516" elapsed="0.000215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.483144" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.482894" elapsed="0.000295"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T01:00:34.483232" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:34.483389" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T01:00:34.481329" elapsed="0.002086"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:34.495166" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Content-Length': '402', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T01:00:34.495234" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:34.495358" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:34.485828" elapsed="0.009566"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.483491" elapsed="0.011967"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:34.495742" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:34.495496" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.483470" elapsed="0.012396"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.500824" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.497356" elapsed="0.003531"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.496984" elapsed="0.003953"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.496959" elapsed="0.004013"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.504938" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.501367" elapsed="0.003642"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.501052" elapsed="0.004008"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.501028" elapsed="0.004067"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.505918" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:34.505344" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:34.506421" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:34.506060" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.507217" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:34.506792" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.506537" elapsed="0.000769"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.506033" elapsed="0.001304"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.508124" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:34.507587" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:34.508627" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:34.508262" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.509384" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:34.508969" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.508743" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.508237" elapsed="0.001265"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:34.509741" elapsed="0.000483"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:34.510888" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:34.510479" elapsed="0.000446"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:34.511142" elapsed="0.003627"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:34.496354" elapsed="0.018509"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:00:34.515047" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:00:34.514938" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.514920" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:00:34.517741" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:00:34.515262" elapsed="0.002506"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:00:34.517817" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T01:00:34.517977" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:34.476696" elapsed="0.041306"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:34.518070" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:00:34.518219" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T01:00:34.473965" elapsed="0.044296"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:34.518317" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:00:34.518466" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:34.464144" elapsed="0.054347"/>
</kw>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Delete Bulk Flow in member 1 according to ${json_body_del}.</doc>
<status status="PASS" start="2026-04-10T01:00:34.459287" elapsed="0.059284"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.527036" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:34.526613" elapsed="0.000462"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:34.527139" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T01:00:34.527346" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:34.526070" elapsed="0.001311"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.536533" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.536280" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.536997" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.536755" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:34.543243" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:34.543308" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:34 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782834,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:34.543402" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:34.539271" elapsed="0.004158"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.537107" elapsed="0.006364"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:34.543678" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:34.543498" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.537089" elapsed="0.006677"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.547397" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782834,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.544796" elapsed="0.002652"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.544569" elapsed="0.002914"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.544534" elapsed="0.002974"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.550354" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:34.547810" elapsed="0.002600"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.547585" elapsed="0.002860"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.547564" elapsed="0.002906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.551044" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:34.550659" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:34.551395" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:34.551146" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.551976" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:34.551668" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.551483" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.551128" elapsed="0.000933"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.552613" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:34.552223" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:34.552948" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:34.552711" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.553493" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:34.553190" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:34.553029" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.552693" elapsed="0.000945"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:34.553797" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:34.554709" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:34.554388" elapsed="0.000349"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:34.554899" elapsed="0.002581"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:34.544120" elapsed="0.013442"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:34.557743" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T01:00:34.557634" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:34.557615" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:34.557989" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:34.558060" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:34.560420" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782834,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:34.527863" elapsed="0.032586"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:34.560501" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:34.560670" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782834,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:34.525410" elapsed="0.035286"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.561668" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782834, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:34.561258" elapsed="0.000438"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:34.561744" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:34.561898" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782834, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:34.560918" elapsed="0.001005"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:34.562308" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:34.562100" elapsed="0.000234"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.562824" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:34.562508" elapsed="0.000341"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.563292" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:34.563020" elapsed="0.000297"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:34.563856" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:34.563486" elapsed="0.000439">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:34.519865" elapsed="0.044309">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.575133" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:35.574630" elapsed="0.000548"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:35.575260" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T01:00:35.575487" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:35.574083" elapsed="0.001439"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.585112" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:35.584739" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.585752" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:35.585397" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:35.594601" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:35.594704" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:35 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:35 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782835,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:35.594873" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:35.588957" elapsed="0.005959"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:35.585918" elapsed="0.009070"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:35.595303" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:35.595042" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.585887" elapsed="0.009536"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.600463" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782835,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:35.596947" elapsed="0.003588"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:35.596621" elapsed="0.003982"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.596593" elapsed="0.004045"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.604349" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:35.601029" elapsed="0.003382"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:35.600716" elapsed="0.003741"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.600692" elapsed="0.003796"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.605317" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:35.604772" elapsed="0.000582"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:35.605792" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:35.605449" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.606578" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:35.606151" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:35.605903" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.605425" elapsed="0.001269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.607388" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:35.606912" elapsed="0.000510"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:35.607854" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:35.607514" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.608583" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:35.608183" elapsed="0.000436"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:35.607969" elapsed="0.000696"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.607490" elapsed="0.001202"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:35.608909" elapsed="0.000462"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:35.610002" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:35.609614" elapsed="0.000422"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:35.610272" elapsed="0.003334"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:35.596001" elapsed="0.017700"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:35.613952" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-10T01:00:35.613802" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.613775" elapsed="0.000357"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:35.614352" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:35.614527" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T01:00:35.617717" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782835,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:35.576019" elapsed="0.041737"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:35.617828" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T01:00:35.618034" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782835,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:35.573388" elapsed="0.044682"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.619450" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782835, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:35.618918" elapsed="0.000569"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:35.619567" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T01:00:35.619767" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782835, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:35.618425" elapsed="0.001376"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:35.620268" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:35.620039" elapsed="0.000261"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.620949" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:35.620533" elapsed="0.000452"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.621568" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:35.621213" elapsed="0.000392"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T01:00:35.621838" elapsed="0.000431"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T01:00:35.565076" elapsed="0.057270"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T01:00:34.519267" elapsed="1.103149"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 1.</doc>
<status status="PASS" start="2026-04-10T01:00:34.518861" elapsed="1.103642"/>
</kw>
<arg>${temp_json_config_del_ten_percent}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Delete Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T01:00:34.458791" elapsed="1.163809"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.636214" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T01:00:35.635724" elapsed="0.000523"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.636814" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T01:00:35.636444" elapsed="0.000402"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T01:00:35.636902" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:00:35.637093" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T01:00:35.635205" elapsed="0.001917"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.650972" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:35.650570" elapsed="0.000437"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:35.651069" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T01:00:35.651258" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:35.650110" elapsed="0.001177"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.667562" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:35.667250" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.668044" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:35.667779" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.668612" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:35.668340" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.669077" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:35.668817" elapsed="0.000304"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:35.670067" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T01:00:35.669848" elapsed="0.000272"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T01:00:35.670458" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T01:00:35.670281" elapsed="0.000203"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T01:00:35.670654" elapsed="0.000220"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.671365" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:35.671055" elapsed="0.000364"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T01:00:35.671473" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T01:00:35.671693" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T01:00:35.669347" elapsed="0.002377"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:35.681046" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T01:00:35.681107" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:35.681214" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:35.674499" elapsed="0.006746"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:35.671824" elapsed="0.009480"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:35.681576" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:35.681341" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.671799" elapsed="0.009902"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.685438" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:35.682973" elapsed="0.002512"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:35.682727" elapsed="0.002794"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.682708" elapsed="0.002852"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.689099" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:35.685856" elapsed="0.003312"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:35.685620" elapsed="0.003600"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.685602" elapsed="0.003654"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.690158" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:35.689516" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:35.690682" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:35.690305" elapsed="0.000466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.691519" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:35.691066" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:35.690806" elapsed="0.000830"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.690279" elapsed="0.001388"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.692465" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:35.691920" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:35.693038" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:35.692662" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.693883" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:35.693402" elapsed="0.000523"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:35.693162" elapsed="0.000884"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.692625" elapsed="0.001505"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:35.694371" elapsed="0.000548"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:35.695384" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:35.695093" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:35.695585" elapsed="0.004323"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:35.682216" elapsed="0.017760"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:00:35.700158" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:00:35.700050" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.700030" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:00:35.702908" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:00:35.700373" elapsed="0.002565"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:00:35.702988" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T01:00:35.703145" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:35.663857" elapsed="0.039312"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:35.703234" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:00:35.703379" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T01:00:35.660981" elapsed="0.042422"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:35.703452" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T01:00:35.703613" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:35.649499" elapsed="0.054138"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T01:00:35.643461" elapsed="0.060236"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:00:35.637353" elapsed="0.066377"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:00:35.637196" elapsed="0.066566"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.716228" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:35.715841" elapsed="0.000421"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:35.716322" elapsed="0.000037"/>
</return>
<msg time="2026-04-10T01:00:35.716511" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:35.715366" elapsed="0.001194"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.725893" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:35.725488" elapsed="0.000476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.726564" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:35.726228" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:35.737781" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:35.737882" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:35 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:35 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782835,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:35.738181" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:35.729710" elapsed="0.008511"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:35.726728" elapsed="0.011564"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:35.738615" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:35.738340" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.726699" elapsed="0.012039"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.744367" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782835,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:35.740258" elapsed="0.004179"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:35.739937" elapsed="0.004549"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.739908" elapsed="0.004612"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.748744" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:35.744930" elapsed="0.003879"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:35.744619" elapsed="0.004238"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.744595" elapsed="0.004297"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.749703" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:35.749150" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:35.750385" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:35.749833" elapsed="0.000630"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.751536" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:35.750731" elapsed="0.000878"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:35.750493" elapsed="0.001163"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.749808" elapsed="0.001876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.752436" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:35.751902" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:35.753195" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:35.752603" elapsed="0.000669"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.754654" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:35.753517" elapsed="0.001227"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:35.753303" elapsed="0.001546"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.752576" elapsed="0.002330"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:35.755366" elapsed="0.001292"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:35.757823" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:35.757044" elapsed="0.000839"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:35.758267" elapsed="0.018026"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:35.739302" elapsed="0.037090"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:35.776656" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-10T01:00:35.776504" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:35.776472" elapsed="0.000292"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:35.776966" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:35.777041" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:35.779698" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782835,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:35.716999" elapsed="0.062731"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:35.779787" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:35.779944" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782835,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:35.714787" elapsed="0.065264"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.781201" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782835, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:35.780736" elapsed="0.000493"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:35.781278" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:35.781434" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782835, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:35.780310" elapsed="0.001151"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:35.782178" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:35.781939" elapsed="0.000266"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.782724" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:35.782388" elapsed="0.000364"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.783191" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:35.782927" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:35.783760" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:35.783389" elapsed="0.000442">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:35.709733" elapsed="0.074211">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:36.797770" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:36.797229" elapsed="0.000587"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:36.797898" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T01:00:36.798252" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:36.796692" elapsed="0.001600"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:36.808756" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:36.808348" elapsed="0.000479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:36.809420" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:36.809062" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:36.820369" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:36.820432" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:36 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:36 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782836,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:36.820529" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:36.812836" elapsed="0.007737"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:36.809611" elapsed="0.011009"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:36.820807" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:36.820648" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:36.809581" elapsed="0.011312"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:36.825654" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782836,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:36.821946" elapsed="0.003782"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:36.821716" elapsed="0.004063"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:36.821698" elapsed="0.004118"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:36.830314" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:36.826265" elapsed="0.004119"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:36.825899" elapsed="0.004537"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:36.825874" elapsed="0.004596"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:36.831465" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:36.830866" elapsed="0.000640"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:36.832027" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:36.831642" elapsed="0.000477"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:36.833205" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:36.832404" elapsed="0.000842"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:36.832156" elapsed="0.001155"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:36.831613" elapsed="0.001737"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:36.834238" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:36.833627" elapsed="0.000652"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:36.834757" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:36.834386" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:36.835609" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:36.835080" elapsed="0.000557"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:36.834894" elapsed="0.000780"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:36.834359" elapsed="0.001337"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:36.835860" elapsed="0.000476"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:36.836925" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:36.836536" elapsed="0.000429"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:36.837132" elapsed="0.013490"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:36.821266" elapsed="0.029427"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:36.850879" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T01:00:36.850768" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:36.850748" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:36.851129" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:36.851200" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:36.853831" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782836,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:36.798833" elapsed="0.055029"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:36.853916" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:36.854123" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782836,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:36.795886" elapsed="0.058264"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:36.855237" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782836, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:36.854760" elapsed="0.000508"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:36.855317" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:36.855476" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782836, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:36.854386" elapsed="0.001117"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:36.855886" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:36.855701" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:36.856404" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:36.856095" elapsed="0.000336"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:36.857160" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:36.856859" elapsed="0.000339"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:36.857762" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:36.857377" elapsed="0.000460">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:36.784851" elapsed="0.073101">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:37.869800" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:37.869372" elapsed="0.000464"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:37.869902" elapsed="0.000085"/>
</return>
<msg time="2026-04-10T01:00:37.870146" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:37.868978" elapsed="0.001198"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:37.877523" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:37.877239" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:37.878072" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:37.877754" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:37.905141" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:37.905354" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:37 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:37 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782837,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:37.905695" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:37.880394" elapsed="0.025367"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:37.878223" elapsed="0.027660"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:37.906497" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:37.906003" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:37.878196" elapsed="0.028539"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:37.915437" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782837,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:37.909222" elapsed="0.006274"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:37.908676" elapsed="0.006859"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:37.908633" elapsed="0.006946"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:37.918708" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:37.915887" elapsed="0.002870"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:37.915642" elapsed="0.003151"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:37.915624" elapsed="0.003194"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:37.919441" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:37.919027" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:37.919803" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:37.919541" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:37.920583" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:37.920056" elapsed="0.000555"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:37.919886" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:37.919522" elapsed="0.001146"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:37.921194" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:37.920829" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:37.921525" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:37.921292" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:37.922448" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:37.921886" elapsed="0.000591"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:37.921699" elapsed="0.000816"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:37.921274" elapsed="0.001262"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:37.922738" elapsed="0.000503"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:37.923776" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:37.923417" elapsed="0.000387"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:37.923968" elapsed="0.013377"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:37.907627" elapsed="0.029802"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:37.937660" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T01:00:37.937519" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:37.937494" elapsed="0.000271"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:37.938019" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:37.938102" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:37.940745" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782837,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:37.870566" elapsed="0.070212"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:37.940836" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:37.940997" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782837,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:37.868377" elapsed="0.072647"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:37.942172" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782837, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:37.941703" elapsed="0.000498"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:37.942250" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:37.942409" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782837, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:37.941294" elapsed="0.001142"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:37.943063" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:37.942874" elapsed="0.000217"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:37.943605" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:37.943273" elapsed="0.000361"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:37.944081" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:37.943813" elapsed="0.000293"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:37.944669" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:37.944282" elapsed="0.000463">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:37.858923" elapsed="0.085937">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:38.957358" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:38.956980" elapsed="0.000411"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:38.957451" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T01:00:38.957642" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:38.956612" elapsed="0.001057"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:38.964790" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:38.964404" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:38.965249" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:38.965003" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:38.973813" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:38.973945" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:38 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:38 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782838,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:38.974091" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:38.967641" elapsed="0.006485"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:38.965373" elapsed="0.008813"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:38.974415" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:38.974221" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:38.965351" elapsed="0.009155"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:38.980294" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782838,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:38.975991" elapsed="0.004383"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:38.975645" elapsed="0.004784"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:38.975615" elapsed="0.004851"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:38.984702" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:38.980925" elapsed="0.003834"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:38.980576" elapsed="0.004223"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:38.980528" elapsed="0.004298"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:38.985468" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:38.985040" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:38.985855" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:38.985598" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:38.986748" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:38.986184" elapsed="0.000592"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:38.985979" elapsed="0.000834"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:38.985576" elapsed="0.001258"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:38.987381" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:38.986999" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:38.987735" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:38.987480" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:38.988490" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:38.987976" elapsed="0.000541"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:38.987817" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:38.987461" elapsed="0.001130"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:38.988760" elapsed="0.000454"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:38.989762" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:38.989386" elapsed="0.000403"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:38.990009" elapsed="0.013470"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:38.974950" elapsed="0.028646"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:39.003914" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T01:00:39.003783" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:39.003753" 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-04-10T01:00:39.004213" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:39.004288" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:39.006886" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782838,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:38.958077" elapsed="0.048841"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:39.006975" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:39.007135" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782838,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:38.956100" elapsed="0.051062"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:39.008322" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782838, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:39.007849" elapsed="0.000502"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:39.008400" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:39.008570" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782838, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:39.007422" elapsed="0.001176"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:39.008966" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:39.008782" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:39.009476" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:39.009169" elapsed="0.000332"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:39.010395" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:39.010106" elapsed="0.000315"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:39.010975" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:39.010612" elapsed="0.000438">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:38.945844" elapsed="0.065321">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:40.023219" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:40.022712" elapsed="0.000551"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:40.023347" elapsed="0.000071"/>
</return>
<msg time="2026-04-10T01:00:40.023633" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:40.022181" elapsed="0.001488"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:40.031852" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:40.031585" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:40.032320" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:40.032059" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:40.042681" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:40.042746" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:40 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:40 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782840,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:40.042844" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:40.034658" elapsed="0.008212"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:40.032443" elapsed="0.010535"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:40.043172" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:40.043008" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:40.032421" elapsed="0.010838"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:40.047159" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782840,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:40.044331" elapsed="0.002901"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:40.044081" elapsed="0.003201"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:40.044060" elapsed="0.003256"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:40.051809" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:40.047737" elapsed="0.004160"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:40.047397" elapsed="0.004564"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:40.047372" elapsed="0.004639"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:40.053023" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:40.052356" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:40.053502" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:40.053164" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:40.054697" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:40.053899" elapsed="0.000837"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:40.053645" elapsed="0.001142"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:40.053137" elapsed="0.001680"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:40.055416" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:40.055041" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:40.055764" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:40.055513" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:40.056505" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:40.056006" elapsed="0.000527"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:40.055846" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:40.055495" elapsed="0.001112"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:40.056769" elapsed="0.000455"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:40.057752" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:40.057391" elapsed="0.000387"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:40.057973" elapsed="0.014939"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:40.043650" elapsed="0.029341"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:40.073192" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T01:00:40.073075" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:40.073052" elapsed="0.000238"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:40.073462" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:40.073536" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:40.076095" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782840,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:40.024173" elapsed="0.051952"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:40.076179" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:40.076332" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782840,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:40.021461" elapsed="0.054897"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:40.077653" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782840, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:40.077204" elapsed="0.000478"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:40.077731" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:40.077887" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782840, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:40.076684" elapsed="0.001253"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:40.078304" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:40.078120" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:40.079110" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:40.078508" elapsed="0.000629"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:40.079586" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:40.079310" elapsed="0.000302"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:40.080135" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:40.079785" elapsed="0.000421">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:40.012137" elapsed="0.068180">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:41.093253" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:41.092715" elapsed="0.000583"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:41.093379" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T01:00:41.093644" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:41.092056" elapsed="0.001627"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:41.102533" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:41.102247" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:41.103052" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:41.102769" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:41.109886" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:41.109948" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:41 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:41 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782841,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:41.110089" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:41.105373" elapsed="0.004744"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:41.103174" elapsed="0.006987"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:41.110347" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:41.110189" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:41.103153" elapsed="0.007281"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:41.114248" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782841,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:41.111479" elapsed="0.002821"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:41.111244" elapsed="0.003091"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:41.111226" elapsed="0.003134"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:41.117461" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:41.114661" elapsed="0.002849"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:41.114416" elapsed="0.003147"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:41.114399" elapsed="0.003190"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:41.118711" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:41.117770" elapsed="0.001004"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:41.119346" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:41.118934" elapsed="0.000497"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:41.120482" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:41.119729" elapsed="0.000794"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:41.119466" elapsed="0.001133"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:41.118893" elapsed="0.001739"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:41.121421" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:41.120875" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:41.121965" elapsed="0.000292"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:41.121611" elapsed="0.000797"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:41.124992" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:41.123177" elapsed="0.001887"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:41.122488" elapsed="0.002668"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:41.121539" elapsed="0.003672"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:41.125707" elapsed="0.001241"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:41.127796" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:41.127267" elapsed="0.000568"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:41.128116" elapsed="0.015239"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:41.110813" elapsed="0.032631"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:41.143705" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-10T01:00:41.143571" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:41.143519" elapsed="0.000293"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:41.143993" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:41.144067" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:41.146686" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782841,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:41.094230" elapsed="0.052488"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:41.146775" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:41.146936" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782841,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:41.091267" elapsed="0.055696"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:41.148173" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782841, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:41.147687" elapsed="0.000525"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:41.148271" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:41.148434" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782841, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:41.147231" elapsed="0.001230"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:41.148877" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:41.148686" elapsed="0.000217"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:41.149401" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:41.149083" elapsed="0.000344"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:41.150302" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:41.149926" elapsed="0.000403"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:41.150912" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:41.150507" elapsed="0.000483">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:41.081180" elapsed="0.069928">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:42.164469" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:42.164071" elapsed="0.000433"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:42.164582" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T01:00:42.164765" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:42.163695" elapsed="0.001095"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:42.172149" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:42.171776" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:42.172666" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:42.172382" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:42.180507" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:42.180606" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:42 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:42 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782842,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:42.180712" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:42.175038" elapsed="0.005701"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:42.172801" elapsed="0.007982"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:42.180981" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:42.180815" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:42.172775" elapsed="0.008295"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:42.186308" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782842,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:42.182330" elapsed="0.004054"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:42.181995" elapsed="0.004440"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:42.181975" elapsed="0.004496"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:42.190990" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:42.187066" elapsed="0.003992"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:42.186576" elapsed="0.004531"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:42.186529" elapsed="0.004612"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:42.191802" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:42.191339" elapsed="0.000492"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:42.192151" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:42.191905" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:42.193024" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:42.192423" elapsed="0.000630"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:42.192236" elapsed="0.000854"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:42.191886" elapsed="0.001226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:42.193670" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:42.193276" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:42.194025" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:42.193773" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:42.194930" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:42.194376" elapsed="0.000583"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:42.194209" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:42.193752" elapsed="0.001266"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:42.195238" elapsed="0.000496"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:42.196256" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:42.195916" elapsed="0.000367"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:42.196442" elapsed="0.013563"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:42.181502" elapsed="0.028637"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:42.210382" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T01:00:42.210243" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:42.210215" elapsed="0.000273"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:42.210701" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:42.210779" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:42.213216" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782842,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:42.165156" elapsed="0.048091"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:42.213302" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:42.213471" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782842,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:42.163172" elapsed="0.050326"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:42.214915" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782842, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:42.214444" elapsed="0.000500"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:42.214993" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:42.215151" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782842, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:42.214007" elapsed="0.001171"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:42.215580" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:42.215358" elapsed="0.000258"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:42.216116" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:42.215801" elapsed="0.000343"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:42.216615" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:42.216317" elapsed="0.000325"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:42.217175" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:42.216816" elapsed="0.000433">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:42.152115" elapsed="0.065249">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:43.229911" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:43.229468" elapsed="0.000478"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:43.230009" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T01:00:43.230256" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:43.229092" elapsed="0.001193"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:43.237291" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:43.237023" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:43.237853" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:43.237590" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:43.245146" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:43.245227" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:43 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782843,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:43.245361" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:43.240186" elapsed="0.005210"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:43.237979" elapsed="0.007480"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:43.245747" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:43.245503" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:43.237957" elapsed="0.007908"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:43.255052" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782843,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:43.247454" elapsed="0.007673"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:43.247059" elapsed="0.008105"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:43.247033" elapsed="0.008156"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:43.258233" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:43.255488" elapsed="0.002795"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:43.255252" elapsed="0.003066"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:43.255235" elapsed="0.003107"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:43.258972" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:43.258529" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:43.259316" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:43.259072" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:43.260099" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:43.259577" elapsed="0.000550"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:43.259398" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:43.259054" elapsed="0.001131"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:43.260744" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:43.260347" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:43.261079" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:43.260841" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:43.261849" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:43.261323" elapsed="0.000553"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:43.261161" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:43.260824" elapsed="0.001109"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:43.262088" elapsed="0.000509"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:43.263100" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:43.262767" elapsed="0.000359"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:43.263283" elapsed="0.012716"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:43.246455" elapsed="0.029615"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:43.276313" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T01:00:43.276200" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:43.276180" 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-04-10T01:00:43.276609" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:43.276683" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:43.279273" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782843,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:43.230666" elapsed="0.048637"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:43.279357" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:43.279510" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782843,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:43.228573" elapsed="0.050963"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:43.280539" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782843, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:43.280135" elapsed="0.000626"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:43.280811" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:43.280968" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782843, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:43.279785" elapsed="0.001209"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:43.281356" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:43.281175" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:43.281885" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:43.281577" elapsed="0.000334"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:43.282390" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:43.282086" elapsed="0.000329"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:43.282990" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:43.282625" elapsed="0.000440">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:43.218406" elapsed="0.064771">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:44.294123" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:44.293599" elapsed="0.000568"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:44.294254" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T01:00:44.294595" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:44.292992" elapsed="0.001644"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:44.303103" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:44.302831" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:44.303656" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:44.303333" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:44.313888" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:44.313968" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:44 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782844,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:44.314072" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:44.306929" elapsed="0.007170"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:44.303811" elapsed="0.010386"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:44.314430" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:44.314229" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:44.303783" elapsed="0.010738"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:44.320090" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782844,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:44.315794" elapsed="0.004372"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:44.315430" elapsed="0.004790"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:44.315403" elapsed="0.004855"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:44.324396" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:44.320733" elapsed="0.003712"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:44.320344" elapsed="0.004138"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:44.320318" elapsed="0.004188"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:44.325146" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:44.324704" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:44.325531" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:44.325252" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:44.326414" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:44.325812" elapsed="0.000631"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:44.325635" elapsed="0.000847"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:44.325233" elapsed="0.001271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:44.327081" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:44.326686" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:44.327441" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:44.327199" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:44.328298" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:44.327747" elapsed="0.000579"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:44.327524" elapsed="0.000841"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:44.327179" elapsed="0.001215"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:44.328608" elapsed="0.000562"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:44.329822" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:44.329389" elapsed="0.000468"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:44.330063" elapsed="0.014280"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:44.314909" elapsed="0.029508"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:44.344645" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T01:00:44.344509" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:44.344487" elapsed="0.000253"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:44.344894" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:44.344967" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:44.347435" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782844,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:44.295158" elapsed="0.052307"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:44.347518" elapsed="0.000492"/>
</return>
<msg time="2026-04-10T01:00:44.348153" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782844,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:44.292224" elapsed="0.055956"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:44.349271" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782844, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:44.348863" elapsed="0.000437"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:44.349350" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:44.349507" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782844, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:44.348468" elapsed="0.001065"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:44.349983" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:44.349772" elapsed="0.000241"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:44.350561" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:44.350196" elapsed="0.000394"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:44.351056" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:44.350769" elapsed="0.000315"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:44.351629" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:44.351260" elapsed="0.000443">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:44.283935" elapsed="0.067892">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:45.360576" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:45.360041" elapsed="0.000579"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:45.360695" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T01:00:45.360907" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:45.359569" elapsed="0.001369"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:45.370379" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:45.370082" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:45.370934" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:45.370631" elapsed="0.000350"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:45.379459" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:45.379535" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:45 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782845,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:45.379687" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:45.373275" elapsed="0.006447"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:45.371063" elapsed="0.008716"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:45.380023" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:45.379817" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:45.371040" elapsed="0.009098"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:45.385017" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782845,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:45.381592" elapsed="0.003493"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:45.381251" elapsed="0.003883"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:45.381224" elapsed="0.003945"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:45.389919" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:45.385563" elapsed="0.004450"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:45.385246" elapsed="0.004837"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:45.385223" elapsed="0.004907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:45.391336" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:45.390499" elapsed="0.000884"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:45.392129" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:45.391695" elapsed="0.000541"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:45.393524" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:45.392613" elapsed="0.001010"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:45.392280" elapsed="0.001407"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:45.391655" elapsed="0.002069"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:45.394765" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:45.394024" elapsed="0.000795"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:45.395370" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:45.394959" elapsed="0.000489"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:45.396402" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:45.395733" elapsed="0.000706"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:45.395482" elapsed="0.001002"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:45.394923" elapsed="0.001588"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:45.396746" elapsed="0.000614"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:45.398079" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:45.397611" elapsed="0.000505"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:45.398344" elapsed="0.016435"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:45.380675" elapsed="0.034218"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:45.415169" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-10T01:00:45.415012" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:45.414976" elapsed="0.000330"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:45.415568" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:45.415664" elapsed="0.000018"/>
</return>
<msg time="2026-04-10T01:00:45.418811" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782845,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:45.361382" elapsed="0.057468"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:45.418923" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T01:00:45.419126" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782845,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:45.358932" elapsed="0.060228"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:45.420831" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782845, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:45.420026" elapsed="0.000842"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:45.420933" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T01:00:45.421147" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782845, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:45.419484" elapsed="0.001701"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:45.421883" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:45.421633" elapsed="0.000285"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:45.422650" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:45.422177" elapsed="0.000510"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:45.423261" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:45.422908" elapsed="0.000390"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:45.424022" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:45.423596" elapsed="0.000501">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:45.352600" elapsed="0.071613">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:46.433107" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:46.432614" elapsed="0.000536"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:46.433226" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T01:00:46.433460" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:46.432116" elapsed="0.001380"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:46.443079" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:46.442702" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:46.443723" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:46.443360" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:46.452781" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:46.452867" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:46 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:46 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782846,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:46.453001" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:46.446987" elapsed="0.006050"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:46.443889" elapsed="0.009204"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:46.453373" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:46.453133" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:46.443861" elapsed="0.009628"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:46.461431" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782846,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:46.455118" elapsed="0.006457"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:46.454593" elapsed="0.007066"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:46.454568" elapsed="0.007147"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:46.468134" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:46.462359" elapsed="0.005825"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:46.461845" elapsed="0.006375"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:46.461806" elapsed="0.006439"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:46.468872" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:46.468438" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:46.469217" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:46.468973" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:46.470003" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:46.469471" elapsed="0.000560"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:46.469299" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:46.468954" elapsed="0.001137"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:46.470643" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:46.470255" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:46.471000" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:46.470761" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:46.471799" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:46.471257" elapsed="0.000631"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:46.471090" elapsed="0.000836"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:46.470723" elapsed="0.001225"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:46.472109" elapsed="0.000517"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:46.473134" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:46.472797" elapsed="0.000364"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:46.473318" elapsed="0.012592"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:46.454031" elapsed="0.031955"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:46.486175" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T01:00:46.486060" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:46.486041" 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-04-10T01:00:46.486428" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:46.486499" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:46.489131" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782846,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:46.433994" elapsed="0.055168"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:46.489216" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:46.489374" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782846,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:46.431472" elapsed="0.057928"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:46.490469" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782846, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:46.490048" elapsed="0.000449"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:46.490561" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:46.490721" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782846, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:46.489666" elapsed="0.001102"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:46.491136" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:46.490951" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:46.491920" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:46.491339" elapsed="0.000608"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:46.492393" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:46.492123" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:46.492967" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:46.492609" elapsed="0.000437">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:46.424951" elapsed="0.068221">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:47.505826" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:47.505424" elapsed="0.000434"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:47.505917" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T01:00:47.506089" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:47.505056" elapsed="0.001058"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:47.513066" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:47.512803" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:47.513666" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:47.513393" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:47.853020" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:47.853200" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:47 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:47 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782847,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:47.853476" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:47.516026" elapsed="0.337555"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:47.513791" elapsed="0.339922"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:47.854247" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:47.853801" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:47.513771" elapsed="0.340682"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:47.863503" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782847,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:47.857067" elapsed="0.006507"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:47.856497" elapsed="0.007113"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:47.856452" elapsed="0.007184"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:47.866845" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:47.863926" elapsed="0.002969"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:47.863694" elapsed="0.003236"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:47.863677" elapsed="0.003278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:47.867602" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:47.867171" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:47.867948" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:47.867703" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:47.868765" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:47.868199" elapsed="0.000594"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:47.868032" elapsed="0.000799"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:47.867684" elapsed="0.001170"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:47.869414" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:47.869028" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:47.869814" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:47.869514" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:47.870630" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:47.870075" elapsed="0.000584"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:47.869897" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:47.869496" elapsed="0.001221"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:47.870875" elapsed="0.000500"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:47.871937" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:47.871586" elapsed="0.000378"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:47.872126" elapsed="0.013000"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:47.855416" elapsed="0.029778"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:47.885380" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T01:00:47.885267" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:47.885248" elapsed="0.000289"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:47.885720" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:47.885795" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:47.888429" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782847,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:47.506467" elapsed="0.381992"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:47.888514" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T01:00:47.888689" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782847,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:47.504561" elapsed="0.384156"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:47.889744" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782847, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:47.889306" elapsed="0.000468"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:47.889822" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:47.889980" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782847, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:47.888950" elapsed="0.001056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:47.890369" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:47.890187" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:47.891116" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:47.890770" elapsed="0.000375"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:47.891622" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:47.891323" elapsed="0.000326"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:47.892182" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:47.891824" elapsed="0.000431">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:47.494154" elapsed="0.398217">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.904491" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:48.903994" elapsed="0.000540"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:48.904635" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T01:00:48.904865" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:48.903463" elapsed="0.001438"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.913061" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:48.912795" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.913522" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:48.913272" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:48.923531" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:48.923609" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:48 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:48 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782848,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:48.923720" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:48.915838" elapsed="0.007909"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:48.913658" elapsed="0.010133"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:48.924065" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:48.923901" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:48.913637" elapsed="0.010517"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.927979" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782848,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:48.925195" elapsed="0.002836"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:48.924967" elapsed="0.003099"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:48.924948" elapsed="0.003144"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.932205" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:48.928381" elapsed="0.003891"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:48.928151" elapsed="0.004170"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:48.928133" elapsed="0.004222"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.933187" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:48.932639" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:48.933681" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:48.933326" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.934762" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:48.934024" elapsed="0.000776"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:48.933797" elapsed="0.001054"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:48.933301" elapsed="0.001580"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.935704" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:48.935110" elapsed="0.000632"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:48.936170" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:48.935841" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.937029" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:48.936501" elapsed="0.000556"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:48.936283" elapsed="0.000810"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:48.935816" elapsed="0.001298"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:48.937269" elapsed="0.000464"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:48.938228" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:48.937900" elapsed="0.000354"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:48.938411" elapsed="0.012634"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:48.924519" elapsed="0.026591"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:48.951291" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-10T01:00:48.951183" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:48.951163" elapsed="0.000237"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:48.951576" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:48.951650" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:48.954219" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782848,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:48.905384" elapsed="0.048864"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:48.954300" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:48.954452" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782848,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:48.902769" elapsed="0.051708"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.955617" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782848, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:48.955104" elapsed="0.000542"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:48.955696" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:48.955851" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782848, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:48.954714" elapsed="0.001164"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:48.956236" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:48.956056" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.956784" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:48.956434" elapsed="0.000376"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.957245" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:48.956982" elapsed="0.000288"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T01:00:48.957439" elapsed="0.000502"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T01:00:48.893290" elapsed="0.064712"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T01:00:35.709129" elapsed="13.248922"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:35.708711" elapsed="13.249404"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:00:35.703950" elapsed="13.254199"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:00:35.703814" elapsed="13.254370"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.969623" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:48.969305" elapsed="0.000345"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:48.969695" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:48.969845" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:48.968958" elapsed="0.000912"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.976672" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:48.976408" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.977114" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:48.976872" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:48.984191" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:48.984247" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:48 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:48 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782848,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:48.984338" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:48.979348" elapsed="0.005016"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:48.977224" elapsed="0.007184"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:48.984610" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:48.984439" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:48.977206" elapsed="0.007492"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.988309" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782848,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:48.985709" elapsed="0.002648"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:48.985467" elapsed="0.002925"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:48.985448" elapsed="0.002968"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.992268" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:48.988860" elapsed="0.003474"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:48.988472" elapsed="0.003910"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:48.988455" elapsed="0.003962"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.993196" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:48.992668" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:48.993693" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:48.993333" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.994458" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:48.994037" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:48.993810" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:48.993308" elapsed="0.001288"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.995362" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:48.994823" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:48.995850" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:48.995498" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:48.996578" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:48.996188" elapsed="0.000417"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:48.995962" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:48.995473" elapsed="0.001188"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:48.996928" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:48.997884" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:48.997437" elapsed="0.000473"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:48.998067" elapsed="0.002443"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:48.985045" elapsed="0.015542"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:49.000762" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T01:00:49.000658" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:49.000640" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:49.000992" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:49.001063" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:49.003425" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782848,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:48.970198" elapsed="0.033256"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:49.003507" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:49.003673" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782848,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:48.968493" elapsed="0.035206"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T01:00:49.003744" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:00:49.003887" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782848,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T01:00:48.963988" elapsed="0.039924"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.004872" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 9000, 'timestamp': 1775782848, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:49.004467" elapsed="0.000433"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:49.004947" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T01:00:49.005098" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 9000, 'timestamp': 1775782848, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:49.004127" elapsed="0.001031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:49.005521" level="INFO">${value} = 9000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:49.005338" elapsed="0.000227"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.006025" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T01:00:49.005744" elapsed="0.000336"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 9000.</doc>
<status status="PASS" start="2026-04-10T01:00:48.963529" elapsed="0.042608"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:00:48.958411" elapsed="0.047759"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:00:48.958271" elapsed="0.047929"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_del_ten_percent}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T01:00:35.634387" elapsed="13.371869"/>
</kw>
<kw name="Add Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Add Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.017034" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:49.016736" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:49.017106" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:49.017253" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:49.016378" elapsed="0.000899"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.031744" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:49.031477" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.032184" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:49.031946" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.032639" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:49.032382" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.033067" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:49.032832" elapsed="0.000277"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:49.033921" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T01:00:49.033731" elapsed="0.000216"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T01:00:49.034266" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T01:00:49.034099" elapsed="0.000192"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T01:00:49.034440" elapsed="0.000204"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.035042" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:49.034799" elapsed="0.000285"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T01:00:49.035125" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:49.035277" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T01:00:49.033310" elapsed="0.001991"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:49.047657" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Content-Length': '401', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T01:00:49.047705" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:49.047791" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:49.037500" elapsed="0.010316"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:49.035384" elapsed="0.012477"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:49.048041" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:49.047888" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:49.035366" elapsed="0.012800"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.051780" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:49.049195" elapsed="0.002629"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:49.048972" elapsed="0.002887"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:49.048954" elapsed="0.002929"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.057318" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:49.052159" elapsed="0.005263"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:49.051939" elapsed="0.005558"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:49.051922" elapsed="0.005658"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.058796" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:49.057943" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:49.059618" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:49.059012" elapsed="0.000738"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.060626" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:49.060164" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:49.059803" elapsed="0.000884"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:49.058973" elapsed="0.001736"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.061223" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:49.060867" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:49.061566" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:49.061318" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.062098" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:49.061807" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:49.061647" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:49.061300" elapsed="0.000880"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:49.062328" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:49.063123" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:49.062854" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:49.063303" elapsed="0.002481"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:49.048521" elapsed="0.017326"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:00:49.066025" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:00:49.065919" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:49.065901" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:00:49.068714" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:00:49.066237" elapsed="0.002504"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:00:49.068788" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:49.068941" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:49.028659" elapsed="0.040307"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:49.069031" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:00:49.069178" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T01:00:49.026005" elapsed="0.043197"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:49.069287" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:49.069435" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:49.015940" elapsed="0.053519"/>
</kw>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Add Bulk Flow in member 1 according to ${json_body_add}.</doc>
<status status="PASS" start="2026-04-10T01:00:49.011365" elapsed="0.058154"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.076453" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:49.076155" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:49.076525" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T01:00:49.076691" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:49.075811" elapsed="0.000905"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.084962" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:49.084708" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.085407" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:49.085165" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:49.092251" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:49.092306" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:49 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:49 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782849,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:49.092405" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:49.087668" elapsed="0.004772"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:49.085516" elapsed="0.006987"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:49.092783" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:49.092539" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:49.085498" elapsed="0.007404"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.098014" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782849,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:49.094300" elapsed="0.003781"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:49.093994" elapsed="0.004135"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:49.093969" elapsed="0.004194"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.102093" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:49.098569" elapsed="0.003590"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:49.098241" elapsed="0.003966"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:49.098217" elapsed="0.004023"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.103021" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:49.102470" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:49.103591" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:49.103156" elapsed="0.000525"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.104369" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:49.103947" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:49.103715" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:49.103131" elapsed="0.001351"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.105038" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:49.104671" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:49.105368" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:49.105135" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.105975" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:49.105674" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:49.105489" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:49.105117" elapsed="0.000941"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:49.106210" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:49.107011" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:49.106739" elapsed="0.000298"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:49.107191" elapsed="0.002480"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:49.093389" elapsed="0.016347"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:49.109912" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T01:00:49.109806" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:49.109787" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:49.110146" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:49.110217" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:49.112618" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782849,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:49.077038" elapsed="0.035609"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:49.112698" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:49.112848" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782849,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:49.075328" elapsed="0.037546"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.113836" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782849, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:49.113429" elapsed="0.000436"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:49.113913" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:49.114067" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782849, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:49.113091" elapsed="0.001002"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:49.114446" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:49.114269" elapsed="0.000203"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.114966" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:49.114663" elapsed="0.000330"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.115452" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:49.115167" elapsed="0.000311"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:49.116015" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:49.115666" elapsed="0.000424">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:49.070739" elapsed="0.045462">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:50.130190" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:50.129810" elapsed="0.000413"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:50.130282" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:00:50.130452" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:50.129319" elapsed="0.001160"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:50.137477" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:50.137208" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:50.138040" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:50.137793" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:50.145003" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:50.145061" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:50 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:50 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782850,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:50.145155" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:50.140348" elapsed="0.004833"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:50.138160" elapsed="0.007065"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:50.145408" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:50.145253" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:50.138139" elapsed="0.007356"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:50.149172" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782850,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:50.146567" elapsed="0.002656"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:50.146327" elapsed="0.002931"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:50.146308" elapsed="0.002975"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:50.152082" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:50.149583" elapsed="0.002546"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:50.149339" elapsed="0.002824"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:50.149322" elapsed="0.002867"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:50.152788" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:50.152367" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:50.153127" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:50.152887" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:50.153698" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:50.153373" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:50.153209" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:50.152869" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:50.154306" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:50.153946" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:50.154651" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:50.154402" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:50.155188" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:50.154894" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:50.154732" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:50.154384" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:50.155424" elapsed="0.000390"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:50.156270" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:50.155981" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:50.156451" elapsed="0.002649"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:50.145898" elapsed="0.013269"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:50.159383" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T01:00:50.159274" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:50.159254" elapsed="0.000221"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:50.159663" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:50.159738" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:50.162120" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782850,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:50.130869" elapsed="0.031280"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:50.162202" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:50.162355" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782850,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:50.128666" elapsed="0.033715"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:50.163357" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782850, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:50.162963" elapsed="0.000423"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:50.163435" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:50.163609" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782850, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:50.162619" elapsed="0.001047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:50.164030" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:50.163848" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:50.164534" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:50.164233" elapsed="0.000344"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:50.165018" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:50.164751" elapsed="0.000293"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:50.165577" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:50.165215" elapsed="0.000434">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:50.117076" elapsed="0.048680">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.178574" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:51.178176" elapsed="0.000431"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:51.178668" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T01:00:51.178841" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:51.177811" elapsed="0.001055"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.186054" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:51.185789" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.186510" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:51.186263" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:51.193519" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:51.193604" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:51 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:51 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782851,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:51.193703" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:51.188841" elapsed="0.004889"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:51.186646" elapsed="0.007193"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:51.194051" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:51.193870" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.186625" elapsed="0.007524"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.198437" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782851,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:51.195237" elapsed="0.003271"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:51.194996" elapsed="0.003596"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.194972" elapsed="0.003661"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.202657" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:51.199052" elapsed="0.003673"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:51.198718" elapsed="0.004056"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.198693" elapsed="0.004114"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.203861" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:51.203065" elapsed="0.000835"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:51.204521" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:51.204096" elapsed="0.000516"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.205162" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:51.204839" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:51.204643" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.204060" elapsed="0.001187"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.205792" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:51.205409" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:51.206139" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:51.205890" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.206714" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:51.206386" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:51.206222" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.205872" elapsed="0.000927"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:51.206964" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:51.207811" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:51.207495" elapsed="0.000343"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:51.208055" elapsed="0.002534"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:51.194529" elapsed="0.016126"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:51.210839" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T01:00:51.210728" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.210709" 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-04-10T01:00:51.211104" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:51.211177" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:00:51.213661" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782851,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:51.179221" elapsed="0.034483"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:51.213769" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:51.213939" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782851,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:51.177312" elapsed="0.036666"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.215039" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782851, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:51.214625" elapsed="0.000443"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:51.215117" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:51.215278" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782851, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:51.214257" elapsed="0.001047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:51.215732" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:51.215484" elapsed="0.000283"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.216314" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:51.215996" elapsed="0.000348"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.216816" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:51.216521" elapsed="0.000322"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T01:00:51.217027" elapsed="0.000318"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T01:00:51.166701" elapsed="0.050704"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T01:00:49.070140" elapsed="2.147315"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 1.</doc>
<status status="PASS" start="2026-04-10T01:00:49.069751" elapsed="2.147764"/>
</kw>
<arg>${temp_json_config_add_ten_percent}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Add Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T01:00:49.010858" elapsed="2.206739"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.228128" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T01:00:51.227697" elapsed="0.000459"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.228634" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T01:00:51.228319" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T01:00:51.228704" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:51.228859" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T01:00:51.227296" elapsed="0.001587"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.240135" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:51.239753" elapsed="0.000410"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:51.240209" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:51.240357" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:51.239320" elapsed="0.001062"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.255315" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:51.255052" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.255783" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:51.255523" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.256260" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:51.256012" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.256716" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:51.256457" elapsed="0.000301"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:51.257590" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T01:00:51.257367" elapsed="0.000250"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T01:00:51.257945" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T01:00:51.257775" elapsed="0.000195"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T01:00:51.258179" elapsed="0.000201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.258810" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:51.258557" elapsed="0.000297"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T01:00:51.258898" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:51.259057" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T01:00:51.256960" elapsed="0.002122"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:51.273133" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T01:00:51.273238" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:51.273431" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:51.261338" elapsed="0.012150"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:51.259158" elapsed="0.014473"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:51.274040" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:51.273694" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.259138" elapsed="0.015096"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.281314" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:51.276698" elapsed="0.004661"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:51.276173" elapsed="0.005221"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.276132" elapsed="0.005286"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.284162" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:51.281712" elapsed="0.002497"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:51.281474" elapsed="0.002770"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.281457" elapsed="0.002812"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.284889" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:51.284444" elapsed="0.000474"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:51.285234" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:51.284992" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.285817" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:51.285483" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:51.285317" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.284973" elapsed="0.000930"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.286433" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:51.286066" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:51.286788" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:51.286532" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.287337" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:51.287035" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:51.286872" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.286514" elapsed="0.000907"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:51.287592" elapsed="0.000379"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:51.288431" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:51.288146" elapsed="0.000311"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:51.288631" elapsed="0.002604"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:51.275116" elapsed="0.016225"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:00:51.291528" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:00:51.291418" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.291399" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:00:51.294266" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:00:51.291763" elapsed="0.002531"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:00:51.294342" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:51.294501" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:51.252105" elapsed="0.042421"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:51.294622" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T01:00:51.294799" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T01:00:51.249303" elapsed="0.045521"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:51.294876" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:00:51.295020" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:51.238816" elapsed="0.056229"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T01:00:51.233910" elapsed="0.061196"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:00:51.229077" elapsed="0.066063"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:00:51.228943" elapsed="0.066229"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.306881" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:51.306581" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:51.306954" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:51.307103" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:51.306218" elapsed="0.000910"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.313976" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:51.313723" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.314425" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:51.314181" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:51.323517" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:51.323599" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:51 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:51 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782851,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:51.323693" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:51.316882" elapsed="0.006837"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:51.314555" elapsed="0.009206"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:51.323942" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:51.323787" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.314521" elapsed="0.009547"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.327872" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782851,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:51.325118" elapsed="0.002887"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:51.324869" elapsed="0.003176"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.324851" elapsed="0.003220"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.332186" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:51.328363" elapsed="0.003905"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:51.328130" elapsed="0.004191"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.328112" elapsed="0.004243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.333158" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:51.332627" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:51.333677" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:51.333313" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.334778" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:51.334019" elapsed="0.000798"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:51.333794" elapsed="0.001074"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.333282" elapsed="0.001616"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.335768" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:51.335170" elapsed="0.000636"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:51.336286" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:51.335907" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.337143" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:51.336639" elapsed="0.000545"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:51.336411" elapsed="0.000811"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.335882" elapsed="0.001361"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:51.337406" elapsed="0.000516"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:51.338435" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:51.338094" elapsed="0.000368"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:51.338638" elapsed="0.013637"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:51.324425" elapsed="0.027930"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:51.352792" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T01:00:51.352439" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:51.352416" elapsed="0.000482"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:51.353075" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:51.353149" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T01:00:51.355642" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782851,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:51.307461" elapsed="0.048220"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:51.355737" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:00:51.355901" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782851,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:51.305765" elapsed="0.050163"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.357339" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782851, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:51.356876" elapsed="0.000493"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:51.357418" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:51.357595" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782851, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:51.356213" elapsed="0.001465"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:51.358062" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:51.357873" elapsed="0.000217"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.358841" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:51.358269" elapsed="0.000599"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.359319" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:51.359046" elapsed="0.000300"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:51.359905" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:51.359523" elapsed="0.000487">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:51.301102" elapsed="0.059023">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:52.373763" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:52.373131" elapsed="0.000681"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:52.373896" elapsed="0.000083"/>
</return>
<msg time="2026-04-10T01:00:52.374192" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:52.372570" elapsed="0.001660"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:52.387779" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:52.387042" elapsed="0.000862"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:52.388877" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:52.388271" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:52.401199" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:52.401258" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:52 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:52 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782852,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:52.401359" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:52.394029" elapsed="0.007356"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:52.389146" elapsed="0.012283"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:52.401643" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:52.401459" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:52.389098" elapsed="0.012633"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:52.405976" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782852,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:52.402841" elapsed="0.003204"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:52.402617" elapsed="0.003477"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:52.402599" elapsed="0.003528"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:52.410251" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:52.406514" elapsed="0.003803"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:52.406205" elapsed="0.004160"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:52.406181" elapsed="0.004217"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:52.411225" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:52.410685" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:52.411715" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:52.411359" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:52.412805" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:52.412058" elapsed="0.000867"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:52.411828" elapsed="0.001152"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:52.411335" elapsed="0.001676"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:52.413770" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:52.413239" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:52.414233" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:52.413906" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:52.415308" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:52.414613" elapsed="0.000733"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:52.414347" elapsed="0.001051"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:52.413881" elapsed="0.001547"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:52.415667" elapsed="0.000660"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:52.416915" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:52.416581" elapsed="0.000361"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:52.417099" elapsed="0.012698"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:52.402147" elapsed="0.027718"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:52.430048" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T01:00:52.429937" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:52.429918" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:52.430298" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:52.430369" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:52.432959" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782852,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:52.374769" elapsed="0.058219"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:52.433041" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:52.433193" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782852,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:52.371789" elapsed="0.061430"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:52.434196" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782852, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:52.433801" elapsed="0.000424"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:52.434272" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:52.434425" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782852, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:52.433443" elapsed="0.001009"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:52.435002" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:52.434821" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:52.435501" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:52.435203" elapsed="0.000324"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:52.435978" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:52.435718" elapsed="0.000284"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:52.436555" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:52.436172" elapsed="0.000458">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:52.361659" elapsed="0.075085">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:53.449477" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:53.448939" elapsed="0.000583"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:53.449625" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T01:00:53.449877" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:53.448357" elapsed="0.001558"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:53.458452" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:53.458190" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:53.458921" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:53.458675" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:53.474703" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:53.474835" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:53 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:53 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782853,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:53.475046" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:53.461196" elapsed="0.013908"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:53.459038" elapsed="0.016162"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:53.475645" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:53.475261" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:53.459018" elapsed="0.016824"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:53.483454" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782853,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:53.478207" elapsed="0.005321"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:53.477706" elapsed="0.005904"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:53.477665" elapsed="0.005982"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:53.488598" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:53.484065" elapsed="0.004625"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:53.483731" elapsed="0.005019"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:53.483706" elapsed="0.005080"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:53.489672" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:53.489062" elapsed="0.000650"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:53.490173" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:53.489816" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:53.491310" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:53.490537" elapsed="0.000814"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:53.490294" elapsed="0.001112"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:53.489790" elapsed="0.001648"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:53.492270" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:53.491727" elapsed="0.000582"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:53.492818" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:53.492412" elapsed="0.000495"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:53.493826" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:53.493182" elapsed="0.000672"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:53.492942" elapsed="0.000948"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:53.492387" elapsed="0.001524"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:53.494067" elapsed="0.000449"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:53.495101" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:53.494769" elapsed="0.000359"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:53.495287" elapsed="0.013210"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:53.476715" elapsed="0.031896"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:53.508912" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T01:00:53.508785" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:53.508756" elapsed="0.000257"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:53.509188" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:53.509264" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T01:00:53.512106" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782853,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:53.450436" elapsed="0.061701"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:53.512193" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:00:53.512353" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782853,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:53.447641" elapsed="0.064740"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:53.513605" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782853, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:53.513134" elapsed="0.000501"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:53.513686" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:53.513844" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782853, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:53.512739" elapsed="0.001132"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:53.514237" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:53.514053" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:53.514795" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:53.514441" elapsed="0.000381"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:53.515266" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:53.515000" elapsed="0.000292"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:53.516143" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:53.515468" elapsed="0.000749">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:53.437851" elapsed="0.078480">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:54.529652" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:54.529072" elapsed="0.000626"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:54.529778" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T01:00:54.530016" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:54.528461" elapsed="0.001593"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:54.539902" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:54.539515" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:54.540523" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:54.540186" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:54.551021" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:54.551151" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:54 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:54 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782854,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:54.551251" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:54.543725" elapsed="0.007552"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:54.540710" elapsed="0.010612"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:54.551505" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:54.551349" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:54.540680" elapsed="0.010929"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:54.556932" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782854,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:54.552648" elapsed="0.004364"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:54.552405" elapsed="0.004645"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:54.552387" elapsed="0.004688"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:54.561112" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:54.557361" elapsed="0.003819"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:54.557133" elapsed="0.004097"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:54.557116" elapsed="0.004148"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:54.562069" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:54.561507" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:54.562535" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:54.562204" elapsed="0.000463"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:54.563661" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:54.562925" elapsed="0.000777"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:54.562699" elapsed="0.001056"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:54.562179" elapsed="0.001605"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:54.564775" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:54.564007" elapsed="0.000813"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:54.565296" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:54.564922" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:54.566170" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:54.565665" elapsed="0.000531"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:54.565409" elapsed="0.000823"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:54.564897" elapsed="0.001356"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:54.566407" elapsed="0.000466"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:54.567376" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:54.567041" elapsed="0.000361"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:54.567574" elapsed="0.013512"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:54.551976" elapsed="0.029180"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:54.581337" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T01:00:54.581227" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:54.581209" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:54.581740" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:54.581813" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:54.584158" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782854,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:54.530577" elapsed="0.053655"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:54.584287" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:54.584440" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782854,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:54.527793" elapsed="0.056673"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:54.585495" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782854, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:54.585095" elapsed="0.000428"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:54.585759" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:54.585917" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782854, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:54.584713" elapsed="0.001230"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:54.586300" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:54.586122" elapsed="0.000203"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:54.586859" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:54.586501" elapsed="0.000387"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:54.587331" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:54.587064" elapsed="0.000293"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:54.587915" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:54.587562" elapsed="0.000422">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:54.517336" elapsed="0.070757">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:55.602596" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:55.602179" elapsed="0.000452"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:55.602695" elapsed="0.000048"/>
</return>
<msg time="2026-04-10T01:00:55.602888" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:55.601800" elapsed="0.001115"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:55.610406" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:55.610132" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:55.610883" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:55.610630" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:55.619038" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:55.619125" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:55 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:55 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782855,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:55.619261" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:55.613188" elapsed="0.006110"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:55.611011" elapsed="0.008350"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:55.619670" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:55.619399" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:55.610989" elapsed="0.008810"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:55.625200" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782855,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:55.621267" elapsed="0.004009"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:55.620939" elapsed="0.004499"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:55.620914" elapsed="0.004564"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:55.629781" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:55.625909" elapsed="0.003923"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:55.625581" elapsed="0.004286"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:55.625536" elapsed="0.004355"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:55.630505" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:55.630083" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:55.630886" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:55.630642" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:55.631677" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:55.631138" elapsed="0.000566"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:55.630971" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:55.630623" elapsed="0.001140"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:55.632306" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:55.631925" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:55.632668" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:55.632411" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:55.633460" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:55.632911" elapsed="0.000577"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:55.632751" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:55.632392" elapsed="0.001172"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:55.633728" elapsed="0.000453"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:55.634738" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:55.634362" elapsed="0.000404"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:55.634928" elapsed="0.013891"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:55.620325" elapsed="0.028621"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:55.649191" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T01:00:55.649055" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:55.649025" 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-04-10T01:00:55.649532" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:55.649652" elapsed="0.000019"/>
</return>
<msg time="2026-04-10T01:00:55.652295" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782855,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:55.603274" elapsed="0.049056"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:55.652392" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T01:00:55.652777" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782855,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:55.600621" elapsed="0.052187"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:55.654070" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782855, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:55.653590" elapsed="0.000509"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:55.654149" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:55.654308" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782855, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:55.653091" elapsed="0.001319"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:55.655141" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:55.654940" elapsed="0.000228"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:55.655703" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:55.655352" elapsed="0.000378"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:55.656195" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:55.655910" elapsed="0.000313"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:55.656803" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:55.656402" elapsed="0.000484">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:55.589147" elapsed="0.067859">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:56.669596" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:56.669096" elapsed="0.000535"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:56.669691" elapsed="0.000077"/>
</return>
<msg time="2026-04-10T01:00:56.669923" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:56.668661" elapsed="0.001290"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:56.677083" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:56.676811" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:56.677581" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:56.677292" elapsed="0.000336"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:56.684504" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:56.684594" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:56 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:56 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782856,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:56.684698" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:56.679974" elapsed="0.004752"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:56.677706" elapsed="0.007065"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:56.684964" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:56.684801" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:56.677685" elapsed="0.007368"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:56.688996" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782856,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:56.686174" elapsed="0.002899"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:56.685940" elapsed="0.003178"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:56.685921" elapsed="0.003229"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:56.692402" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:56.689489" elapsed="0.002965"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:56.689226" elapsed="0.003265"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:56.689204" elapsed="0.003311"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:56.693279" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:56.692735" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:56.693648" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:56.693380" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:56.694488" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:56.693951" elapsed="0.000565"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:56.693780" elapsed="0.000866"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:56.693362" elapsed="0.001310"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:56.695466" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:56.694906" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:56.696001" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:56.695642" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:56.697183" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:56.696388" elapsed="0.000836"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:56.696124" elapsed="0.001154"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:56.695613" elapsed="0.001697"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:56.697568" elapsed="0.000703"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:56.699072" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:56.698511" elapsed="0.000600"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:56.699376" elapsed="0.013826"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:56.685437" elapsed="0.027844"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:56.713490" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T01:00:56.713366" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:56.713343" elapsed="0.000267"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:56.713874" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:56.713972" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T01:00:56.717006" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782856,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:56.670306" elapsed="0.046732"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:56.717093" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:56.717251" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782856,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:56.668120" elapsed="0.049158"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:56.718585" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782856, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:56.718115" elapsed="0.000501"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:56.718667" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:56.718829" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782856, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:56.717530" elapsed="0.001326"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:56.719221" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:56.719038" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:56.719787" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:56.719439" elapsed="0.000374"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:56.720249" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:56.719989" elapsed="0.000285"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:56.720820" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:56.720445" elapsed="0.000449">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:56.658005" elapsed="0.063001">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:57.733575" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:57.733070" elapsed="0.000648"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:57.733798" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T01:00:57.734030" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:57.732561" elapsed="0.001505"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:57.742579" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:57.742304" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:57.743035" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:57.742790" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:57.749573" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:57.749634" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:57 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:57 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782857,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:57.749730" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:57.745293" elapsed="0.004464"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:57.743153" elapsed="0.006653"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:57.749992" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:57.749834" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:57.743133" elapsed="0.006947"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:57.753873" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782857,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:57.751146" elapsed="0.002779"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:57.750922" elapsed="0.003038"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:57.750903" elapsed="0.003082"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:57.757910" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:57.754308" elapsed="0.003669"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:57.754043" elapsed="0.003982"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:57.754026" elapsed="0.004034"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:57.758899" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:57.758326" elapsed="0.000611"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:57.759361" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:57.759033" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:57.760436" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:57.759724" elapsed="0.000750"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:57.759475" elapsed="0.001048"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:57.759009" elapsed="0.001570"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:57.761318" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:57.760811" elapsed="0.000544"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:57.761806" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:57.761452" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:57.762907" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:57.762161" elapsed="0.000783"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:57.761920" elapsed="0.001074"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:57.761427" elapsed="0.001596"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:57.763236" elapsed="0.000639"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:57.764573" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:57.764110" elapsed="0.000553"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:57.764893" elapsed="0.013822"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:57.750469" elapsed="0.028312"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:57.778960" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T01:00:57.778853" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:57.778834" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:57.779202" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:57.779273" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:57.781867" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782857,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:57.734595" elapsed="0.047301"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:57.781948" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:57.782099" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782857,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:57.731882" elapsed="0.050261"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:57.783120" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782857, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:57.782720" elapsed="0.000428"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:57.783196" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:57.783350" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782857, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:57.782363" elapsed="0.001013"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:57.783748" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:57.783567" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:57.784246" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:57.783948" elapsed="0.000324"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:57.784726" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:57.784443" elapsed="0.000308"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:57.785266" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:57.784919" elapsed="0.000419">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:57.721914" elapsed="0.063534">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:58.797182" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:58.796656" elapsed="0.000573"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:58.797311" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T01:00:58.797571" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:58.796100" elapsed="0.001510"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:58.806213" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:58.805947" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:58.806701" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:58.806420" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:58.813343" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:58.813479" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:58 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:58 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782858,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:58.813606" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:58.808951" elapsed="0.004684"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:58.806823" elapsed="0.006857"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:58.813875" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:58.813709" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:58.806799" elapsed="0.007168"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:58.817914" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782858,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:58.815159" elapsed="0.002807"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:58.814892" elapsed="0.003112"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:58.814872" elapsed="0.003157"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:58.821176" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:58.818315" elapsed="0.002910"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:58.818087" elapsed="0.003172"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:58.818070" elapsed="0.003214"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:58.821886" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:58.821470" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:58.822226" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:58.821985" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:58.823036" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:58.822470" elapsed="0.000594"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:58.822307" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:58.821967" elapsed="0.001155"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:58.823667" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:58.823283" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:58.824000" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:58.823765" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:58.824757" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:58.824241" elapsed="0.000543"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:58.824079" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:58.823747" elapsed="0.001093"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:58.824997" elapsed="0.000443"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:58.825953" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:58.825622" elapsed="0.000358"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:58.826135" elapsed="0.012906"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:58.814349" elapsed="0.024770"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:58.839319" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T01:00:58.839201" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:58.839179" elapsed="0.000240"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:58.839607" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:58.839681" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:00:58.842216" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782858,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:58.798138" elapsed="0.044172"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:58.842366" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:58.842620" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782858,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:58.795366" elapsed="0.047285"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:58.843763" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782858, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:58.843282" elapsed="0.000510"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:58.843839" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:00:58.843996" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782858, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:58.842901" elapsed="0.001121"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:58.844400" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:58.844215" elapsed="0.000211"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:58.845093" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:58.844779" elapsed="0.000340"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:58.845565" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:58.845291" elapsed="0.000301"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:58.846119" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:58.845764" elapsed="0.000430">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:58.786270" elapsed="0.060038">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:59.857711" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:59.857195" elapsed="0.000559"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:00:59.857831" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T01:00:59.858057" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:00:59.856695" elapsed="0.001398"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:59.868031" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:59.867685" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:59.868498" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:59.868249" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:00:59.875303" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:00:59.875365" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:00:59 GMT', 'Expires': 'Fri, 10 Apr 2026 00:00:59 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782859,"status":200} 
 </msg>
<msg time="2026-04-10T01:00:59.875470" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:00:59.870795" elapsed="0.004701"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:59.868641" elapsed="0.006930"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:59.875768" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:59.875604" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:59.868618" elapsed="0.007247"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:59.881367" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782859,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:59.877380" elapsed="0.004071"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:59.877060" elapsed="0.004597"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:59.877034" elapsed="0.004665"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:00:59.886185" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:00:59.882162" elapsed="0.004108"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:59.881795" elapsed="0.004536"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:59.881767" elapsed="0.004606"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:59.887477" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:59.886814" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:59.887972" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:59.887659" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:59.888785" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:59.888224" elapsed="0.000589"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:59.888057" elapsed="0.000792"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:59.887629" elapsed="0.001242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:59.889409" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:59.889035" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:59.889763" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:00:59.889507" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:00:59.890510" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:00:59.890005" elapsed="0.000531"/>
</kw>
<status status="PASS" start="2026-04-10T01:00:59.889845" elapsed="0.000742"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:59.889489" elapsed="0.001121"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:00:59.890780" elapsed="0.000474"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:00:59.891771" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:59.891421" elapsed="0.000377"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:00:59.892126" elapsed="0.017109"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:00:59.876413" elapsed="0.032959"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:00:59.909695" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-10T01:00:59.909505" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-10T01:00:59.909466" elapsed="0.000363"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:00:59.910097" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:00:59.910187" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T01:00:59.916375" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782859,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:00:59.858584" elapsed="0.057880"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:00:59.917140" elapsed="0.000111"/>
</return>
<msg time="2026-04-10T01:00:59.917714" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782859,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:59.856004" elapsed="0.061783"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:00:59.920130" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782859, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:00:59.919374" elapsed="0.000786"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:00:59.920211" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:00:59.920369" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782859, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:00:59.918378" elapsed="0.002105"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:00:59.920895" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:00:59.920696" elapsed="0.000226"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:59.921469" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:59.921108" elapsed="0.000390"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:00:59.922057" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:00:59.921735" elapsed="0.000350"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:00:59.922650" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:00:59.922266" elapsed="0.000459">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:00:59.847415" elapsed="0.075424">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:00.936857" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:00.936470" elapsed="0.000420"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:00.936948" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T01:01:00.937112" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:00.936107" elapsed="0.001030"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:00.944223" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:00.943962" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:00.944687" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:00.944427" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:00.951441" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:00.951501" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:00 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782860,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:00.951621" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:00.946935" elapsed="0.004713"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:00.944805" elapsed="0.006886"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:00.951872" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:00.951718" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:00.944784" elapsed="0.007172"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:00.956167" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782860,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:00.953005" elapsed="0.003231"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:00.952778" elapsed="0.003507"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:00.952760" elapsed="0.003559"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:00.960883" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:00.956755" elapsed="0.004199"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:00.956397" elapsed="0.004607"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:00.956374" elapsed="0.004665"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:00.961864" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:00.961292" elapsed="0.000610"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:00.962331" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:00.962000" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:00.963686" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:00.962710" elapsed="0.001018"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:00.962444" elapsed="0.001435"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:00.961976" elapsed="0.001934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:00.964454" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:00.964076" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:00.964830" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:00.964589" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:00.965653" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:00.965074" elapsed="0.000608"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:00.964913" elapsed="0.000813"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:00.964534" elapsed="0.001224"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:00.965983" elapsed="0.000519"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:00.967028" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:00.966693" elapsed="0.000362"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:00.967212" elapsed="0.012592"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:00.952329" elapsed="0.027549"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:00.980068" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T01:01:00.979954" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:00.979935" elapsed="0.000230"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:00.980321" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:00.980392" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:00.982940" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782860,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:00.937479" elapsed="0.045491"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:00.983022" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:00.983175" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782860,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:00.935105" elapsed="0.048096"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:00.984269" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782860, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:00.983865" elapsed="0.000432"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:00.984345" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:00.984499" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782860, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:00.983481" elapsed="0.001044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:00.985135" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:00.984954" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:00.985653" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:00.985334" elapsed="0.000346"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:00.986117" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:00.985851" elapsed="0.000291"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:00.986677" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:00.986311" elapsed="0.000438">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:00.923859" elapsed="0.063001">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:01.999471" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:01.998911" elapsed="0.000784"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:01.999836" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T01:01:02.000091" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:01.998315" elapsed="0.001815"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:02.007517" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:02.007222" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:02.008097" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:02.007762" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:02.017974" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:02.018037" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:02 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:02 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782862,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:02.018134" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:02.010426" elapsed="0.007734"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:02.008222" elapsed="0.009982"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:02.018406" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:02.018233" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:02.008201" elapsed="0.010300"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:02.022969" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782862,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:02.019567" elapsed="0.003474"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:02.019321" elapsed="0.003768"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:02.019300" elapsed="0.003824"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:02.027612" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:02.023522" elapsed="0.004163"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:02.023204" elapsed="0.004531"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:02.023180" elapsed="0.004591"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:02.028622" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:02.028042" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:02.029099" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:02.028761" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:02.030182" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:02.029437" elapsed="0.000784"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:02.029211" elapsed="0.001061"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:02.028735" elapsed="0.001570"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:02.031093" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:02.030534" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:02.031615" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:02.031230" elapsed="0.000474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:02.032750" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:02.032015" elapsed="0.000775"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:02.031738" elapsed="0.001102"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:02.031204" elapsed="0.001666"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:02.033057" elapsed="0.000453"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:02.034030" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:02.033696" elapsed="0.000402"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:02.034259" elapsed="0.013304"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:02.018887" elapsed="0.028746"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:02.047847" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T01:01:02.047707" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:02.047688" elapsed="0.000251"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:02.048094" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:02.048166" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:02.050693" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782862,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:02.000720" elapsed="0.050004"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:02.050778" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T01:01:02.050981" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782862,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:01.997632" elapsed="0.053377"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:02.052104" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782862, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:02.051620" elapsed="0.000514"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:02.052193" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T01:01:02.052378" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782862, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:02.051243" elapsed="0.001167"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:02.053023" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:02.052829" elapsed="0.000221"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:02.053539" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:02.053229" elapsed="0.000353"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:02.054025" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:02.053756" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:02.054598" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:02.054223" elapsed="0.000451">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:01.987723" elapsed="0.067062">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.067625" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:03.067023" elapsed="0.000653"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:03.067773" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T01:01:03.068039" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:03.066392" elapsed="0.001698"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.077969" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.077597" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.078505" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.078226" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:03.085930" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:03.086092" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:03 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:03 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782863,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:03.086256" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:03.080994" elapsed="0.005300"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.078660" elapsed="0.007697"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:03.086696" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:03.086428" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.078635" elapsed="0.008184"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.092545" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782863,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.088429" elapsed="0.004248"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.088067" elapsed="0.004666"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.088038" elapsed="0.004730"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.096896" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.093171" elapsed="0.003774"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.092847" elapsed="0.004134"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.092824" elapsed="0.004181"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.097618" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:03.097194" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:03.098018" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:03.097764" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.098876" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:03.098264" elapsed="0.000640"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.098101" elapsed="0.000840"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.097742" elapsed="0.001221"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.099500" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:03.099124" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:03.099899" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:03.099618" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.100782" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:03.100147" elapsed="0.000664"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.099986" elapsed="0.000861"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.099599" elapsed="0.001270"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:03.101028" elapsed="0.000454"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:03.102174" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:03.101690" elapsed="0.000514"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:03.102367" elapsed="0.015049"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:03.087366" elapsed="0.030123"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:03.117702" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T01:01:03.117586" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.117564" elapsed="0.000241"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:03.117973" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:03.118048" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:03.120510" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782863,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:03.068815" elapsed="0.051820"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:03.120694" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:03.120853" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782863,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:03.065306" elapsed="0.055574"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.122232" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782863, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:03.121782" elapsed="0.000480"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:03.122312" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:01:03.122472" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782863, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:03.121324" elapsed="0.001186"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:03.122943" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:03.122753" elapsed="0.000229"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.123491" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:03.123177" elapsed="0.000342"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.124180" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:03.123897" elapsed="0.000309"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T01:01:03.124412" elapsed="0.000332"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T01:01:03.055907" elapsed="0.068899"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T01:00:51.300496" elapsed="11.824362"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T01:00:51.300095" elapsed="11.824837"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:00:51.295360" elapsed="11.829608"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:00:51.295224" elapsed="11.829787"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.188393" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:03.187974" elapsed="0.000453"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:03.188487" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T01:01:03.188675" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:03.187609" elapsed="0.001091"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.195625" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.195295" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.196101" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.195848" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:03.204255" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:03.204355" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:03 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:03 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782863,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:03.204487" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:03.198425" elapsed="0.006091"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.196222" elapsed="0.008364"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:03.204812" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:03.204617" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.196201" elapsed="0.008787"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.210404" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782863,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.206505" elapsed="0.003978"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.206178" elapsed="0.004361"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.206151" elapsed="0.004446"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.214536" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.211037" elapsed="0.003590"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.210687" elapsed="0.003992"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.210660" elapsed="0.004054"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.215783" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:03.215003" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:03.216266" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:03.215925" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.217105" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:03.216661" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.216408" elapsed="0.000791"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.215900" elapsed="0.001331"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.218066" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:03.217494" elapsed="0.000613"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:03.218837" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:03.218396" elapsed="0.000533"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.219872" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:03.219397" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.218965" elapsed="0.000998"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.218369" elapsed="0.001625"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:03.220474" elapsed="0.000577"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:03.221521" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:03.221222" elapsed="0.000340"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:03.221726" elapsed="0.002601"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:03.205525" elapsed="0.018877"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:03.224618" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T01:01:03.224485" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.224464" elapsed="0.000253"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:03.224878" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:03.224951" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:03.227421" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782863,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:03.189045" elapsed="0.038407"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:03.227509" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T01:01:03.227688" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782863,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:03.187130" elapsed="0.040585"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T01:01:03.227763" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T01:01:03.227912" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782863,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T01:01:03.182538" elapsed="0.045482"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.229192" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782863, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:03.228728" elapsed="0.000493"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:03.229270" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:03.229426" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782863, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:03.228278" elapsed="0.001173"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:03.229838" level="INFO">${value} = 10000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:03.229651" elapsed="0.000214"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.230344" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T01:01:03.230049" elapsed="0.000353"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 10000.</doc>
<status status="PASS" start="2026-04-10T01:01:03.181910" elapsed="0.048552"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:01:03.125432" elapsed="0.105066"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:01:03.125271" elapsed="0.105263"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T01:00:51.226695" elapsed="12.003918"/>
</kw>
<var name="${index}">4</var>
<status status="PASS" start="2026-04-10T01:00:34.453401" elapsed="28.777254"/>
</iter>
<iter>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.231190" level="INFO">5</msg>
<arg>${index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.230940" elapsed="0.000294"/>
</kw>
<kw name="Delete Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Delete Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.243027" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:03.242633" elapsed="0.000427"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:03.243121" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T01:01:03.243299" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:03.242239" elapsed="0.001092"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.264848" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.264130" elapsed="0.000837"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.265385" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.265143" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.265880" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.265604" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.266380" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.266107" elapsed="0.000337"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:03.267314" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T01:01:03.267104" elapsed="0.000238"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T01:01:03.267687" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T01:01:03.267497" elapsed="0.000215"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T01:01:03.267864" elapsed="0.000203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.268526" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.268228" elapsed="0.000359"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T01:01:03.268636" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T01:01:03.268818" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T01:01:03.266679" elapsed="0.002164"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:03.284224" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Content-Length': '402', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T01:01:03.284540" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:03.284785" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:03.271293" elapsed="0.013551"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.268926" elapsed="0.016021"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:03.285349" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:03.285006" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.268906" elapsed="0.016670"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.293378" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.287983" elapsed="0.005461"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.287454" elapsed="0.006042"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.287414" elapsed="0.006120"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.297716" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.293971" elapsed="0.003818"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.293640" elapsed="0.004201"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.293614" elapsed="0.004263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.298736" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:03.298139" elapsed="0.000638"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:03.299233" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:03.298881" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.300066" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:03.299618" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.299354" elapsed="0.000804"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.298854" elapsed="0.001335"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.301034" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:03.300490" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:03.301491" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:03.301168" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.302151" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:03.301836" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.301627" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.301141" elapsed="0.001097"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:03.302414" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:03.303260" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:03.302967" elapsed="0.000320"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:03.303485" elapsed="0.002578"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:03.286372" elapsed="0.019756"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:01:03.306310" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:03.306202" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.306183" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:01:03.309324" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:01:03.306529" elapsed="0.002823"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:01:03.309400" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:01:03.309574" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:03.257770" elapsed="0.051831"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:03.309721" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:03.309877" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T01:01:03.251925" elapsed="0.057977"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:03.309955" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:01:03.310102" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:03.241743" elapsed="0.068384"/>
</kw>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Delete Bulk Flow in member 1 according to ${json_body_del}.</doc>
<status status="PASS" start="2026-04-10T01:01:03.236679" elapsed="0.073513"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.317922" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:03.317214" elapsed="0.000769"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:03.318085" elapsed="0.000062"/>
</return>
<msg time="2026-04-10T01:01:03.318412" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:03.316712" elapsed="0.001756"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.326902" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.326646" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.327351" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.327110" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:03.334861" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:03.334919" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:03 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:03 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782863,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:03.335011" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:03.329635" elapsed="0.005401"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.327460" elapsed="0.007619"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:03.335260" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:03.335105" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.327442" elapsed="0.007902"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.339981" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782863,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.336432" elapsed="0.003622"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.336151" elapsed="0.003954"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.336133" elapsed="0.004009"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.344512" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:03.340598" elapsed="0.004013"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.340225" elapsed="0.004438"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.340200" elapsed="0.004500"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.345337" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:03.344950" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:03.345691" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:03.345438" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.346244" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:03.345936" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.345773" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.345420" elapsed="0.000945"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.346916" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:03.346531" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:03.347249" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:03.347013" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.347807" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:03.347492" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:03.347329" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.346995" elapsed="0.000895"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:03.348041" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:03.348873" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:03.348595" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:03.349061" elapsed="0.002457"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:03.335721" elapsed="0.015877"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:03.351776" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T01:01:03.351669" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:03.351651" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:03.352018" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:03.352089" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:03.354520" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782863,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:03.319227" elapsed="0.035336"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:03.354617" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T01:01:03.354768" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782863,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:03.316207" elapsed="0.038587"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.355776" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782863, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:03.355358" elapsed="0.000447"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:03.355854" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:03.356010" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782863, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:03.355015" elapsed="0.001021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:03.356413" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:03.356214" elapsed="0.000225"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.356937" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:03.356632" elapsed="0.000330"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.357396" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:03.357133" elapsed="0.000288"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:03.357964" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:03.357608" elapsed="0.000427">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:03.311417" elapsed="0.046730">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.370946" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:04.370576" elapsed="0.000402"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:04.371147" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:01:04.371317" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:04.370196" elapsed="0.001147"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.378566" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:04.378283" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.379025" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:04.378775" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:04.386114" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:04.386174" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:04 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:04 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782864,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:04.386269" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:04.381354" elapsed="0.004941"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:04.379152" elapsed="0.007186"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:04.386521" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:04.386366" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.379124" elapsed="0.007510"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.390856" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782864,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:04.387665" elapsed="0.003265"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:04.387425" elapsed="0.003558"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.387407" elapsed="0.003611"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.395216" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:04.391434" elapsed="0.003851"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:04.391102" elapsed="0.004234"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.391077" elapsed="0.004296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.396227" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:04.395654" elapsed="0.000613"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:04.396745" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:04.396370" elapsed="0.000496"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.397402" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:04.397098" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:04.396901" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.396344" elapsed="0.001141"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.398030" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:04.397661" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:04.398360" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:04.398127" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.398923" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:04.398621" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:04.398442" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.398110" elapsed="0.000896"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:04.399165" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:04.399997" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:04.399699" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:04.400227" elapsed="0.002580"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:04.386999" elapsed="0.015873"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:04.403052" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T01:01:04.402945" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.402926" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:04.403290" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:04.403362" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:04.405882" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782864,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:04.371714" elapsed="0.034197"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:04.405966" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:04.406128" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782864,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:04.369706" elapsed="0.036449"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.407215" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782864, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:04.406798" elapsed="0.000446"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:04.407293" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:04.407448" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782864, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:04.406383" elapsed="0.001092"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:04.407852" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:04.407669" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.408354" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:04.408054" elapsed="0.000326"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.408868" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:04.408566" elapsed="0.000329"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T01:01:04.409073" elapsed="0.000310"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T01:01:04.359226" elapsed="0.050217"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T01:01:03.310835" elapsed="1.098659"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 1.</doc>
<status status="PASS" start="2026-04-10T01:01:03.310416" elapsed="1.099163"/>
</kw>
<arg>${temp_json_config_del_ten_percent}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Delete Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T01:01:03.236014" elapsed="1.173624"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.419747" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T01:01:04.419355" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.420232" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T01:01:04.419936" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T01:01:04.420302" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:04.420456" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T01:01:04.418973" elapsed="0.001507"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.431391" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:04.431083" elapsed="0.000337"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:04.431468" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:04.431636" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:04.430676" elapsed="0.000986"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.446855" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:04.446597" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.447304" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:04.447061" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.447771" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:04.447506" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.448213" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:04.447972" elapsed="0.000285"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:04.449091" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T01:01:04.448898" elapsed="0.000219"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T01:01:04.449443" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T01:01:04.449273" elapsed="0.000195"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T01:01:04.449634" elapsed="0.000190"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.450237" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:04.449987" elapsed="0.000293"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T01:01:04.450322" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:04.450475" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T01:01:04.448458" elapsed="0.002042"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:04.463382" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T01:01:04.463442" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:04.463573" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:04.452742" elapsed="0.010860"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:04.450590" elapsed="0.013063"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:04.463862" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:04.463684" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.450570" elapsed="0.013380"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.472189" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:04.466274" elapsed="0.006013"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:04.465766" elapsed="0.006599"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.465726" elapsed="0.006693"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.475500" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:04.473058" elapsed="0.002502"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:04.472570" elapsed="0.003025"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.472505" elapsed="0.003113"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.476192" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:04.475799" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:04.476530" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:04.476291" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.477186" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:04.476877" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:04.476628" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.476274" elapsed="0.000998"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.477818" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:04.477434" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:04.478155" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:04.477916" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.478709" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:04.478396" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:04.478236" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.477898" elapsed="0.000896"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:04.478952" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:04.479767" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:04.479467" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:04.479951" elapsed="0.002461"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:04.464720" elapsed="0.017757"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:01:04.482675" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:04.482566" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.482532" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:01:04.485355" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:01:04.482890" elapsed="0.002492"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:01:04.485430" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T01:01:04.485604" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:04.443779" elapsed="0.041851"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:04.485696" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:01:04.485846" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T01:01:04.441090" elapsed="0.044780"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:04.485922" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T01:01:04.486067" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:04.430209" elapsed="0.055882"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T01:01:04.425424" elapsed="0.060731"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:01:04.420707" elapsed="0.065483"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:01:04.420539" elapsed="0.065685"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.497850" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:04.497534" elapsed="0.000343"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:04.497923" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:04.498072" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:04.497185" elapsed="0.000912"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.505133" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:04.504880" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.505647" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:04.505383" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:04.512751" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:04.512809" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:04 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:04 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782864,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:04.512945" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:04.507922" elapsed="0.005049"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:04.505770" elapsed="0.007244"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:04.513200" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:04.513045" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.505746" elapsed="0.007540"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.518612" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782864,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:04.514468" elapsed="0.004216"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:04.514138" elapsed="0.004597"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.514112" elapsed="0.004659"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.522940" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:04.519193" elapsed="0.003795"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:04.518859" elapsed="0.004166"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.518829" elapsed="0.004224"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.523619" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:04.523219" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:04.523954" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:04.523719" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.524716" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:04.524191" elapsed="0.000553"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:04.524033" elapsed="0.000747"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.523701" elapsed="0.001100"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.525345" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:04.524983" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:04.525699" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:04.525442" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.526532" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:04.525945" elapsed="0.000631"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:04.525786" elapsed="0.000827"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.525424" elapsed="0.001210"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:04.526787" elapsed="0.000476"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:04.527759" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:04.527432" elapsed="0.000354"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:04.527943" elapsed="0.013128"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:04.513666" elapsed="0.027475"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:04.541399" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T01:01:04.541287" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:04.541266" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:04.541822" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:04.541897" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:04.544263" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782864,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:04.498433" elapsed="0.045859"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:04.544344" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:04.544495" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782864,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:04.496702" elapsed="0.047819"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.545535" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782864, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:04.545140" elapsed="0.000667"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:04.545857" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:04.546014" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782864, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:04.544761" elapsed="0.001280"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:04.546402" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:04.546221" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.546923" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:04.546619" elapsed="0.000331"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.547384" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:04.547123" elapsed="0.000286"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:04.547945" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:04.547597" elapsed="0.000421">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:04.492109" elapsed="0.056025">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:05.561620" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:05.561080" elapsed="0.000584"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:05.561771" elapsed="0.000060"/>
</return>
<msg time="2026-04-10T01:01:05.562019" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:05.560575" elapsed="0.001480"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:05.571810" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:05.571376" elapsed="0.000504"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:05.572535" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:05.572145" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:05.582956" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:05.583034" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:05 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:05 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782865,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:05.583154" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:05.575345" elapsed="0.007841"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:05.572739" elapsed="0.010573"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:05.583585" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:05.583352" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:05.572700" elapsed="0.010994"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:05.590947" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782865,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:05.585027" elapsed="0.005999"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:05.584744" elapsed="0.006336"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:05.584720" elapsed="0.006396"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:05.595195" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:05.591592" elapsed="0.003652"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:05.591204" elapsed="0.004076"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:05.591178" elapsed="0.004126"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:05.595923" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:05.595496" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:05.596264" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:05.596024" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:05.597043" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:05.596512" elapsed="0.000558"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:05.596347" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:05.596006" elapsed="0.001122"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:05.597709" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:05.597311" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:05.598042" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:05.597809" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:05.598824" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:05.598284" elapsed="0.000567"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:05.598124" elapsed="0.000764"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:05.597791" elapsed="0.001118"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:05.599066" elapsed="0.000454"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:05.600061" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:05.599723" elapsed="0.000365"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:05.600246" elapsed="0.013245"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:05.584187" elapsed="0.029423"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:05.613869" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-04-10T01:01:05.613715" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:05.613689" elapsed="0.000308"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:05.614208" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:05.614308" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T01:01:05.617949" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782865,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:05.562536" elapsed="0.055453"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:05.618063" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T01:01:05.618235" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782865,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:05.559885" elapsed="0.058376"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:05.619600" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782865, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:05.619177" elapsed="0.000453"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:05.619679" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:05.619836" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782865, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:05.618815" elapsed="0.001049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:05.620233" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:05.620045" elapsed="0.000216"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:05.620775" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:05.620443" elapsed="0.000368"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:05.621284" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:05.620995" elapsed="0.000337"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:05.621885" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:05.621512" elapsed="0.000445">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:05.549181" elapsed="0.072887">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:06.633419" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:06.632933" elapsed="0.000529"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:06.633538" elapsed="0.000074"/>
</return>
<msg time="2026-04-10T01:01:06.633820" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:06.632405" elapsed="0.001454"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:06.642597" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:06.642305" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:06.643082" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:06.642824" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:06.650130" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:06.650191" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:06 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782866,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:06.650311" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:06.645433" elapsed="0.004907"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:06.643203" elapsed="0.007183"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:06.650625" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:06.650415" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:06.643182" elapsed="0.007540"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:06.654908" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782866,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:06.651832" elapsed="0.003147"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:06.651582" elapsed="0.003446"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:06.651531" elapsed="0.003531"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:06.659369" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:06.655454" elapsed="0.003982"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:06.655139" elapsed="0.004348"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:06.655116" elapsed="0.004404"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:06.660374" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:06.659805" elapsed="0.000609"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:06.661001" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:06.660659" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:06.662151" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:06.661347" elapsed="0.000832"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:06.661117" elapsed="0.001100"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:06.660630" elapsed="0.001608"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:06.662801" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:06.662402" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:06.663140" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:06.662899" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:06.663958" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:06.663384" elapsed="0.000602"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:06.663223" elapsed="0.000804"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:06.662882" elapsed="0.001167"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:06.664217" elapsed="0.000498"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:06.665243" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:06.664894" elapsed="0.000376"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:06.665439" elapsed="0.013069"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:06.651108" elapsed="0.027485"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:06.678781" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T01:01:06.678669" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:06.678649" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:06.679029" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:06.679102" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:06.681730" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782866,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:06.634345" elapsed="0.047415"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:06.681846" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:06.682002" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782866,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:06.631730" elapsed="0.050299"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:06.683030" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782866, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:06.682623" elapsed="0.000436"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:06.683110" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:01:06.683270" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782866, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:06.682255" elapsed="0.001042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:06.683690" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:06.683480" elapsed="0.000236"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:06.684202" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:06.683896" elapsed="0.000333"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:06.684848" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:06.684404" elapsed="0.000471"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:06.685457" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:06.685097" elapsed="0.000431">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:06.623076" elapsed="0.062581">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:07.698625" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:07.697992" elapsed="0.000682"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:07.698758" elapsed="0.000059"/>
</return>
<msg time="2026-04-10T01:01:07.699009" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:07.697413" elapsed="0.001633"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:07.706391" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:07.706043" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:07.706891" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:07.706633" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:07.715021" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:07.715086" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:07 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:07 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782867,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:07.715220" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:07.709628" elapsed="0.005632"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:07.707024" elapsed="0.008307"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:07.715636" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:07.715375" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:07.706999" elapsed="0.008770"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:07.722743" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782867,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:07.718274" elapsed="0.004548"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:07.717892" elapsed="0.004983"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:07.717861" elapsed="0.005050"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:07.727700" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:07.723335" elapsed="0.004416"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:07.722996" elapsed="0.004791"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:07.722971" elapsed="0.004841"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:07.728404" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:07.728000" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:07.728767" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:07.728505" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:07.729531" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:07.729018" elapsed="0.000556"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:07.728852" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:07.728486" elapsed="0.001148"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:07.730169" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:07.729797" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:07.730535" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:07.730294" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:07.731330" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:07.730816" elapsed="0.000610"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:07.730651" elapsed="0.000816"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:07.730275" elapsed="0.001214"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:07.731682" elapsed="0.000466"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:07.732678" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:07.732321" elapsed="0.000385"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:07.732868" elapsed="0.013205"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:07.716464" elapsed="0.029696"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:07.746405" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T01:01:07.746281" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:07.746225" 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-04-10T01:01:07.746710" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:07.746786" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:07.749766" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782867,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:07.699455" elapsed="0.050343"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:07.749854" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:07.750013" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782867,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:07.696568" elapsed="0.053472"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:07.751185" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782867, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:07.750746" elapsed="0.000470"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:07.751266" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:07.751427" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782867, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:07.750329" elapsed="0.001125"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:07.751888" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:07.751694" elapsed="0.000221"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:07.752420" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:07.752100" elapsed="0.000347"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:07.752961" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:07.752681" elapsed="0.000306"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:07.753528" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:07.753165" elapsed="0.000597">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:07.686672" elapsed="0.067208">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:08.765451" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:08.764950" elapsed="0.000545"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:08.765595" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T01:01:08.765824" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:08.764422" elapsed="0.001438"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:08.774650" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:08.774356" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:08.775226" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:08.774968" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:08.783108" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:08.783177" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:08 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:08 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782868,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:08.783286" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:08.777597" elapsed="0.005716"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:08.775349" elapsed="0.008013"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:08.783594" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:08.783393" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:08.775327" elapsed="0.008359"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:08.788222" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782868,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:08.784889" elapsed="0.003415"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:08.784643" elapsed="0.003716"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:08.784621" elapsed="0.003775"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:08.793016" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:08.788889" elapsed="0.004199"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:08.788501" elapsed="0.004639"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:08.788466" elapsed="0.004711"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:08.794039" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:08.793449" elapsed="0.000629"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:08.794516" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:08.794178" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:08.795651" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:08.794902" elapsed="0.000788"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:08.794653" elapsed="0.001087"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:08.794153" elapsed="0.001617"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:08.796511" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:08.796000" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:08.797003" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:08.796671" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:08.798069" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:08.797341" elapsed="0.000766"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:08.797116" elapsed="0.001041"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:08.796646" elapsed="0.001541"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:08.798408" elapsed="0.000918"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:08.799911" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:08.799520" elapsed="0.000418"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:08.800097" elapsed="0.013055"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:08.784143" elapsed="0.029105"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:08.813474" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T01:01:08.813346" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:08.813319" elapsed="0.000375"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:08.813883" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:08.813956" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:08.816616" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782868,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:08.766345" elapsed="0.050302"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:08.816702" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:08.816862" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782868,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:08.763741" elapsed="0.053148"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:08.817971" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782868, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:08.817522" elapsed="0.000477"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:08.818049" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:08.818207" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782868, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:08.817134" elapsed="0.001100"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:08.818616" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:08.818416" elapsed="0.000227"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:08.819148" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:08.818840" elapsed="0.000336"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:08.819929" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:08.819347" elapsed="0.000608"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:08.820479" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:08.820127" elapsed="0.000440">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:08.754664" elapsed="0.066015">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:09.833249" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:09.832750" elapsed="0.000543"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:09.833371" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T01:01:09.833626" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:09.832215" elapsed="0.001448"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:09.842463" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:09.842194" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:09.842939" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:09.842688" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:09.849625" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:09.849688" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:09 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:09 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782869,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:09.849784" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:09.845240" elapsed="0.004570"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:09.843058" elapsed="0.006796"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:09.850121" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:09.849958" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:09.843038" elapsed="0.007172"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:09.854052" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782869,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:09.851303" elapsed="0.002801"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:09.851040" elapsed="0.003099"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:09.851021" elapsed="0.003143"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:09.857402" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:09.854494" elapsed="0.002956"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:09.854224" elapsed="0.003263"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:09.854204" elapsed="0.003307"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:09.858113" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:09.857708" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:09.858454" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:09.858213" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:09.859335" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:09.858729" elapsed="0.000636"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:09.858536" elapsed="0.000867"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:09.858194" elapsed="0.001231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:09.859990" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:09.859609" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:09.860332" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:09.860089" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:09.861111" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:09.860592" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:09.860414" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:09.860071" elapsed="0.001125"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:09.861353" elapsed="0.000501"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:09.862357" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:09.862026" elapsed="0.000358"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:09.862578" elapsed="0.013126"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:09.850610" elapsed="0.025163"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:09.875961" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T01:01:09.875846" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:09.875826" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:09.876205" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:09.876281" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:09.879272" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782869,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:09.834153" elapsed="0.045193"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:09.879475" elapsed="0.000104"/>
</return>
<msg time="2026-04-10T01:01:09.879883" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782869,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:09.831505" elapsed="0.048439"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:09.882390" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782869, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:09.881441" elapsed="0.001014"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:09.882597" elapsed="0.000069"/>
</return>
<msg time="2026-04-10T01:01:09.882957" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782869, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:09.880472" elapsed="0.002544"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:09.884162" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:09.883474" elapsed="0.000742"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:09.884964" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:09.884483" elapsed="0.000519"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:09.885683" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:09.885264" elapsed="0.000458"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:09.886499" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:09.885978" elapsed="0.000644">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:09.821690" elapsed="0.065096">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:10.898884" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:10.898452" elapsed="0.000465"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:10.898976" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T01:01:10.899163" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:10.898084" elapsed="0.001107"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:10.906765" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:10.906429" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:10.907227" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:10.906979" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:10.916846" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:10.916933" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:10 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:10 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782870,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:10.917078" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:10.909534" elapsed="0.007585"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:10.907352" elapsed="0.009829"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:10.917444" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:10.917224" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:10.907328" elapsed="0.010269"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:10.923108" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782870,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:10.919134" elapsed="0.004052"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:10.918800" elapsed="0.004445"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:10.918773" elapsed="0.004508"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:10.927789" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:10.923825" elapsed="0.004032"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:10.923369" elapsed="0.004540"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:10.923344" elapsed="0.004601"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:10.928853" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:10.928206" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:10.929452" elapsed="0.000248"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:10.929080" elapsed="0.000673"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:10.930800" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:10.930027" elapsed="0.000813"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:10.929789" elapsed="0.001102"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:10.929052" elapsed="0.001870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:10.931769" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:10.931154" elapsed="0.000656"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:10.932248" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:10.931914" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:10.933062" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:10.932513" elapsed="0.000577"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:10.932342" elapsed="0.000785"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:10.931887" elapsed="0.001262"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:10.933309" elapsed="0.000487"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:10.934305" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:10.933969" elapsed="0.000363"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:10.934498" elapsed="0.012802"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:10.918151" elapsed="0.029221"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:10.947574" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T01:01:10.947446" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:10.947427" 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-04-10T01:01:10.947856" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:10.947929" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:10.950434" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782870,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:10.899582" elapsed="0.050882"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:10.950518" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T01:01:10.950690" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782870,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:10.897590" elapsed="0.053127"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:10.951751" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782870, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:10.951309" elapsed="0.000471"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:10.951828" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:10.951984" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782870, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:10.950952" elapsed="0.001058"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:10.952375" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:10.952190" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:10.953131" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:10.952824" elapsed="0.000334"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:10.953611" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:10.953331" elapsed="0.000306"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:10.954220" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:10.953810" elapsed="0.000481">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:10.887788" elapsed="0.066614">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:11.968262" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:11.967707" elapsed="0.000620"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:11.968427" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T01:01:11.968697" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:11.966994" elapsed="0.001742"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:11.976990" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:11.976723" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:11.977446" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:11.977200" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:11.986119" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:11.986184" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:11 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:11 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782871,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:11.986289" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:11.980036" elapsed="0.006286"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:11.977618" elapsed="0.008760"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:11.986610" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:11.986409" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:11.977588" elapsed="0.009116"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:11.991775" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782871,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:11.987865" elapsed="0.003982"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:11.987613" elapsed="0.004285"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:11.987594" elapsed="0.004338"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:11.996144" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:11.992368" elapsed="0.003939"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:11.992012" elapsed="0.004355"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:11.991989" elapsed="0.004415"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:11.997241" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:11.996681" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:11.997621" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:11.997365" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:11.998399" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:11.997873" elapsed="0.000554"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:11.997707" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:11.997347" elapsed="0.001140"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:11.999049" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:11.998672" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:11.999388" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:11.999150" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:12.000168" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:11.999652" elapsed="0.000625"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:11.999472" elapsed="0.000848"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:11.999132" elapsed="0.001213"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:12.000504" elapsed="0.000479"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:12.001481" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:12.001152" elapsed="0.000356"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:12.001681" elapsed="0.012588"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:11.987120" elapsed="0.027219"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:12.014810" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T01:01:12.014421" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:12.014396" elapsed="0.000516"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:12.015070" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:12.015146" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:12.017658" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782871,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:11.969225" elapsed="0.048463"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:12.017743" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:12.017897" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782871,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:11.966295" elapsed="0.051629"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:12.019105" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782871, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:12.018507" elapsed="0.000626"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:12.019182" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:12.019338" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782871, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:12.018155" elapsed="0.001208"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:12.019743" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:12.019560" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:12.020283" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:12.019946" elapsed="0.000365"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:12.020769" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:12.020485" elapsed="0.000310"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:12.021342" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:12.020967" elapsed="0.000450">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:11.955527" elapsed="0.066001">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:13.032921" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:13.032510" elapsed="0.000445"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:13.033015" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T01:01:13.033188" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:13.032142" elapsed="0.001071"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:13.040091" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:13.039826" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:13.040646" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:13.040376" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:13.048796" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:13.048859" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:13 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:13 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782873,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:13.048960" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:13.042952" elapsed="0.006035"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:13.040799" elapsed="0.008234"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:13.049225" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:13.049062" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:13.040778" elapsed="0.008534"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:13.054981" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782873,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:13.050881" elapsed="0.004174"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:13.050525" elapsed="0.004584"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:13.050497" elapsed="0.004648"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:13.059688" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:13.055587" elapsed="0.004169"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:13.055228" elapsed="0.004578"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:13.055203" elapsed="0.004637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:13.060664" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:13.060092" elapsed="0.000649"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:13.061181" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:13.060843" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:13.062004" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:13.061478" elapsed="0.000554"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:13.061296" elapsed="0.000773"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:13.060818" elapsed="0.001273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:13.062657" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:13.062253" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:13.062990" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:13.062754" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:13.063752" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:13.063232" elapsed="0.000548"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:13.063071" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:13.062737" elapsed="0.001100"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:13.063994" elapsed="0.000487"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:13.065020" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:13.064666" elapsed="0.000380"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:13.065204" elapsed="0.012874"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:13.049883" elapsed="0.028272"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:13.078353" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T01:01:13.078239" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:13.078218" elapsed="0.000344"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:13.078738" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:13.078813" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:13.081569" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782873,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:13.033578" elapsed="0.048022"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:13.081654" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:13.081810" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782873,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:13.031658" elapsed="0.050178"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:13.082894" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782873, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:13.082454" elapsed="0.000468"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:13.082970" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:13.083162" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782873, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:13.082078" elapsed="0.001111"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:13.083658" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:13.083384" elapsed="0.000301"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:13.084203" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:13.083877" elapsed="0.000352"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:13.084681" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:13.084403" elapsed="0.000318"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:13.085382" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:13.084894" elapsed="0.000562">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:13.022445" elapsed="0.063137">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:14.096826" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:14.096283" elapsed="0.000592"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:14.096956" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T01:01:14.097222" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:14.095755" elapsed="0.001505"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:14.107455" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:14.107166" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:14.107939" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:14.107687" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:14.114525" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:14.114613" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:14 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:14 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782874,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:14.114724" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:14.110322" elapsed="0.004429"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:14.108061" elapsed="0.006735"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:14.115047" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:14.114885" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:14.108038" elapsed="0.007099"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:14.119124" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782874,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:14.116219" elapsed="0.002968"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:14.115989" elapsed="0.003234"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:14.115970" elapsed="0.003277"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:14.123003" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:14.119590" elapsed="0.003480"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:14.119331" elapsed="0.003801"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:14.119305" elapsed="0.003884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:14.124061" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:14.123469" elapsed="0.000634"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:14.124643" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:14.124242" elapsed="0.000491"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:14.125891" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:14.125001" elapsed="0.000930"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:14.124769" elapsed="0.001216"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:14.124210" elapsed="0.001806"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:14.126897" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:14.126277" elapsed="0.000662"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:14.127429" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:14.127048" elapsed="0.000493"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:14.128606" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:14.127843" elapsed="0.000804"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:14.127602" elapsed="0.001096"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:14.127020" elapsed="0.001707"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:14.128954" elapsed="0.000768"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:14.130468" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:14.130005" elapsed="0.000504"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:14.130789" elapsed="0.014020"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:14.115529" elapsed="0.029354"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:14.145086" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T01:01:14.144968" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:14.144946" 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-04-10T01:01:14.145372" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:14.145447" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:14.148090" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782874,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:14.097857" elapsed="0.050264"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:14.148177" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:14.148337" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782874,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:14.095036" elapsed="0.053328"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:14.149536" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782874, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:14.149066" elapsed="0.000695"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:14.149813" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:01:14.149978" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782874, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:14.148624" elapsed="0.001384"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:14.150389" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:14.150201" elapsed="0.000215"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:14.150961" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:14.150639" elapsed="0.000349"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:14.151462" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:14.151185" elapsed="0.000304"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:14.152043" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:14.151682" elapsed="0.000445">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:14.086523" elapsed="0.065721">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:15.164765" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:15.164212" elapsed="0.000603"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:15.164918" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T01:01:15.165159" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:15.163630" elapsed="0.001566"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:15.174290" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:15.173951" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:15.174777" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:15.174509" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:15.182465" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:15.182637" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:15 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:15 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782875,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:15.182857" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:15.177445" elapsed="0.005472"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:15.174901" elapsed="0.008114"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:15.183434" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:15.183080" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:15.174878" elapsed="0.008790"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:15.190981" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782875,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:15.186075" elapsed="0.004978"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:15.185514" elapsed="0.005589"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:15.185474" elapsed="0.005663"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:15.195598" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:15.191567" elapsed="0.004102"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:15.191218" elapsed="0.004502"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:15.191194" elapsed="0.004560"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:15.196585" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:15.196010" elapsed="0.000615"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:15.197192" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:15.196846" elapsed="0.000430"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:15.198339" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:15.197587" elapsed="0.000791"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:15.197310" elapsed="0.001120"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:15.196819" elapsed="0.001636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:15.199009" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:15.198638" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:15.199346" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:15.199108" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:15.200142" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:15.199630" elapsed="0.000539"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:15.199430" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:15.199090" elapsed="0.001138"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:15.200386" elapsed="0.000469"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:15.201356" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:15.201025" elapsed="0.000358"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:15.201556" elapsed="0.013344"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:15.184507" elapsed="0.030464"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:15.215161" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T01:01:15.215046" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:15.215026" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:15.215412" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:15.215485" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:15.217887" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782875,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:15.165771" elapsed="0.052145"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:15.217970" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:15.218125" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782875,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:15.162870" elapsed="0.055281"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:15.219332" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782875, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:15.218920" elapsed="0.000440"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:15.219409" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T01:01:15.219588" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782875, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:15.218387" elapsed="0.001229"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:15.219979" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:15.219797" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:15.220489" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:15.220183" elapsed="0.000332"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:15.220977" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:15.220706" elapsed="0.000297"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:15.221596" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:15.221177" elapsed="0.000491">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:15.153193" elapsed="0.068615">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:16.232818" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:16.232306" elapsed="0.000556"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:16.232939" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T01:01:16.233167" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:16.231798" elapsed="0.001405"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:16.241869" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:16.241605" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:16.242341" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:16.242076" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:16.249014" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:16.249073" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:16 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:16 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782876,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:16.249168" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:16.244621" elapsed="0.004574"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:16.242457" elapsed="0.006781"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:16.249422" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:16.249266" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:16.242437" elapsed="0.007090"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:16.253669" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782876,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:16.250646" elapsed="0.003094"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:16.250388" elapsed="0.003398"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:16.250368" elapsed="0.003450"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:16.258684" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:16.254251" elapsed="0.004501"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:16.253899" elapsed="0.004903"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:16.253875" elapsed="0.004961"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:16.259687" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:16.259096" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:16.260164" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:16.259827" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:16.261238" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:16.260507" elapsed="0.000769"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:16.260278" elapsed="0.001049"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:16.259801" elapsed="0.001556"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:16.262115" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:16.261604" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:16.262641" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:16.262316" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:16.263394" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:16.262890" elapsed="0.000596"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:16.262727" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:16.262288" elapsed="0.001275"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:16.263726" elapsed="0.000457"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:16.264712" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:16.264353" elapsed="0.000386"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:16.264903" elapsed="0.012856"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:16.249928" elapsed="0.027902"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:16.278017" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T01:01:16.277904" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:16.277885" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:16.278290" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:16.278364" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:16.280885" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782876,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:16.233713" elapsed="0.047201"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:16.280967" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:16.281123" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782876,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:16.231110" elapsed="0.050039"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:16.282181" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782876, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:16.281779" elapsed="0.000457"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:16.282293" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:16.282453" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782876, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:16.281383" elapsed="0.001096"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:16.282866" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:16.282679" elapsed="0.000214"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:16.283401" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:16.283073" elapsed="0.000358"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:16.283900" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:16.283626" elapsed="0.000300"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:16.284474" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:16.284101" elapsed="0.000695">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:16.222787" elapsed="0.062128">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.297237" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:17.296741" elapsed="0.000540"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:17.297359" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T01:01:17.297612" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:17.296213" elapsed="0.001436"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.307471" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.307111" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.308227" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.307876" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:17.315968" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:17.316048" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:17 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782877,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:17.316169" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:17.311571" elapsed="0.004628"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.308392" elapsed="0.007861"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:17.316511" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:17.316290" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.308363" elapsed="0.008279"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.321732" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782877,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.317892" elapsed="0.003971"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.317619" elapsed="0.004346"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.317597" elapsed="0.004426"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.327846" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.322674" elapsed="0.005268"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.322159" elapsed="0.005851"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.322123" elapsed="0.005937"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.329220" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:17.328417" elapsed="0.000846"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:17.330027" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:17.329386" elapsed="0.000744"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.331405" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:17.330419" elapsed="0.001030"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.330169" elapsed="0.001338"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.329355" elapsed="0.002179"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.332220" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:17.331751" elapsed="0.000504"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:17.332659" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:17.332356" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.333567" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:17.332933" elapsed="0.000667"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.332746" elapsed="0.000896"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.332328" elapsed="0.001338"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:17.333869" elapsed="0.000554"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:17.335005" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:17.334625" elapsed="0.000408"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:17.335197" elapsed="0.013876"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:17.317109" elapsed="0.032074"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:17.349435" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-10T01:01:17.349292" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.349263" elapsed="0.000395"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:17.349874" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:17.349952" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:17.352492" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782877,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:17.298126" elapsed="0.054402"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:17.352915" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T01:01:17.353086" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782877,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:17.295521" elapsed="0.057592"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.354289" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782877, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:17.353824" elapsed="0.000495"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:17.354371" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:17.354564" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782877, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:17.353383" elapsed="0.001211"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:17.354999" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:17.354807" elapsed="0.000220"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.355538" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:17.355210" elapsed="0.000379"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.356066" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:17.355791" elapsed="0.000301"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T01:01:17.356269" elapsed="0.000662"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T01:01:17.286057" elapsed="0.070939"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T01:01:04.491513" elapsed="12.865537"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:04.491108" elapsed="12.866007"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:01:04.486416" elapsed="12.870735"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:01:04.486278" elapsed="12.870910"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.368826" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:17.368490" elapsed="0.000366"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:17.368903" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:17.369056" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:17.368135" elapsed="0.000946"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.376078" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.375814" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.376557" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.376287" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:17.386596" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:17.386682" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:17 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782877,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:17.386923" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:17.378899" elapsed="0.008063"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.376681" elapsed="0.010344"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:17.387285" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:17.387064" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.376660" elapsed="0.010748"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.392377" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782877,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.388888" elapsed="0.003558"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.388566" elapsed="0.003965"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.388509" elapsed="0.004074"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.396410" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.392981" elapsed="0.003495"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.392665" elapsed="0.003859"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.392641" elapsed="0.003938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.397341" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:17.396815" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:17.398011" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:17.397479" elapsed="0.000616"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.398832" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:17.398356" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.398129" elapsed="0.000792"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.397454" elapsed="0.001497"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.399703" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:17.399175" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:17.400166" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:17.399839" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.400942" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:17.400504" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.400279" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.399815" elapsed="0.001245"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:17.401273" elapsed="0.000507"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:17.402408" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:17.402012" elapsed="0.000433"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:17.402684" elapsed="0.002942"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:17.387936" elapsed="0.017758"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:17.405877" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-10T01:01:17.405768" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.405748" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:17.406122" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:17.406196" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:17.408596" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782877,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:17.369422" elapsed="0.039204"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:17.408682" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:17.408837" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782877,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:17.367670" elapsed="0.041240"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T01:01:17.408962" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:17.409113" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":9000,"timestamp":1775782877,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T01:01:17.362811" elapsed="0.046330"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.410135" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 9000, 'timestamp': 1775782877, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:17.409731" elapsed="0.000434"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:17.410216" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:17.410374" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 9000, 'timestamp': 1775782877, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:17.409364" elapsed="0.001038"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:17.410803" level="INFO">${value} = 9000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:17.410600" elapsed="0.000231"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.411304" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T01:01:17.411015" elapsed="0.000347"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 9000.</doc>
<status status="PASS" start="2026-04-10T01:01:17.362307" elapsed="0.049116"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:01:17.357397" elapsed="0.054062"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:01:17.357250" elapsed="0.054242"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_del_ten_percent}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T01:01:04.418386" elapsed="12.993193"/>
</kw>
<kw name="Add Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Add Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.422728" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:17.422399" elapsed="0.000464"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:17.423203" elapsed="0.000151"/>
</return>
<msg time="2026-04-10T01:01:17.423858" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:17.422048" elapsed="0.001874"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.443720" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.443369" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.444186" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.443936" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.444662" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.444392" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.445110" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.444865" elapsed="0.000289"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:17.446006" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T01:01:17.445798" elapsed="0.000234"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T01:01:17.446361" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T01:01:17.446190" elapsed="0.000195"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T01:01:17.446538" elapsed="0.000223"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.447199" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.446948" elapsed="0.000295"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T01:01:17.447285" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:01:17.447443" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T01:01:17.445361" elapsed="0.002106"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:17.460622" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Content-Length': '401', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "true",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "1000",
   "sal-bulk-flow:batch-size" : "1000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T01:01:17.460697" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:17.460832" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:17.449754" elapsed="0.011116"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.447570" elapsed="0.013370"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:17.461217" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:17.460981" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.447529" elapsed="0.013823"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.466639" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.462953" elapsed="0.003752"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.462594" elapsed="0.004163"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.462564" elapsed="0.004264"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.470917" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.467244" elapsed="0.003741"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.466914" elapsed="0.004122"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.466888" elapsed="0.004183"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.471934" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:17.471334" elapsed="0.000639"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:17.472429" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:17.472075" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.473259" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:17.472815" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.472568" elapsed="0.000781"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.472049" elapsed="0.001332"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.474169" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:17.473637" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:17.474680" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:17.474311" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.475510" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:17.475079" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.474838" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.474285" elapsed="0.001328"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:17.475772" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:17.476639" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:17.476289" elapsed="0.000377"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:17.476823" elapsed="0.002777"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:17.461922" elapsed="0.017744"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:01:17.479858" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:17.479741" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.479721" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:01:17.482643" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:01:17.480087" elapsed="0.002584"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:01:17.482766" elapsed="0.000073"/>
</return>
<msg time="2026-04-10T01:01:17.482980" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:17.440267" elapsed="0.042738"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:17.483074" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:17.483224" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T01:01:17.437446" elapsed="0.045802"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:17.483299" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T01:01:17.483446" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:17.421596" elapsed="0.061873"/>
</kw>
<arg>${json_body_add}</arg>
<arg>${controller_index}</arg>
<doc>Add Bulk Flow in member 1 according to ${json_body_add}.</doc>
<status status="PASS" start="2026-04-10T01:01:17.416851" elapsed="0.066685"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.490819" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:17.490469" elapsed="0.000379"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:17.490895" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:17.491046" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:17.490117" elapsed="0.000954"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.497883" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.497618" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.498328" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.498087" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:17.504995" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:17.505053" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:17 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782877,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:17.505144" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:17.500607" elapsed="0.004562"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.498436" elapsed="0.006775"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:17.505392" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:17.505238" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.498418" elapsed="0.007059"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.509926" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782877,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.506493" elapsed="0.003503"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.506267" elapsed="0.003778"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.506249" elapsed="0.003831"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.514002" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:17.510475" elapsed="0.003593"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.510161" elapsed="0.003954"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.510137" elapsed="0.004014"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.514968" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:17.514386" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:17.515513" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:17.515174" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.516314" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:17.515887" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.515655" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.515146" elapsed="0.001287"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.517195" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:17.516684" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:17.517695" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:17.517332" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.518457" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:17.518041" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:17.517813" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.517307" elapsed="0.001290"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:17.518845" elapsed="0.000493"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:17.519859" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:17.519581" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:17.520047" elapsed="0.002599"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:17.505850" elapsed="0.016861"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:17.522915" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T01:01:17.522782" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:17.522763" elapsed="0.000238"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:17.523153" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:17.523224" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:17.525598" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782877,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:17.491405" elapsed="0.034222"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:17.525679" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:17.525829" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782877,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:17.489649" elapsed="0.036205"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.526860" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782877, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:17.526416" elapsed="0.000474"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:17.526939" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:17.527092" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782877, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:17.526073" elapsed="0.001044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:17.527479" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:17.527299" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.527998" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:17.527697" elapsed="0.000327"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.528456" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:17.528196" elapsed="0.000286"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:17.529028" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:17.528671" elapsed="0.000472">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:17.484853" elapsed="0.044408">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.541465" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:18.540955" elapsed="0.000560"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:18.541625" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T01:01:18.541865" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:18.540375" elapsed="0.001525"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.550637" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:18.550284" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.551109" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:18.550858" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:18.557773" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:18.557836" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:18 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782878,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:18.557935" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:18.553429" elapsed="0.004532"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:18.551236" elapsed="0.006768"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:18.558191" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:18.558034" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.551212" elapsed="0.007065"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.561982" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782878,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:18.559380" elapsed="0.002652"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:18.559121" elapsed="0.002947"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.559102" elapsed="0.002990"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.566728" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:18.562378" elapsed="0.004401"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:18.562149" elapsed="0.004666"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.562131" elapsed="0.004710"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.567584" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:18.567026" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:18.568214" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:18.567769" elapsed="0.000541"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.569070" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:18.568600" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:18.568344" elapsed="0.000814"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.567736" elapsed="0.001453"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.570023" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:18.569413" elapsed="0.000649"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:18.570496" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:18.570162" elapsed="0.000495"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.571429" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:18.570935" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:18.570698" elapsed="0.000938"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.570137" elapsed="0.001536"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:18.571898" elapsed="0.000551"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:18.573115" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:18.572708" elapsed="0.000444"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:18.573369" elapsed="0.003530"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:18.558685" elapsed="0.018307"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:18.577245" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-10T01:01:18.577092" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.577065" elapsed="0.000308"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:18.577631" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:18.577736" elapsed="0.000022"/>
</return>
<msg time="2026-04-10T01:01:18.580750" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782878,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:18.542386" elapsed="0.038394"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:18.580832" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:18.580985" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782878,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:18.539617" elapsed="0.041393"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.582047" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782878, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:18.581617" elapsed="0.000459"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:18.582127" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:01:18.582287" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782878, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:18.581237" elapsed="0.001076"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:18.582733" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:18.582493" elapsed="0.000267"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.583290" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:18.582974" elapsed="0.000342"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.583818" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:18.583529" elapsed="0.000315"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T01:01:18.584018" elapsed="0.000310"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T01:01:18.530229" elapsed="0.054160"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T01:01:17.484214" elapsed="1.100225"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 1.</doc>
<status status="PASS" start="2026-04-10T01:01:17.483801" elapsed="1.100698"/>
</kw>
<arg>${temp_json_config_add_ten_percent}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Add Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T01:01:17.416336" elapsed="1.168230"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.594899" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T01:01:18.594449" elapsed="0.000479"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.595559" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T01:01:18.595095" elapsed="0.000494"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T01:01:18.595695" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T01:01:18.595866" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T01:01:18.594035" elapsed="0.001857"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.610295" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:18.609648" elapsed="0.000680"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:18.610385" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T01:01:18.610591" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:18.609241" elapsed="0.001379"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.632226" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:18.631954" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.632712" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:18.632437" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.633168" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:18.632916" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.633633" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:18.633370" elapsed="0.000307"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:18.634499" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T01:01:18.634295" elapsed="0.000231"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T01:01:18.634873" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T01:01:18.634699" elapsed="0.000199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T01:01:18.635051" elapsed="0.000201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.635731" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:18.635457" elapsed="0.000320"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T01:01:18.635820" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:18.635979" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T01:01:18.633882" elapsed="0.002122"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:18.646036" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T01:01:18.646086" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:18.646179" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:18.638427" elapsed="0.007778"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:18.636083" elapsed="0.010169"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:18.646441" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:18.646281" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.636062" elapsed="0.010467"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.651626" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:18.648080" elapsed="0.003609"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:18.647763" elapsed="0.003977"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.647736" elapsed="0.004038"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.655661" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:18.652166" elapsed="0.003544"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:18.651852" elapsed="0.003893"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.651829" elapsed="0.003941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.656427" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:18.656023" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:18.656802" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:18.656528" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.657357" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:18.657052" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:18.656886" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.656510" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.657992" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:18.657624" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:18.658326" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:18.658089" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.658884" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:18.658586" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:18.658407" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.658071" elapsed="0.000896"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:18.659122" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:18.659958" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:18.659675" elapsed="0.000310"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:18.660143" elapsed="0.002465"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:18.647088" elapsed="0.015585"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:01:18.662855" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:18.662747" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.662728" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:01:18.665632" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:01:18.663070" elapsed="0.002590"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:01:18.665709" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:01:18.666001" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:18.629151" elapsed="0.036874"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:18.666089" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:01:18.666237" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T01:01:18.625817" elapsed="0.040444"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:18.666311" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:01:18.666456" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:18.608767" elapsed="0.057713"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T01:01:18.603823" elapsed="0.062734"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:01:18.596124" elapsed="0.070475"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:01:18.595970" elapsed="0.070665"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.678560" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:18.678244" elapsed="0.000345"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:18.678676" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:01:18.678832" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:18.677895" elapsed="0.000962"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.685733" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:18.685457" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.686184" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:18.685939" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:18.695160" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:18.695219" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:18 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:18 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782878,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:18.695313" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:18.688456" elapsed="0.006884"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:18.686296" elapsed="0.009108"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:18.695613" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:18.695432" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.686278" elapsed="0.009422"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.699485" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782878,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:18.696715" elapsed="0.002820"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:18.696475" elapsed="0.003111"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.696457" elapsed="0.003155"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.703413" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:18.699895" elapsed="0.003585"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:18.699670" elapsed="0.003857"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.699652" elapsed="0.003931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.704339" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:18.703818" elapsed="0.000559"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:18.704830" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:18.704474" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.705892" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:18.705169" elapsed="0.000761"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:18.704943" elapsed="0.001037"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.704449" elapsed="0.001561"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.706772" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:18.706234" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:18.707236" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:18.706907" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.708343" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:18.707642" elapsed="0.000740"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:18.707349" elapsed="0.001082"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.706882" elapsed="0.001579"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:18.708662" elapsed="0.000445"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:18.709738" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:18.709328" elapsed="0.000490"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:18.710013" elapsed="0.014130"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:18.696059" elapsed="0.028158"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:18.724413" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T01:01:18.724296" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:18.724275" elapsed="0.000235"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:18.724690" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:18.724764" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:18.727472" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782878,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:18.679201" elapsed="0.048303"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:18.727579" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:01:18.727737" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782878,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:18.677424" elapsed="0.050339"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.729153" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782878, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:18.728466" elapsed="0.000717"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:18.729233" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:18.729391" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782878, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:18.728017" elapsed="0.001401"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:18.729865" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:18.729679" elapsed="0.000214"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.730383" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:18.730073" elapsed="0.000336"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.730868" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:18.730600" elapsed="0.000293"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:18.731450" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:18.731068" elapsed="0.000457">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:18.672608" elapsed="0.059050">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:19.744430" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:19.743895" elapsed="0.000580"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:19.744590" elapsed="0.000064"/>
</return>
<msg time="2026-04-10T01:01:19.744849" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:19.743335" elapsed="0.001551"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:19.753319" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:19.753029" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:19.753805" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:19.753532" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:19.760729" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:19.760791" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:19 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:19 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782879,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:19.760967" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:19.756166" elapsed="0.004829"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:19.753929" elapsed="0.007111"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:19.761235" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:19.761067" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:19.753907" elapsed="0.007418"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:19.765207" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782879,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:19.762404" elapsed="0.002862"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:19.762165" elapsed="0.003138"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:19.762146" elapsed="0.003182"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:19.768784" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:19.765639" elapsed="0.003212"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:19.765387" elapsed="0.003513"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:19.765369" elapsed="0.003565"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:19.769791" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:19.769183" elapsed="0.000648"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:19.770276" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:19.769935" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:19.771451" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:19.770677" elapsed="0.000813"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:19.770410" elapsed="0.001153"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:19.769909" elapsed="0.001692"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:19.772393" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:19.771864" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:19.772897" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:19.772538" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:19.774025" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:19.773241" elapsed="0.000822"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:19.773012" elapsed="0.001102"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:19.772512" elapsed="0.001632"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:19.774361" elapsed="0.000710"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:19.775804" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:19.775310" elapsed="0.000532"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:19.776063" elapsed="0.013912"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:19.761727" elapsed="0.028318"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:19.790230" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T01:01:19.790117" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:19.790098" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:19.790482" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:19.790570" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T01:01:19.793040" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782879,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:19.745393" elapsed="0.047746"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:19.793199" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T01:01:19.793365" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782879,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:19.742574" elapsed="0.050818"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:19.794915" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782879, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:19.794402" elapsed="0.000544"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:19.794997" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:19.795160" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782879, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:19.794013" elapsed="0.001175"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:19.795577" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:19.795371" elapsed="0.000233"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:19.796104" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:19.795794" elapsed="0.000335"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:19.796584" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:19.796302" elapsed="0.000309"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:19.797177" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:19.796802" elapsed="0.000449">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:19.732798" elapsed="0.064565">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:20.809141" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:20.808653" elapsed="0.000532"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:20.809261" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T01:01:20.809490" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:20.808121" elapsed="0.001406"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:20.818169" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:20.817907" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:20.818635" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:20.818375" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:20.825667" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:20.825729" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:20 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:20 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782880,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:20.825828" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:20.820945" elapsed="0.004910"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:20.818766" elapsed="0.007134"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:20.826091" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:20.825929" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:20.818733" elapsed="0.007446"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:20.830044" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782880,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:20.827268" elapsed="0.002826"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:20.827038" elapsed="0.003204"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:20.827019" elapsed="0.003250"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:20.833592" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:20.830581" elapsed="0.003062"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:20.830328" elapsed="0.003352"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:20.830311" elapsed="0.003398"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:20.834319" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:20.833917" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:20.834716" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:20.834418" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:20.835482" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:20.834969" elapsed="0.000541"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:20.834801" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:20.834400" elapsed="0.001186"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:20.836118" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:20.835749" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:20.836453" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:20.836217" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:20.837219" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:20.836714" elapsed="0.000533"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:20.836535" elapsed="0.000747"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:20.836199" elapsed="0.001105"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:20.837460" elapsed="0.000468"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:20.838424" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:20.838097" elapsed="0.000354"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:20.838656" elapsed="0.016201"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:20.826582" elapsed="0.028382"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:20.855249" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-04-10T01:01:20.855076" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:20.855046" 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-04-10T01:01:20.855658" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:20.855769" elapsed="0.000025"/>
</return>
<msg time="2026-04-10T01:01:20.859693" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782880,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:20.810038" elapsed="0.049701"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:20.859815" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:01:20.860037" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782880,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:20.807421" elapsed="0.052653"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:20.861496" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782880, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:20.860926" elapsed="0.000611"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:20.861667" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:01:20.861902" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782880, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:20.860402" elapsed="0.001633"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:20.862775" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:20.862299" elapsed="0.000503"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:20.863304" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:20.862987" elapsed="0.000346"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:20.863908" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:20.863588" elapsed="0.000347"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:20.864476" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:20.864112" elapsed="0.000456">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:20.798430" elapsed="0.066253">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:21.876573" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:21.876044" elapsed="0.000575"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:21.876700" elapsed="0.000054"/>
</return>
<msg time="2026-04-10T01:01:21.876940" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:21.875498" elapsed="0.001479"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:21.886285" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:21.886024" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:21.886755" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:21.886492" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:21.895418" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:21.895506" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:21 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:21 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782881,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:21.895670" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:21.889033" elapsed="0.006677"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:21.886874" elapsed="0.008906"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:21.896055" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:21.895821" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:21.886853" elapsed="0.009328"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:21.902418" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782881,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:21.897831" elapsed="0.004660"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:21.897468" elapsed="0.005096"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:21.897435" elapsed="0.005167"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:21.907080" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:21.903051" elapsed="0.004098"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:21.902687" elapsed="0.004512"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:21.902662" elapsed="0.004572"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:21.908080" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:21.907492" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:21.908591" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:21.908222" elapsed="0.000457"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:21.909715" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:21.908955" elapsed="0.000800"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:21.908714" elapsed="0.001167"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:21.908196" elapsed="0.001721"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:21.910717" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:21.910156" elapsed="0.000602"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:21.911229" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:21.910879" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:21.912382" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:21.911639" elapsed="0.000784"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:21.911351" elapsed="0.001125"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:21.910851" elapsed="0.001657"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:21.912758" elapsed="0.000658"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:21.914156" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:21.913685" elapsed="0.000510"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:21.914428" elapsed="0.013082"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:21.896794" elapsed="0.030800"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:21.927795" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T01:01:21.927677" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:21.927653" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:21.928041" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:21.928114" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:21.931116" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782881,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:21.877483" elapsed="0.053664"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:21.931202" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:21.931360" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782881,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:21.874816" elapsed="0.056571"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:21.932460" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782881, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:21.932042" elapsed="0.000446"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:21.932538" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T01:01:21.932713" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782881, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:21.931643" elapsed="0.001096"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:21.933101" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:21.932921" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:21.933747" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:21.933304" elapsed="0.000471"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:21.934213" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:21.933950" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:21.934873" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:21.934411" elapsed="0.000535">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:21.865510" elapsed="0.069545">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:22.947043" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:22.946689" elapsed="0.000449"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:22.947198" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T01:01:22.947366" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:22.946318" elapsed="0.001074"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:22.954307" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:22.954042" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:22.954779" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:22.954510" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:22.961625" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:22.961685" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:22 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:22 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782882,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:22.961783" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:22.957059" elapsed="0.004750"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:22.954897" elapsed="0.006956"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:22.962036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:22.961881" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:22.954877" elapsed="0.007245"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:22.966313" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782882,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:22.963146" elapsed="0.003230"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:22.962919" elapsed="0.003493"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:22.962901" elapsed="0.003536"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:22.970482" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:22.966843" elapsed="0.003759"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:22.966499" elapsed="0.004157"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:22.966481" elapsed="0.004211"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:22.971513" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:22.970950" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:22.972060" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:22.971705" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:22.973196" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:22.972421" elapsed="0.000815"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:22.972180" elapsed="0.001109"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:22.971678" elapsed="0.001647"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:22.974137" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:22.973589" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:22.974647" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:22.974279" elapsed="0.000456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:22.975823" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:22.975009" elapsed="0.000854"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:22.974769" elapsed="0.001147"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:22.974254" elapsed="0.001693"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:22.976171" elapsed="0.000646"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:22.977303" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:22.976983" elapsed="0.000403"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:22.977559" elapsed="0.013036"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:22.962475" elapsed="0.028185"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:22.990837" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T01:01:22.990731" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:22.990713" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:22.991072" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:22.991143" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:22.994173" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782882,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:22.947761" elapsed="0.046443"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:22.994259" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:22.994413" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782882,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:22.945846" elapsed="0.048593"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:22.995459" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782882, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:22.995053" elapsed="0.000451"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:22.995779" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:22.995937" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782882, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:22.994688" elapsed="0.001421"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:22.996467" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:22.996287" elapsed="0.000205"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:22.996984" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:22.996682" elapsed="0.000328"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:22.997439" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:22.997181" elapsed="0.000283"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:22.997999" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:22.997651" elapsed="0.000420">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:22.935938" elapsed="0.062244">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:24.005169" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:24.004769" elapsed="0.000432"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:24.005262" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T01:01:24.005430" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:24.004394" elapsed="0.001061"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:24.012367" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:24.012064" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:24.012847" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:24.012602" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:24.025099" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:24.025268" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:24 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:24 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782884,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:24.025411" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:24.015142" elapsed="0.010298"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:24.012971" elapsed="0.012530"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:24.025776" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:24.025561" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:24.012948" elapsed="0.012917"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:24.029852" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782884,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:24.027016" elapsed="0.002886"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:24.026771" elapsed="0.003166"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:24.026750" elapsed="0.003211"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:24.034401" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:24.030241" elapsed="0.004208"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:24.030018" elapsed="0.004466"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:24.030001" elapsed="0.004508"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:24.035102" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:24.034703" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:24.035441" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:24.035201" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:24.036218" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:24.035704" elapsed="0.000542"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:24.035523" elapsed="0.000759"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:24.035184" elapsed="0.001119"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:24.036863" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:24.036465" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:24.037195" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:24.036961" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:24.038090" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:24.037436" elapsed="0.000681"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:24.037275" elapsed="0.000878"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:24.036943" elapsed="0.001232"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:24.038327" elapsed="0.000465"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:24.039279" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:24.038957" elapsed="0.000348"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:24.039460" elapsed="0.012763"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:24.026274" elapsed="0.026013"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:24.052465" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T01:01:24.052357" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:24.052339" elapsed="0.000234"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:24.052724" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:24.052811" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:24.055382" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782884,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:24.005818" elapsed="0.049626"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:24.055499" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:24.055670" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782884,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:24.003906" elapsed="0.051790"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:24.056693" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782884, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:24.056279" elapsed="0.000460"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:24.056789" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:24.056945" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782884, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:24.055935" elapsed="0.001036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:24.057330" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:24.057150" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:24.058077" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:24.057531" elapsed="0.000573"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:24.058557" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:24.058279" elapsed="0.000305"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:24.059110" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:24.058758" elapsed="0.000421">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:23.998912" elapsed="0.060376">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:25.073894" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:25.073104" elapsed="0.000858"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:25.074083" elapsed="0.000084"/>
</return>
<msg time="2026-04-10T01:01:25.074441" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:25.072285" elapsed="0.002211"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:25.082427" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:25.082163" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:25.082915" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:25.082664" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:25.089381" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:25.089440" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:25 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:25 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782885,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:25.089533" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:25.085203" elapsed="0.004380"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:25.083036" elapsed="0.006591"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:25.089812" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:25.089655" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:25.083015" elapsed="0.006886"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:25.093881" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782885,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:25.091155" elapsed="0.002776"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:25.090932" elapsed="0.003235"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:25.090914" elapsed="0.003279"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:25.097221" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:25.094476" elapsed="0.002793"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:25.094251" elapsed="0.003052"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:25.094234" elapsed="0.003094"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:25.097919" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:25.097509" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:25.098254" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:25.098018" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:25.099180" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:25.098497" elapsed="0.000720"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:25.098335" elapsed="0.000933"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:25.098000" elapsed="0.001297"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:25.100054" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:25.099523" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:25.100518" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:25.100190" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:25.101601" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:25.100880" elapsed="0.000759"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:25.100655" elapsed="0.001033"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:25.100165" elapsed="0.001552"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:25.101930" elapsed="0.000689"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:25.103306" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:25.102860" elapsed="0.000483"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:25.103578" elapsed="0.015170"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:25.090462" elapsed="0.028378"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:25.119056" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-10T01:01:25.118935" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:25.118909" 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-04-10T01:01:25.119342" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:25.119416" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:25.122251" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782885,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:25.075341" elapsed="0.046941"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:25.122336" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:25.122554" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782885,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:25.071083" elapsed="0.051500"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:25.123673" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782885, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:25.123221" elapsed="0.000480"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:25.123748" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:25.123903" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782885, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:25.122827" elapsed="0.001169"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:25.124364" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:25.124180" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:25.124893" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:25.124584" elapsed="0.000336"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:25.125354" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:25.125093" elapsed="0.000286"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:25.125991" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:25.125637" elapsed="0.000427">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:25.060259" elapsed="0.065917">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:26.137902" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:26.137364" elapsed="0.000583"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:26.138027" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T01:01:26.138259" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:26.136776" elapsed="0.001520"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:26.147583" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:26.147296" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:26.148052" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:26.147800" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:26.157137" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:26.157225" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:26 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:26 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782886,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:26.157363" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:26.150450" elapsed="0.006950"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:26.148199" elapsed="0.009265"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:26.157758" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:26.157503" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:26.148175" elapsed="0.009706"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:26.163663" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782886,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:26.159574" elapsed="0.004161"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:26.159234" elapsed="0.004551"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:26.159208" elapsed="0.004612"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:26.167343" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:26.164240" elapsed="0.003154"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:26.163900" elapsed="0.003529"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:26.163876" elapsed="0.003579"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:26.168060" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:26.167656" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:26.168416" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:26.168170" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:26.169238" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:26.168714" elapsed="0.000553"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:26.168499" elapsed="0.000930"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:26.168150" elapsed="0.001308"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:26.170019" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:26.169642" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:26.170355" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:26.170120" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:26.171153" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:26.170633" elapsed="0.000548"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:26.170440" elapsed="0.000778"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:26.170101" elapsed="0.001139"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:26.171397" elapsed="0.000482"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:26.172397" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:26.172052" elapsed="0.000373"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:26.172643" elapsed="0.013289"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:26.158411" elapsed="0.027592"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:26.186190" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T01:01:26.186078" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:26.186059" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:26.186438" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:26.186511" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:26.189138" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782886,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:26.138808" elapsed="0.050360"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:26.189223" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:26.189380" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782886,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:26.135913" elapsed="0.053494"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:26.190420" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782886, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:26.190013" elapsed="0.000436"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:26.190501" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:26.190679" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782886, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:26.189654" elapsed="0.001053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:26.191077" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:26.190890" elapsed="0.000213"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:26.191610" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:26.191283" elapsed="0.000354"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:26.192089" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:26.191816" elapsed="0.000300"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:26.192791" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:26.192309" elapsed="0.000557">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:26.126942" elapsed="0.066041">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:27.206335" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:27.205913" elapsed="0.000568"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:27.206562" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T01:01:27.206745" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:27.205489" elapsed="0.001283"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:27.214999" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:27.214607" elapsed="0.000485"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:27.215696" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:27.215320" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:27.223628" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:27.223692" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:27 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782887,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:27.223794" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:27.219083" elapsed="0.004739"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:27.215864" elapsed="0.008004"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:27.224066" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:27.223899" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:27.215835" elapsed="0.008359"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:27.229791" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782887,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:27.225418" elapsed="0.004539"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:27.225160" elapsed="0.004904"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:27.225140" elapsed="0.005007"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:27.235667" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:27.231173" elapsed="0.004564"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:27.230331" elapsed="0.005456"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:27.230278" elapsed="0.005544"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:27.236679" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:27.236074" elapsed="0.000672"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:27.237261" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:27.236870" elapsed="0.000481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:27.238577" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:27.237727" elapsed="0.000904"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:27.237402" elapsed="0.001289"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:27.236842" elapsed="0.001879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:27.239675" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:27.239013" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:27.240227" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:27.239828" elapsed="0.000490"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:27.241385" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:27.240643" elapsed="0.000781"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:27.240352" elapsed="0.001122"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:27.239795" elapsed="0.001709"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:27.241765" elapsed="0.000631"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:27.243162" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:27.242656" elapsed="0.000619"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:27.243507" elapsed="0.013297"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:27.224681" elapsed="0.032196"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:27.257072" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T01:01:27.256956" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:27.256935" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:27.257330" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:27.257403" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:27.259884" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782887,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:27.207189" elapsed="0.052729"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:27.259974" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:27.260130" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782887,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:27.204782" elapsed="0.055375"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:27.261616" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782887, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:27.261136" elapsed="0.000519"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:27.261706" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:01:27.261893" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782887, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:27.260435" elapsed="0.001491"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:27.262330" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:27.262136" elapsed="0.000222"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:27.262914" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:27.262538" elapsed="0.000405"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:27.263389" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:27.263120" elapsed="0.000296"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:27.263965" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:27.263608" elapsed="0.000429">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:27.193853" elapsed="0.070295">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:28.277938" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:28.277402" elapsed="0.000571"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:28.278032" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T01:01:28.278203" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:28.276968" elapsed="0.001261"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:28.285635" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:28.285262" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:28.286134" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:28.285884" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:28.297905" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:28.298150" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:28 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782888,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:28.298346" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:28.288572" elapsed="0.009818"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:28.286260" elapsed="0.012211"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:28.298873" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:28.298522" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:28.286237" elapsed="0.012770"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:28.305814" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782888,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:28.300712" elapsed="0.005245"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:28.300333" elapsed="0.005719"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:28.300303" elapsed="0.005814"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:28.311282" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:28.306742" elapsed="0.004629"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:28.306266" elapsed="0.005168"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:28.306230" elapsed="0.005247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:28.312585" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:28.311877" elapsed="0.000750"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:28.313110" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:28.312745" elapsed="0.000451"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:28.314242" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:28.313476" elapsed="0.000795"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:28.313233" elapsed="0.001074"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:28.312714" elapsed="0.001616"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:28.314906" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:28.314497" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:28.315247" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:28.315007" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:28.316038" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:28.315493" elapsed="0.000572"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:28.315330" elapsed="0.000772"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:28.314988" elapsed="0.001135"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:28.316294" elapsed="0.000477"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:28.317276" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:28.316944" elapsed="0.000358"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:28.317460" elapsed="0.013262"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:28.299631" elapsed="0.031197"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:28.331061" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T01:01:28.330932" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:28.330903" 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-04-10T01:01:28.331372" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:28.331447" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:28.334312" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782888,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:28.278627" elapsed="0.055788"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:28.334472" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:28.334650" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782888,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:28.276171" elapsed="0.058506"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:28.335793" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782888, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:28.335329" elapsed="0.000493"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:28.335871" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:28.336034" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782888, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:28.334928" elapsed="0.001133"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:28.336424" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:28.336242" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:28.337208" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:28.336895" elapsed="0.000339"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:28.337734" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:28.337411" elapsed="0.000351"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:28.338298" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:28.337938" elapsed="0.000432">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:28.265051" elapsed="0.073431">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:29.351143" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:29.350596" elapsed="0.000595"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:29.351274" elapsed="0.000058"/>
</return>
<msg time="2026-04-10T01:01:29.351526" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:29.349985" elapsed="0.001635"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:29.361465" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:29.361095" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:29.362010" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:29.361750" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:29.371793" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:29.371858" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:29 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:29 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782889,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:29.371965" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:29.364431" elapsed="0.007565"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:29.362145" elapsed="0.009904"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:29.372253" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:29.372089" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:29.362119" elapsed="0.010223"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:29.376367" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782889,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:29.373490" elapsed="0.002929"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:29.373263" elapsed="0.003263"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:29.373244" elapsed="0.003331"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:29.380827" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:29.376905" elapsed="0.003992"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:29.376638" elapsed="0.004311"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:29.376619" elapsed="0.004369"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:29.381843" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:29.381248" elapsed="0.000635"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:29.382328" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:29.381987" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:29.383456" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:29.382703" elapsed="0.000799"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:29.382446" elapsed="0.001135"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:29.381960" elapsed="0.001659"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:29.384411" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:29.383871" elapsed="0.000581"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:29.385045" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:29.384661" elapsed="0.000467"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:29.386140" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:29.385392" elapsed="0.000787"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:29.385164" elapsed="0.001067"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:29.384629" elapsed="0.001633"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:29.386481" elapsed="0.000666"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:29.387876" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:29.387384" elapsed="0.000534"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:29.388142" elapsed="0.017801"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:29.372799" elapsed="0.033292"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:29.406428" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-04-10T01:01:29.406247" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:29.406202" elapsed="0.000395"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:29.406889" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:29.406997" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T01:01:29.410709" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782889,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:29.352160" elapsed="0.058594"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:29.410830" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T01:01:29.411050" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782889,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:29.349056" elapsed="0.062033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:29.412841" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782889, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:29.412068" elapsed="0.000814"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:29.412949" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T01:01:29.413164" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782889, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:29.411451" elapsed="0.001835"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:29.413833" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:29.413575" elapsed="0.000294"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:29.414670" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:29.414123" elapsed="0.000589"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:29.415331" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:29.414958" elapsed="0.000410"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:29.416134" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:29.415642" elapsed="0.000591">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:29.339434" elapsed="0.076964">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:30.430282" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:30.429900" elapsed="0.000416"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:30.430373" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:01:30.430560" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:30.429494" elapsed="0.001094"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:30.437667" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:30.437383" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:30.438131" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:30.437883" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:30.447366" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:30.447502" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:30 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:30 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782890,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:30.447755" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:30.440460" elapsed="0.007354"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:30.438251" elapsed="0.009658"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:30.448332" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:30.447968" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:30.438230" elapsed="0.010290"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:30.457381" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782890,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:30.450874" elapsed="0.006577"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:30.450331" elapsed="0.007169"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:30.450291" elapsed="0.007242"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:30.461735" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:30.457992" elapsed="0.003810"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:30.457677" elapsed="0.004173"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:30.457652" elapsed="0.004232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:30.462851" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:30.462125" elapsed="0.000781"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:30.463335" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:30.463006" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:30.464471" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:30.463708" elapsed="0.000801"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:30.463446" elapsed="0.001260"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:30.462982" elapsed="0.001762"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:30.465485" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:30.464973" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:30.465972" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:30.465646" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:30.467186" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:30.466471" elapsed="0.000753"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:30.466083" elapsed="0.001190"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:30.465620" elapsed="0.001683"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:30.467517" elapsed="0.000733"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:30.469001" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:30.468488" elapsed="0.000551"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:30.469201" elapsed="0.013161"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:30.449348" elapsed="0.033107"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:30.482668" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T01:01:30.482536" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:30.482515" elapsed="0.000249"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:30.482929" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:30.482999" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:30.485744" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782890,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:30.430969" elapsed="0.054805"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:30.485827" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:30.485981" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782890,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:30.428878" elapsed="0.057129"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:30.487073" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782890, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:30.486646" elapsed="0.000455"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:30.487149" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:30.487304" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782890, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:30.486245" elapsed="0.001085"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:30.487729" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:30.487512" elapsed="0.000243"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:30.488312" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:30.487974" elapsed="0.000364"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:30.489108" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:30.488512" elapsed="0.000622"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:30.489682" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:30.489310" elapsed="0.000446">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:30.417329" elapsed="0.072540">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:31.502264" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:31.501778" elapsed="0.000652"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:31.502515" elapsed="0.000070"/>
</return>
<msg time="2026-04-10T01:01:31.502766" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:31.501255" elapsed="0.001546"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:31.511083" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:31.510819" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:31.511533" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:31.511289" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:31.520578" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:31.520640" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:31 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:31 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782891,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:31.520734" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:31.513838" elapsed="0.006921"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:31.511666" elapsed="0.009136"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:31.520983" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:31.520828" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:31.511647" elapsed="0.009422"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:31.524833" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782891,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:31.522085" elapsed="0.002798"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:31.521863" elapsed="0.003055"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:31.521845" elapsed="0.003097"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:31.528091" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:31.525219" elapsed="0.002942"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:31.524999" elapsed="0.003211"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:31.524982" elapsed="0.003261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:31.529061" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:31.528484" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:31.529522" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:31.529196" elapsed="0.000429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:31.530616" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:31.529881" elapsed="0.000774"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:31.529658" elapsed="0.001047"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:31.529171" elapsed="0.001564"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:31.531460" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:31.530955" elapsed="0.000543"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:31.531966" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:31.531617" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:31.533060" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:31.532304" elapsed="0.000798"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:31.532081" elapsed="0.001071"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:31.531591" elapsed="0.001590"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:31.533391" elapsed="0.000643"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:31.534727" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:31.534263" elapsed="0.000550"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:31.535034" elapsed="0.014583"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:31.521429" elapsed="0.028257"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:31.549864" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T01:01:31.549757" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:31.549738" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:31.550105" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:31.550175" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:31.552809" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782891,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:31.503283" elapsed="0.049555"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:31.552891" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:31.553042" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782891,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:31.500588" elapsed="0.052480"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:31.554050" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782891, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:31.553649" elapsed="0.000430"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:31.554127" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:31.554278" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782891, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:31.553288" elapsed="0.001016"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:31.554677" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:31.554480" elapsed="0.000222"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:31.555178" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:31.554876" elapsed="0.000327"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:31.555658" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:31.555372" elapsed="0.000312"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:31.556200" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:31.555850" elapsed="0.000423">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:31.490824" elapsed="0.065559">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.569383" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:32.568999" elapsed="0.000417"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:32.569477" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T01:01:32.569669" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:32.568633" elapsed="0.001061"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.578412" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:32.578130" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.578888" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:32.578637" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:32.586213" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:32.586423" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:32 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:32 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782892,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:32.586569" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:32.581213" elapsed="0.005386"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:32.579008" elapsed="0.007636"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:32.586833" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:32.586673" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.578987" elapsed="0.007936"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.591081" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782892,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:32.588130" elapsed="0.003002"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:32.587898" elapsed="0.003271"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.587877" elapsed="0.003318"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.595177" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:32.591482" elapsed="0.003763"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:32.591254" elapsed="0.004041"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.591236" elapsed="0.004094"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.596215" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:32.595654" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:32.596750" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:32.596356" elapsed="0.000480"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.597850" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:32.597100" elapsed="0.000789"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:32.596871" elapsed="0.001069"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.596331" elapsed="0.001639"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.598750" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:32.598195" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:32.599221" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:32.598891" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.600378" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:32.599626" elapsed="0.000791"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:32.599334" elapsed="0.001135"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.598865" elapsed="0.001635"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:32.600814" elapsed="0.000646"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:32.602195" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:32.601728" elapsed="0.000505"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:32.602456" elapsed="0.013814"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:32.587324" elapsed="0.029019"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:32.616533" elapsed="0.000267"/>
</return>
<status status="PASS" start="2026-04-10T01:01:32.616419" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.616400" elapsed="0.000465"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:32.617035" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:32.617113" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:32.619498" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782892,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:32.570047" elapsed="0.049587"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:32.619693" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:32.619852" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782892,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:32.568102" elapsed="0.051777"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.621147" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782892, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:32.620484" elapsed="0.000692"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:32.621226" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:32.621386" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782892, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:32.620123" elapsed="0.001290"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:32.621798" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:32.621613" elapsed="0.000212"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.622328" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:32.622004" elapsed="0.000350"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.622814" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:32.622529" elapsed="0.000311"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T01:01:32.623014" elapsed="0.000327"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T01:01:32.557285" elapsed="0.066118"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T01:01:18.672005" elapsed="13.951450"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:18.671597" elapsed="13.951979"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:01:18.666829" elapsed="13.956786"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:01:18.666689" elapsed="13.956962"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.635240" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:32.634929" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:32.635326" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:32.635502" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:32.634569" elapsed="0.000960"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.642497" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:32.642225" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.642974" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:32.642722" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:32.650107" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:32.650192" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:32 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:32 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782892,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:32.650320" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:32.645255" elapsed="0.005102"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:32.643089" elapsed="0.007327"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:32.650726" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:32.650454" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.643070" elapsed="0.007851"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.656203" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782892,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:32.652434" elapsed="0.003841"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:32.652114" elapsed="0.004213"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.652087" elapsed="0.004277"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.660249" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:32.656809" elapsed="0.003487"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:32.656446" elapsed="0.003886"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.656422" elapsed="0.003936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.660949" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:32.660532" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:32.661290" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:32.661050" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.661870" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:32.661536" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:32.661375" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.661032" elapsed="0.000923"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.662485" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:32.662117" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:32.662849" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:32.662600" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.663440" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:32.663100" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:32.662936" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.662581" elapsed="0.000946"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:32.663699" elapsed="0.000395"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:32.664568" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:32.664267" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:32.664768" elapsed="0.002551"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:32.651459" elapsed="0.015944"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:32.667606" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-10T01:01:32.667478" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.667458" 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-04-10T01:01:32.667873" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:32.667966" elapsed="0.000024"/>
</return>
<msg time="2026-04-10T01:01:32.670363" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782892,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:32.635893" elapsed="0.034499"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:32.670447" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:32.670619" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782892,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:32.634060" elapsed="0.036587"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T01:01:32.670694" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:32.670841" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":10000,"timestamp":1775782892,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T01:01:32.629438" elapsed="0.041475"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.671959" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782892, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:32.671534" elapsed="0.000455"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:32.672038" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:32.672197" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 10000, 'timestamp': 1775782892, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:32.671142" elapsed="0.001082"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:32.672603" level="INFO">${value} = 10000</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:32.672402" elapsed="0.000227"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.673135" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T01:01:32.672810" elapsed="0.000390"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 10000.</doc>
<status status="PASS" start="2026-04-10T01:01:32.628925" elapsed="0.044347"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:01:32.623852" elapsed="0.049456"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:01:32.623709" elapsed="0.049633"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_add}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T01:01:18.593422" elapsed="14.079977"/>
</kw>
<var name="${index}">5</var>
<status status="PASS" start="2026-04-10T01:01:03.230780" elapsed="29.442660"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>6</value>
<status status="PASS" start="2026-04-10T00:59:05.894482" elapsed="146.778989"/>
</for>
<doc>Performeing 5 iterations for Delete and Add ten Percentage of the flows</doc>
<status status="PASS" start="2026-04-10T00:59:05.452075" elapsed="147.221538"/>
</test>
<test id="s1-s4-t8" name="Current Term Verification After Continuous Deletion and Addition Of Flows for 5 iterations" line="98">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T01:01:32.678116" elapsed="0.000235"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T01:01:32.677839" elapsed="0.000570"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:32.679520" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:32.679403" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.679383" elapsed="0.000231"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:32.685098" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:32.684986" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.684967" elapsed="0.000216"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.686225" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T01:01:32.685823" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.686750" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T01:01:32.686418" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T01:01:32.686823" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T01:01:32.686984" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T01:01:32.685419" elapsed="0.001590"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:32.693044" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:32.692921" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.692894" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:32.694426" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:32.694314" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.694295" elapsed="0.000204"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:32.694999" level="INFO">${karaf_connection_index} = 471</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:32.694682" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T01:01:32.695488" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T01:01:32.695194" elapsed="0.000322"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T01:01:32.733614" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T01:01:32.696127" elapsed="0.037736"/>
</kw>
<msg time="2026-04-10T01:01:32.734271" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T01:01:32.734378" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:32.695772" elapsed="0.038690"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T01:01:32.852976" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "A "f "t "e "r "[C "C "o "n "t "i "n "u "o "u "s "[C "D "e "l "e "t "i "o "n "[C "a "n "d "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "s "[C "f "o "r "[C "5 "[C "i "t "e "r "a "t "i "o "[78Cn "[A[78Cs
 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T01:01:32.735858" elapsed="0.117320"/>
</kw>
<msg time="2026-04-10T01:01:32.853375" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T01:01:32.853424" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:32.734939" elapsed="0.118522"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:32.853886" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:32.853596" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.853538" elapsed="0.000434"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:32.854458" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "A "f "t "e "r "[C "C "o "n "t "i "n "u "o "u "s "[C "D "e "l "e "t "i "o "n "[C "a "n "d "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "s "[C "f "o "r "[C "5 "[C "i "t "e "r "a "t "i "o "[78Cn "[A[78Cs
 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:32.854119" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:32.854918" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:32.854693" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.854673" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T01:01:32.855034" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:32.856658" elapsed="0.000806"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T01:01:32.857786" elapsed="0.000517"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T01:01:32.858660" 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-04-10T01:01:32.855963" elapsed="0.003391"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T01:01:32.855364" elapsed="0.004059"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T01:01:32.693999" elapsed="0.165528"/>
</kw>
<msg time="2026-04-10T01:01:32.859642" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:32.859688" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:32.693351" elapsed="0.166375"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T01:01:32.859916" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T01:01:32.859805" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.859787" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:32.860428" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:32.860794" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T01:01:32.860868" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T01:01:32.692488" elapsed="0.168564"/>
</kw>
<msg time="2026-04-10T01:01:32.861166" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:32.861232" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:32.687465" elapsed="0.173822"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:32.861814" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:32.861406" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.861376" elapsed="0.000554"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T01:01:32.687315" elapsed="0.174649"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:32.869460" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:32.869322" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.869298" elapsed="0.000275"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:32.870935" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:32.870825" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:32.870806" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:32.871482" level="INFO">${karaf_connection_index} = 473</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:32.871170" elapsed="0.000339"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T01:01:32.871919" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T01:01:32.871690" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T01:01:33.027478" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T01:01:32.872463" elapsed="0.155247"/>
</kw>
<msg time="2026-04-10T01:01:33.027933" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T01:01:33.027983" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:32.872118" elapsed="0.155902"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T01:01:33.724931" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "A "f "t "e "r "[C "C "o "n "t "i "n "u "o "u "s "[C "D "e "l "e "t "i "o "n "[C "a "n "d "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "s "[C "f "o "r "[C "5 "[C "i "t "e "r "a "t "i "o "[78Cn "[A[78Cs
 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T01:01:33.028735" elapsed="0.696466"/>
</kw>
<msg time="2026-04-10T01:01:33.725420" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T01:01:33.725470" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:33.028263" elapsed="0.697245"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:33.725969" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:33.725650" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:33.725618" elapsed="0.000438"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:33.726590" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "A "f "t "e "r "[C "C "o "n "t "i "n "u "o "u "s "[C "D "e "l "e "t "i "o "n "[C "a "n "d "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "s "[C "f "o "r "[C "5 "[C "i "t "e "r "a "t "i "o "[78Cn "[A[78Cs
 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:33.726203" elapsed="0.000502"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:33.726997" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:33.726775" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:33.726757" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T01:01:33.727113" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:33.728945" elapsed="0.000876"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T01:01:33.730116" elapsed="0.000504"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T01:01:33.730897" elapsed="0.000406"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T01:01:33.728199" elapsed="0.003209"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T01:01:33.727425" elapsed="0.004050"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T01:01:32.870456" elapsed="0.861174"/>
</kw>
<msg time="2026-04-10T01:01:33.731733" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:33.731781" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:32.869783" elapsed="0.862037"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T01:01:33.732019" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T01:01:33.731904" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:33.731885" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:33.732535" elapsed="0.000044"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:33.733163" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T01:01:33.733264" elapsed="0.000025"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T01:01:32.868887" elapsed="0.864513"/>
</kw>
<msg time="2026-04-10T01:01:33.733500" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:33.733576" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:32.862345" elapsed="0.871273"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:33.733962" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:33.733701" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:33.733683" elapsed="0.000360"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:01:32.862143" elapsed="0.871925"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:33.739884" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:33.739776" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:33.739758" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:33.741126" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:33.741018" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:33.741001" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:33.741659" level="INFO">${karaf_connection_index} = 475</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:33.741341" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T01:01:33.742072" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T01:01:33.741848" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T01:01:33.784612" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T01:01:33.742628" elapsed="0.042090"/>
</kw>
<msg time="2026-04-10T01:01:33.784881" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T01:01:33.784927" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:33.742265" elapsed="0.042700"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T01:01:33.900153" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "A "f "t "e "r "[C "C "o "n "t "i "n "u "o "u "s "[C "D "e "l "e "t "i "o "n "[C "a "n "d "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "s "[C "f "o "r "[C "5 "[C "i "t "e "r "a "t "i "o "[78Cn "[A[78Cs
 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T01:01:33.785485" elapsed="0.114904"/>
</kw>
<msg time="2026-04-10T01:01:33.900581" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T01:01:33.900631" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:33.785140" elapsed="0.115529"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:33.901012" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:33.900760" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:33.900736" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:33.901579" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "A "f "t "e "r "[C "C "o "n "t "i "n "u "o "u "s "[C "D "e "l "e "t "i "o "n "[C "a "n "d "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "s "[C "f "o "r "[C "5 "[C "i "t "e "r "a "t "i "o "[78Cn "[A[78Cs
 "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:33.901240" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:33.901981" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:33.901760" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:33.901742" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T01:01:33.902096" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:33.903643" elapsed="0.000768"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T01:01:33.904709" elapsed="0.000459"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T01:01:33.905435" elapsed="0.000377"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T01:01:33.902984" elapsed="0.002928"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T01:01:33.902390" elapsed="0.003585"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T01:01:33.740711" elapsed="0.165364"/>
</kw>
<msg time="2026-04-10T01:01:33.906169" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:33.906214" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:33.740107" elapsed="0.166146"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T01:01:33.906439" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T01:01:33.906331" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:33.906313" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:33.906975" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:33.907315" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T01:01:33.907387" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T01:01:33.739386" elapsed="0.168112"/>
</kw>
<msg time="2026-04-10T01:01:33.907612" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:33.907658" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:33.734345" elapsed="0.173350"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:33.908023" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:33.907772" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:33.907755" elapsed="0.000346"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T01:01:33.734199" elapsed="0.173925"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:01:32.687077" elapsed="1.221080"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T01:01:32.684613" elapsed="1.223604"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T01:01:32.679033" elapsed="1.229286"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:32.678585" elapsed="1.229783"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T01:01:32.675047" elapsed="1.233380"/>
</kw>
<kw name="Get_Current_Term_Of_Shard_At_Member">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:33.912432" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:33.912123" elapsed="0.000337"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:33.912507" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:33.912768" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:33.911765" elapsed="0.001028"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:33.917116" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:33.912863" elapsed="0.004324"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:33.912846" elapsed="0.004366"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T01:01:33.917837" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T01:01:33.917727" elapsed="0.000172"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T01:01:33.917959" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:33.917922" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:33.917710" elapsed="0.000311"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:33.918168" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T01:01:33.918287" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T01:01:33.917440" elapsed="0.000872"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:33.918904" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:33.918492" elapsed="0.000439"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:33.919567" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:33.919090" elapsed="0.000506"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:33.925196" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:33.924939" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:33.925662" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:33.925402" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:34.230064" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:34.230306" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:34 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:34 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":115014,"SnapshotIndex":434162,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":434162,"Leader":"member-2-shard-inventory-config","LastIndex":434163,"RaftState":"Leader","LastApplied":434163,"LastCommittedTransactionTime":"2026-04-10 01:01:18.120","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":434163,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.048","active":true,"matchIndex":434163,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":434164},{"timeSinceLastActivity":"00:00:00.013","active":true,"matchIndex":434163,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":434164}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"856.2 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":14,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":434163,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10006,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":583880},"timestamp":1775782894,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:34.230831" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:33.927964" elapsed="0.302940"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:33.925775" elapsed="0.305246"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.231521" elapsed="0.000091"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.231093" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:33.925757" elapsed="0.306014"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.238236" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":115014,"SnapshotIndex":434162,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":434162,"Leader":"member-2-shard-inventory-config","LastIndex":434163,"RaftState":"Leader","LastApplied":434163,"LastCommittedTransactionTime":"2026-04-10 01:01:18.120","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":434163,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.048","active":true,"matchIndex":434163,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":434164},{"timeSinceLastActivity":"00:00:00.013","active":true,"matchIndex":434163,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":434164}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"856.2 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":14,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":434163,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10006,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":583880},"timestamp":1775782894,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:34.234386" elapsed="0.003942"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:34.233947" elapsed="0.004431"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.233885" elapsed="0.004528"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.242254" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:34.238832" elapsed="0.003486"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:34.238493" elapsed="0.003874"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.238468" elapsed="0.003934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.243218" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:34.242674" elapsed="0.000582"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.243710" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.243355" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.244470" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:34.244049" elapsed="0.000457"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:34.243824" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.243330" elapsed="0.001278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.245342" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:34.244832" elapsed="0.000546"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.245845" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.245476" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.246609" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:34.246178" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:34.245956" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.245451" elapsed="0.001273"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:34.246944" elapsed="0.000474"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:34.248073" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:34.247672" elapsed="0.000437"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:34.248337" elapsed="0.003023"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:34.232675" elapsed="0.018749"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.251655" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:34.251495" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.251477" elapsed="0.000252"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:01:34.254929" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:01:34.251878" elapsed="0.003081"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:01:34.255012" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T01:01:34.255178" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:33.920471" elapsed="0.334734"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:34.255263" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T01:01:34.255413" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T01:01:33.919811" elapsed="0.335628"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.256510" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782894, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:34.256033" elapsed="0.000506"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:34.256604" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:34.256785" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782894, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:34.255686" elapsed="0.001126"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:34.257176" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 434163, 'CommittedTransactionsCount': 14, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': Tru...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:34.256969" elapsed="0.000234"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:34.257577" level="INFO">${raft_property} = 7</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:34.257360" elapsed="0.000244"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T01:01:34.257650" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:34.257819" level="INFO">${current_term_value} = 7</msg>
<var>${current_term_value}</var>
<arg>CurrentTerm</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${Inventory_Leader}</arg>
<arg>${verify_restconf}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T01:01:33.909011" elapsed="0.348833"/>
</kw>
<return>
<value>${current_term_value}</value>
<status status="PASS" start="2026-04-10T01:01:34.257900" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:01:34.258064" level="INFO">${current_term_value_after} = 7</msg>
<var>${current_term_value_after}</var>
<doc>Find a Raft Property Values From Shard Member</doc>
<status status="PASS" start="2026-04-10T01:01:33.908599" elapsed="0.349490"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.258597" level="INFO">${current_term_value_after} = 7</msg>
<arg>${current_term_value_after}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-10T01:01:34.258257" elapsed="0.000383"/>
</kw>
<doc>Verifying current term for Leader Node after continuous deletion and addition of ten percent of the flows</doc>
<status status="PASS" start="2026-04-10T01:01:32.674315" elapsed="1.584434"/>
</test>
<test id="s1-s4-t9" name="Current Term Comparison Before and After Continuous Deletion and Addition Of Flows for 5 iterations" line="103">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T01:01:34.262984" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T01:01:34.262714" elapsed="0.000534"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.264239" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:34.264131" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.264113" elapsed="0.000195"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.269492" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:34.269387" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.269368" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.270606" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T01:01:34.270207" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.271153" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T01:01:34.270840" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T01:01:34.271224" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:34.271381" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T01:01:34.269827" elapsed="0.001579"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.276955" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:34.276850" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.276831" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.278196" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:34.278085" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.278067" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:34.278725" level="INFO">${karaf_connection_index} = 471</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:34.278407" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T01:01:34.279142" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T01:01:34.278913" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T01:01:34.311409" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T01:01:34.279689" elapsed="0.031891"/>
</kw>
<msg time="2026-04-10T01:01:34.311782" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T01:01:34.311831" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.279328" elapsed="0.032541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T01:01:34.436259" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "C "o "m "p "a "r "i "s "o "n "[C "B "e "f "o "r "e "[C "a "n "d "[C "A "f "t "e "r "[C "C "o "n "t "i "n "u "o "u "s "[C "D "e "l "e "t "i "o "n "[C "a "n "d "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "s "[C "f "o "r "[C "5 "[78C[C "[A[78Ci
 "t "e "r "a "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T01:01:34.312491" elapsed="0.124251"/>
</kw>
<msg time="2026-04-10T01:01:34.437276" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T01:01:34.437389" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.312082" elapsed="0.125394"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.438243" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.437733" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.437678" elapsed="0.000653"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.438863" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "C "o "m "p "a "r "i "s "o "n "[C "B "e "f "o "r "e "[C "a "n "d "[C "A "f "t "e "r "[C "C "o "n "t "i "n "u "o "u "s "[C "D "e "l "e "t "i "o "n "[C "a "n "d "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "s "[C "f "o "r "[C "5 "[78C[C "[A[78Ci
 "t "e "r "a "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:34.438479" elapsed="0.000505"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.439281" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.439057" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.439037" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T01:01:34.439400" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:34.441061" elapsed="0.000839"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T01:01:34.442210" elapsed="0.000502"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T01:01:34.443060" elapsed="0.000369"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T01:01:34.440325" elapsed="0.003207"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T01:01:34.439736" elapsed="0.003882"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T01:01:34.277783" elapsed="0.165937"/>
</kw>
<msg time="2026-04-10T01:01:34.443818" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:34.443862" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.277175" elapsed="0.166726"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T01:01:34.444100" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T01:01:34.443982" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.443962" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.444618" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.444969" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.445042" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T01:01:34.276500" elapsed="0.168697"/>
</kw>
<msg time="2026-04-10T01:01:34.445296" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:34.445341" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.271799" elapsed="0.173581"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.445733" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.445459" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.445442" elapsed="0.000371"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T01:01:34.271653" elapsed="0.174185"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.451625" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:34.451499" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.451480" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.452869" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:34.452760" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.452743" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:34.453431" level="INFO">${karaf_connection_index} = 473</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:34.453113" elapsed="0.000346"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T01:01:34.453870" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T01:01:34.453639" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T01:01:34.492970" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T01:01:34.454415" elapsed="0.038741"/>
</kw>
<msg time="2026-04-10T01:01:34.493394" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T01:01:34.493453" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.454059" elapsed="0.039442"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T01:01:34.619351" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "C "o "m "p "a "r "i "s "o "n "[C "B "e "f "o "r "e "[C "a "n "d "[C "A "f "t "e "r "[C "C "o "n "t "i "n "u "o "u "s "[C "D "e "l "e "t "i "o "n "[C "a "n "d "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "s "[C "f "o "r "[C "5 "[78C[C "[A[78Ci
 "t "e "r "a "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T01:01:34.494307" elapsed="0.125505"/>
</kw>
<msg time="2026-04-10T01:01:34.620092" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T01:01:34.620154" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.493809" elapsed="0.126396"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.620821" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.620353" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.620312" elapsed="0.000619"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.621621" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "C "o "m "p "a "r "i "s "o "n "[C "B "e "f "o "r "e "[C "a "n "d "[C "A "f "t "e "r "[C "C "o "n "t "i "n "u "o "u "s "[C "D "e "l "e "t "i "o "n "[C "a "n "d "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "s "[C "f "o "r "[C "5 "[78C[C "[A[78Ci
 "t "e "r "a "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:34.621126" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.622136" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.621851" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.621829" elapsed="0.000405"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T01:01:34.622281" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:34.624619" elapsed="0.001014"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T01:01:34.625995" elapsed="0.000589"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T01:01:34.626922" 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-04-10T01:01:34.623749" elapsed="0.003744"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T01:01:34.622692" elapsed="0.004901"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T01:01:34.452437" elapsed="0.175284"/>
</kw>
<msg time="2026-04-10T01:01:34.627842" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:34.627899" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.451856" elapsed="0.176093"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T01:01:34.628197" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T01:01:34.628058" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.628032" elapsed="0.000282"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.628912" 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-04-10T01:01:34.629372" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.629462" elapsed="0.000020"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T01:01:34.451136" elapsed="0.178490"/>
</kw>
<msg time="2026-04-10T01:01:34.629746" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:34.629802" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.446121" elapsed="0.183731"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.630279" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.629949" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.629927" elapsed="0.000450"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:01:34.445969" elapsed="0.184438"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.638359" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:34.638192" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.638158" elapsed="0.000478"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.640692" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:34.640329" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.640306" elapsed="0.000473"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:34.641372" level="INFO">${karaf_connection_index} = 475</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:34.640975" elapsed="0.000432"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T01:01:34.641928" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T01:01:34.641643" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T01:01:34.681706" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T01:01:34.642623" elapsed="0.039238"/>
</kw>
<msg time="2026-04-10T01:01:34.682080" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T01:01:34.682139" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.642173" elapsed="0.040015"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T01:01:34.844262" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "C "o "m "p "a "r "i "s "o "n "[C "B "e "f "o "r "e "[C "a "n "d "[C "A "f "t "e "r "[C "C "o "n "t "i "n "u "o "u "s "[C "D "e "l "e "t "i "o "n "[C "a "n "d "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "s "[C "f "o "r "[C "5 "[78C[C "[A[78Ci
 "t "e "r "a "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T01:01:34.682941" elapsed="0.161650"/>
</kw>
<msg time="2026-04-10T01:01:34.844840" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T01:01:34.844889" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.682441" elapsed="0.162485"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.845407" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.845051" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.845015" elapsed="0.000483"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.846071" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "C "u "r "r "e "n "t "[C "[78CT "[A[78Ce
 "r "m "[C "C "o "m "p "a "r "i "s "o "n "[C "B "e "f "o "r "e "[C "a "n "d "[C "A "f "t "e "r "[C "C "o "n "t "i "n "u "o "u "s "[C "D "e "l "e "t "i "o "n "[C "a "n "d "[C "A "d "d "i "t "i "o "n "[C "O "f "[C "F "l "o "w "s "[C "f "o "r "[C "5 "[78C[C "[A[78Ci
 "t "e "r "a "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:34.845670" elapsed="0.000513"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.846469" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.846251" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.846232" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T01:01:34.846603" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:34.848200" elapsed="0.000783"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T01:01:34.849262" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T01:01:34.850016" elapsed="0.000357"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T01:01:34.847520" elapsed="0.002953"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T01:01:34.846940" elapsed="0.003595"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T01:01:34.639947" elapsed="0.210704"/>
</kw>
<msg time="2026-04-10T01:01:34.850750" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:34.850795" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.638895" elapsed="0.212008"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T01:01:34.851094" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T01:01:34.850986" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.850968" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.851603" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.852244" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.852320" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T01:01:34.637635" elapsed="0.214796"/>
</kw>
<msg time="2026-04-10T01:01:34.852525" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:34.852586" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.630781" elapsed="0.221844"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.852952" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.852701" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.852684" elapsed="0.000345"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T01:01:34.630589" elapsed="0.222464"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:01:34.271462" elapsed="0.581627"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T01:01:34.269021" elapsed="0.584161"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T01:01:34.263843" elapsed="0.589408"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.263402" elapsed="0.589902"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T01:01:34.259939" elapsed="0.593437"/>
</kw>
<kw name="Log To Console" owner="BuiltIn">
<arg>Current Term after pushing the flows is ${current_term_value_after}</arg>
<doc>Logs the given message to the console.</doc>
<status status="PASS" start="2026-04-10T01:01:34.853614" elapsed="0.000532"/>
</kw>
<if>
<branch type="IF" condition="${current_term_value_before} == ${current_term_value_after}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.854942" level="INFO">SUCCESS</msg>
<arg>SUCCESS</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:34.854523" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:34.854233" elapsed="0.000790"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>FAILURE</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.855210" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.855047" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.854213" elapsed="0.001068"/>
</if>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${current_term_value_before}</arg>
<arg>${current_term_value_after}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-04-10T01:01:34.855444" elapsed="0.000364"/>
</kw>
<doc>Comparison Current Term Before and After Continuous Deletion and Addition Of Flows for 5 iterations</doc>
<status status="PASS" start="2026-04-10T01:01:34.259275" elapsed="0.596647"/>
</test>
<test id="s1-s4-t10" name="Delete All Flows From Follower Node" line="113">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T01:01:34.859616" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T01:01:34.859336" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.860876" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:34.860762" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.860745" elapsed="0.000198"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.866121" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:34.866016" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.865999" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.867186" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T01:01:34.866806" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.867704" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T01:01:34.867374" elapsed="0.000357"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T01:01:34.867816" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:01:34.867975" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T01:01:34.866415" elapsed="0.001584"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.875409" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:34.875300" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.875282" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.876727" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:34.876617" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.876597" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:34.877250" level="INFO">${karaf_connection_index} = 471</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:34.876946" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T01:01:34.877701" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T01:01:34.877451" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T01:01:34.909190" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T01:01:34.878233" elapsed="0.031060"/>
</kw>
<msg time="2026-04-10T01:01:34.909476" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T01:01:34.909523" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.877891" elapsed="0.031692"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T01:01:34.976043" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T01:01:34.910118" elapsed="0.066255"/>
</kw>
<msg time="2026-04-10T01:01:34.976696" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T01:01:34.976756" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.909762" elapsed="0.067043"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.977370" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.976953" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.976910" elapsed="0.000568"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:34.978174" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:34.977701" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.978679" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.978376" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.978354" elapsed="0.000425"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T01:01:34.978827" elapsed="0.000048"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:34.980823" elapsed="0.000961"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T01:01:34.982146" elapsed="0.000593"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T01:01:34.983079" elapsed="0.000478"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T01:01:34.980008" elapsed="0.003676"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T01:01:34.979240" elapsed="0.004524"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T01:01:34.876250" elapsed="0.107725"/>
</kw>
<msg time="2026-04-10T01:01:34.984105" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:34.984163" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.875676" elapsed="0.108537"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T01:01:34.984469" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-10T01:01:34.984325" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.984297" elapsed="0.000314"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.985159" elapsed="0.000036"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.985636" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.985727" elapsed="0.000020"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T01:01:34.874954" elapsed="0.110912"/>
</kw>
<msg time="2026-04-10T01:01:34.985989" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:34.986045" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.868376" elapsed="0.117716"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:34.986516" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:34.986189" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.986167" elapsed="0.000466"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T01:01:34.868233" elapsed="0.118431"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.994896" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:34.994731" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.994702" elapsed="0.000300"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:34.996705" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:34.996538" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:34.996516" elapsed="0.000276"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:34.997474" level="INFO">${karaf_connection_index} = 473</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:34.996985" elapsed="0.000525"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T01:01:34.998044" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T01:01:34.997750" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T01:01:35.033879" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T01:01:34.998753" elapsed="0.035294"/>
</kw>
<msg time="2026-04-10T01:01:35.034256" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T01:01:35.034304" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.998293" elapsed="0.036049"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T01:01:35.129792" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T01:01:35.035027" elapsed="0.094906"/>
</kw>
<msg time="2026-04-10T01:01:35.130100" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T01:01:35.130147" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:35.034598" elapsed="0.095586"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.130837" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:35.130283" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.130256" elapsed="0.000666"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.131387" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:35.131066" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.131791" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:35.131571" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.131541" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T01:01:35.131906" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:35.133485" elapsed="0.000792"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T01:01:35.134726" elapsed="0.000507"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T01:01:35.135499" elapsed="0.000382"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T01:01:35.132837" elapsed="0.003145"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T01:01:35.132223" elapsed="0.003823"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T01:01:34.996161" elapsed="0.139983"/>
</kw>
<msg time="2026-04-10T01:01:35.136239" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:35.136283" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.995280" elapsed="0.141040"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T01:01:35.136505" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T01:01:35.136398" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.136380" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.137011" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.137357" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T01:01:35.137430" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T01:01:34.994146" elapsed="0.143411"/>
</kw>
<msg time="2026-04-10T01:01:35.137658" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:35.137704" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.987020" elapsed="0.150723"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.138068" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:35.137819" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.137802" elapsed="0.000342"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:01:34.986826" elapsed="0.151342"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:35.144010" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:35.143903" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.143885" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:35.145213" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:35.145107" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.145089" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:35.145753" level="INFO">${karaf_connection_index} = 475</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:35.145426" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T01:01:35.146213" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T01:01:35.145987" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T01:01:35.185121" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T01:01:35.146795" elapsed="0.038577"/>
</kw>
<msg time="2026-04-10T01:01:35.185645" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T01:01:35.185695" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:35.146402" elapsed="0.039331"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T01:01:35.261662" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T01:01:35.186479" elapsed="0.075461"/>
</kw>
<msg time="2026-04-10T01:01:35.262187" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T01:01:35.262236" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:35.186012" elapsed="0.076263"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.262801" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:35.262427" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.262364" elapsed="0.000525"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.263433" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "A "[78Cl "[A[78Cl
 "[C "F "l "o "w "s "[C "F "r "o "m "[C "F "o "l "l "o "w "e "r "[C "N "o "d "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:35.263037" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.263832" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:35.263611" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.263593" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T01:01:35.263947" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:35.265511" elapsed="0.000798"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T01:01:35.266652" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T01:01:35.267400" elapsed="0.000389"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T01:01:35.264863" elapsed="0.003028"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T01:01:35.264268" elapsed="0.003687"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T01:01:35.144807" elapsed="0.123251"/>
</kw>
<msg time="2026-04-10T01:01:35.268160" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:35.268206" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:35.144231" elapsed="0.124013"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T01:01:35.268438" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-10T01:01:35.268328" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.268308" elapsed="0.000222"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.268979" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.269329" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T01:01:35.269471" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T01:01:35.143441" elapsed="0.126163"/>
</kw>
<msg time="2026-04-10T01:01:35.269702" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:35.269747" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:35.138441" elapsed="0.131345"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.270122" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:35.269865" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.269847" elapsed="0.000353"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T01:01:35.138299" elapsed="0.131926"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:01:34.868055" elapsed="0.402205"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T01:01:34.865658" elapsed="0.404660"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T01:01:34.860456" elapsed="0.409960"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:34.860041" elapsed="0.410423"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T01:01:34.857010" elapsed="0.413508"/>
</kw>
<kw name="Delete Bulk Flow In Node" owner="BulkomaticKeywords">
<kw name="Delete Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.282298" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:35.281909" elapsed="0.000440"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:35.282410" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T01:01:35.282601" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:35.281444" elapsed="0.001183"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.297103" level="INFO">/rests/operations/sal-bulk-flow:flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:35.296781" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.297594" level="INFO">{
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:35.297335" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.298044" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:35.297797" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.298504" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:35.298241" elapsed="0.000327"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:35.299418" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T01:01:35.299211" elapsed="0.000233"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T01:01:35.299793" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T01:01:35.299619" elapsed="0.000200"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T01:01:35.299972" elapsed="0.000201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.300594" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:35.300331" elapsed="0.000308"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T01:01:35.300684" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:01:35.300857" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T01:01:35.298794" elapsed="0.002087"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:35.317473" level="INFO">POST Request : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 path_url=/rests/operations/sal-bulk-flow:flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0nkiqu3346hj211w1hvscphjat0.node0', 'Content-Length': '404', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:is-add" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:batch-size" : "10000",
   "sal-bulk-flow:seq" : "true",
   "sal-bulk-flow:tx-chain" : "true",
   "sal-bulk-flow:sleep-for" : "0",
   "sal-bulk-flow:sleep-after" : "1",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T01:01:35.317924" level="INFO">POST Response : url=http://10.30.170.165:8181/rests/operations/sal-bulk-flow:flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:35.318285" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:35.303569" elapsed="0.014782"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:35.300963" elapsed="0.017520"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.319076" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:35.318602" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.300943" elapsed="0.018344"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.326508" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:35.321883" elapsed="0.004710"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:35.321328" elapsed="0.005319"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.321282" elapsed="0.005401"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.330789" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:35.327105" elapsed="0.003753"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:35.326767" elapsed="0.004142"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.326742" elapsed="0.004202"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.331823" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:35.331208" elapsed="0.000655"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.332321" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:35.331968" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.333158" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:35.332708" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:35.332439" elapsed="0.000818"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.331942" elapsed="0.001344"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.334038" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:35.333510" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.334651" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:35.334208" elapsed="0.000530"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.335364" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:35.335008" elapsed="0.000383"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:35.334773" elapsed="0.000652"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.334149" elapsed="0.001297"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:35.335620" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:35.336447" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:35.336139" elapsed="0.000334"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:35.336646" elapsed="0.002471"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:35.320196" elapsed="0.018988"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:01:35.339373" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:35.339260" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.339241" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:01:35.342175" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:01:35.339613" elapsed="0.002589"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:01:35.342252" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T01:01:35.342424" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:35.293942" elapsed="0.048507"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:35.342571" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:35.342732" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T01:01:35.291065" elapsed="0.051692"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:35.342812" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:01:35.342962" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${ADD_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:35.280938" elapsed="0.062049"/>
</kw>
<arg>${json_body_del}</arg>
<arg>${controller_index}</arg>
<doc>Delete Bulk Flow in member 1 according to ${json_body_del}.</doc>
<status status="PASS" start="2026-04-10T01:01:35.276153" elapsed="0.066903"/>
</kw>
<kw name="Wait Until Write Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.350255" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:35.349937" elapsed="0.000345"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:35.350329" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:35.350478" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:35.349588" elapsed="0.000914"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.357309" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:35.357060" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.357767" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:35.357510" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:35.365469" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:35.365525" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:35 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:35 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782895,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:35.365639" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:35.360031" elapsed="0.005634"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:35.357878" elapsed="0.007830"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.365887" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:35.365734" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.357860" elapsed="0.008110"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.369476" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782895,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:35.366988" elapsed="0.002536"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:35.366767" elapsed="0.002805"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.366749" elapsed="0.002849"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.373347" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:35.369993" elapsed="0.003418"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:35.369655" elapsed="0.003804"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.369638" elapsed="0.003854"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.374281" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:35.373740" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.374765" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:35.374416" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.375519" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:35.375100" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:35.374876" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.374391" elapsed="0.001316"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.376454" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:35.375940" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.376946" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:35.376613" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.377720" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:35.377285" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:35.377058" elapsed="0.000749"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.376587" elapsed="0.001249"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:35.378088" elapsed="0.000504"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:35.379206" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:35.378826" elapsed="0.000407"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:35.379388" elapsed="0.002640"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:35.366330" elapsed="0.015761"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:35.382266" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T01:01:35.382161" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:35.382143" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:35.382498" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:35.382588" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:35.384941" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782895,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:35.350856" elapsed="0.034113"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:35.385020" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:35.385171" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":1,"timestamp":1775782895,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:35.349107" elapsed="0.036089"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.386187" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782895, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:35.385773" elapsed="0.000443"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:35.386264" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:35.386417" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782895, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:35.385415" elapsed="0.001028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:35.386824" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:35.386641" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.387431" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:35.387080" elapsed="0.000378"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.387911" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:35.387648" elapsed="0.000288"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:35.388457" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:35.388108" elapsed="0.000426">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:35.344294" elapsed="0.044373">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.401114" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:36.400734" elapsed="0.000414"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:36.401306" elapsed="0.000044"/>
</return>
<msg time="2026-04-10T01:01:36.401481" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:36.400351" elapsed="0.001155"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.410584" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.410080" elapsed="0.000578"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.411341" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.410972" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:36.421019" level="INFO">GET Request : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:36.421079" level="INFO">GET Response : url=http://10.30.170.165:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/WriteOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:36 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:36 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782896,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:36.421173" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:36.413932" elapsed="0.007268"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:36.411513" elapsed="0.009737"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.421512" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.421294" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.411484" elapsed="0.010181"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.426688" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782896,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.423227" elapsed="0.003531"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:36.422884" elapsed="0.003946"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.422855" elapsed="0.004009"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.430669" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.427256" elapsed="0.003480"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:36.426942" elapsed="0.003842"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.426919" elapsed="0.003937"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.431557" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:36.431106" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.431899" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.431657" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.432454" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:36.432141" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:36.431978" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.431639" elapsed="0.000930"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.433100" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:36.432733" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.433431" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.433197" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.433992" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:36.433690" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:36.433512" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.433180" elapsed="0.000896"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:36.434232" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:36.435084" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:36.434772" elapsed="0.000339"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:36.435327" elapsed="0.002455"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:36.422181" elapsed="0.015666"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:36.438028" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-10T01:01:36.437918" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.437900" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.438270" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:36.438341" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:36.440749" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782896,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:36.401882" elapsed="0.038896"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:36.440831" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:36.440983" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"WriteOpStatus","type":"read"},"value":2,"timestamp":1775782896,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:36.399865" elapsed="0.041145"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.442106" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782896, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:36.441700" elapsed="0.000434"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:36.442183" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:36.442338" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'WriteOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782896, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:36.441233" elapsed="0.001131"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:36.442806" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:36.442593" elapsed="0.000242"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.443372" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:36.443044" elapsed="0.000354"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.443850" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:36.443589" elapsed="0.000286"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T01:01:36.444048" elapsed="0.000306"/>
</kw>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T01:01:36.389718" elapsed="0.054697"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_write_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T01:01:35.343705" elapsed="1.100761"/>
</kw>
<arg>${controller_index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Write operation status is OK in member 1.</doc>
<status status="PASS" start="2026-04-10T01:01:35.343291" elapsed="1.101238"/>
</kw>
<arg>${temp_json_config_del}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Delete Bulk Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="PASS" start="2026-04-10T01:01:35.275521" elapsed="1.169083"/>
</kw>
<doc>10000 Flows deleted via Leader Node and verify it gets applied in all instances.</doc>
<status status="PASS" start="2026-04-10T01:01:34.856404" elapsed="1.588323"/>
</test>
<test id="s1-s4-t11" name="Verify No Flows In Cluster After Flow Deletion" line="120">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T01:01:36.448388" elapsed="0.000229"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T01:01:36.448118" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:36.449678" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:36.449561" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.449527" elapsed="0.000239"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:36.454987" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:36.454879" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.454860" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.456068" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T01:01:36.455686" elapsed="0.000451"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.456631" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T01:01:36.456304" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T01:01:36.456703" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:36.456858" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T01:01:36.455286" elapsed="0.001596"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:36.463017" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:36.462905" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.462880" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:36.464343" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:36.464234" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.464216" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:36.464895" level="INFO">${karaf_connection_index} = 471</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:36.464588" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T01:01:36.465329" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T01:01:36.465096" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T01:01:36.496919" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T01:01:36.465898" elapsed="0.031138"/>
</kw>
<msg time="2026-04-10T01:01:36.497209" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T01:01:36.497259" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:36.465517" elapsed="0.031796"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T01:01:36.566980" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "F "l "o "w "[C "D "e "l "e "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T01:01:36.497918" elapsed="0.069288"/>
</kw>
<msg time="2026-04-10T01:01:36.567419" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T01:01:36.567468" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:36.497523" elapsed="0.069984"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.567954" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.567642" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.567611" elapsed="0.000432"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.568564" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "F "l "o "w "[C "D "e "l "e "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.568191" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.568955" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.568733" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.568715" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T01:01:36.569071" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:36.570740" elapsed="0.000782"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T01:01:36.571903" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T01:01:36.572748" 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-04-10T01:01:36.569982" elapsed="0.003226"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T01:01:36.569399" elapsed="0.003873"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T01:01:36.463917" elapsed="0.109456"/>
</kw>
<msg time="2026-04-10T01:01:36.573469" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:36.573515" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:36.463244" elapsed="0.110327"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T01:01:36.573760" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T01:01:36.573652" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.573634" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.574255" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.574702" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T01:01:36.574781" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T01:01:36.462505" elapsed="0.112388"/>
</kw>
<msg time="2026-04-10T01:01:36.574989" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:36.575033" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:36.457289" elapsed="0.117781"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.575401" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.575148" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.575130" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T01:01:36.457121" elapsed="0.118381"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:36.581176" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:36.581068" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.581049" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:36.582464" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:36.582282" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.582262" elapsed="0.000273"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:36.583017" level="INFO">${karaf_connection_index} = 473</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:36.582713" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T01:01:36.583506" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T01:01:36.583204" elapsed="0.000357"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T01:01:36.620098" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T01:01:36.584259" elapsed="0.036114"/>
</kw>
<msg time="2026-04-10T01:01:36.620793" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T01:01:36.620950" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:36.583788" elapsed="0.037255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T01:01:36.725445" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "F "l "o "w "[C "D "e "l "e "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T01:01:36.622302" elapsed="0.103330"/>
</kw>
<msg time="2026-04-10T01:01:36.725896" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T01:01:36.725979" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:36.621438" elapsed="0.104581"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.726397" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.726122" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.726093" elapsed="0.000391"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.727018" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "F "l "o "w "[C "D "e "l "e "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.726662" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.727406" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.727183" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.727164" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T01:01:36.727525" elapsed="0.000053"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:36.729349" elapsed="0.000877"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T01:01:36.730523" elapsed="0.000510"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T01:01:36.731311" elapsed="0.000389"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T01:01:36.728689" elapsed="0.003115"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T01:01:36.727858" elapsed="0.004021"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T01:01:36.581976" elapsed="0.150005"/>
</kw>
<msg time="2026-04-10T01:01:36.732077" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:36.732122" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:36.581398" elapsed="0.150761"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T01:01:36.732346" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-10T01:01:36.732238" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.732218" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.732855" elapsed="0.000031"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.733204" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T01:01:36.733277" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T01:01:36.580723" elapsed="0.152665"/>
</kw>
<msg time="2026-04-10T01:01:36.733483" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:36.733682" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:36.575799" elapsed="0.157922"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.734081" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.733798" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.733781" elapsed="0.000378"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:01:36.575654" elapsed="0.158528"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:36.740008" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:36.739900" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.739880" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:36.741304" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:36.741196" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.741177" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:36.741849" level="INFO">${karaf_connection_index} = 475</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:36.741523" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T01:01:36.742330" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T01:01:36.742096" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T01:01:36.774694" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T01:01:36.742879" elapsed="0.032042"/>
</kw>
<msg time="2026-04-10T01:01:36.775280" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T01:01:36.775384" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:36.742521" elapsed="0.032945"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T01:01:36.851596" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "F "l "o "w "[C "D "e "l "e "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T01:01:36.776767" elapsed="0.075002"/>
</kw>
<msg time="2026-04-10T01:01:36.851960" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T01:01:36.852010" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:36.775924" elapsed="0.076124"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.852431" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.852150" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.852124" elapsed="0.000393"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.853043" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "N "[78Co "[A[78C
 "F "l "o "w "s "[C "I "n "[C "C "l "u "s "t "e "r "[C "A "f "t "e "r "[C "F "l "o "w "[C "D "e "l "e "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.852695" 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 with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.853425" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.853203" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.853185" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T01:01:36.853581" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:36.855127" elapsed="0.000796"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T01:01:36.856206" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T01:01:36.856957" 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-04-10T01:01:36.854464" elapsed="0.002955"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T01:01:36.853899" elapsed="0.003584"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T01:01:36.740840" elapsed="0.116796"/>
</kw>
<msg time="2026-04-10T01:01:36.857734" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:36.857779" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:36.740239" elapsed="0.117578"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T01:01:36.858004" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T01:01:36.857895" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.857877" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.858510" elapsed="0.000100"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.859203" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T01:01:36.859280" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T01:01:36.739539" elapsed="0.119856"/>
</kw>
<msg time="2026-04-10T01:01:36.859491" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:36.859536" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:36.734465" elapsed="0.125127"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.859928" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.859670" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.859652" elapsed="0.000355"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T01:01:36.734322" elapsed="0.125709"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:01:36.456942" elapsed="0.403122"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T01:01:36.454478" elapsed="0.405645"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T01:01:36.449256" elapsed="0.410927"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:36.448827" elapsed="0.411403"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T01:01:36.445687" elapsed="0.414598"/>
</kw>
<kw name="Get Bulk Flow And Verify Count In Cluster" owner="BulkomaticKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.870451" level="INFO">${return_list_reference} = [2]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T01:01:36.870059" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.870965" level="INFO">${return_list_copy} = [2]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T01:01:36.870663" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T01:01:36.871036" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:36.871189" level="INFO">${index_list} = [2]</msg>
<var>${index_list}</var>
<arg>given_list=${controller_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T01:01:36.869677" elapsed="0.001536"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get Bulk Flow" owner="BulkomaticKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.881911" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:36.881607" elapsed="0.000331"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:36.881984" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:36.882131" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:36.881227" elapsed="0.000929"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.897709" level="INFO">/rests/operations/sal-bulk-flow:read-flow-test</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.897399" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.898158" level="INFO">{
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.897916" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.898625" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.898360" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.899070" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.898826" elapsed="0.000288"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:36.899946" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-10T01:01:36.899743" elapsed="0.000230"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-10T01:01:36.900343" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-10T01:01:36.900127" elapsed="0.000242"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-10T01:01:36.900521" elapsed="0.000216"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.901145" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.900894" elapsed="0.000295"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-10T01:01:36.901231" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:36.901386" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-10T01:01:36.899317" elapsed="0.002111"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:36.918030" level="INFO">POST Request : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 path_url=/rests/operations/sal-bulk-flow:read-flow-test 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node01b3pbevn4kxyj1kisxadobjg3x0.node0', 'Content-Length': '261', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body={
"input" :
  {
   "sal-bulk-flow:verbose" : "false",
   "sal-bulk-flow:dpn-count" : "1",
   "sal-bulk-flow:is-config-ds" : "true",
   "sal-bulk-flow:flows-per-dpn" : "10000",
   "sal-bulk-flow:start-table-id" : "0",
   "sal-bulk-flow:end-table-id" : "1"
  }
}
 
 </msg>
<msg time="2026-04-10T01:01:36.918134" level="INFO">POST Response : url=http://10.30.170.169:8181/rests/operations/sal-bulk-flow:read-flow-test 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:36.918348" level="INFO">${response} = &lt;Response [204]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:36.903801" elapsed="0.014606"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:36.901502" elapsed="0.017008"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.918953" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.918602" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.901484" elapsed="0.017667"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.926668" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.921532" elapsed="0.005181"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:36.920966" elapsed="0.005783"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.920925" elapsed="0.005848"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.929761" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.927054" elapsed="0.002755"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:36.926829" elapsed="0.003015"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.926812" elapsed="0.003056"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.930443" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:36.930048" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.930801" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.930558" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.931357" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:36.931051" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:36.930887" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.930523" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.931983" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:36.931618" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.932323" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.932080" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.932876" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:36.932580" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:36.932404" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.932063" elapsed="0.000895"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:36.933110" elapsed="0.000496"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:36.934080" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:36.933784" elapsed="0.000322"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:36.934309" elapsed="0.002644"/>
</kw>
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:36.919954" elapsed="0.017062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:01:36.937203" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:36.937094" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.937075" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:01:36.939973" level="INFO">${text_normalized} = </msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:01:36.937470" elapsed="0.002531"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:01:36.940051" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:36.940208" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:36.893097" elapsed="0.047135"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:36.940298" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:01:36.940445" level="INFO">${response_text} = </msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="PASS" start="2026-04-10T01:01:36.890477" elapsed="0.049992"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:36.940517" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T01:01:36.940678" level="INFO">${resp} = </msg>
<var>${resp}</var>
<arg>${GET_BULK_CONFIG_NODES_API}</arg>
<arg>${json_body_get}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:36.880780" elapsed="0.059922"/>
</kw>
<arg>${json_body_get}</arg>
<arg>${index}</arg>
<doc>Get Bulk Flow in member ${controller_index} according to ${json_body_get}.</doc>
<status status="PASS" start="2026-04-10T01:01:36.876171" elapsed="0.064590"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:01:36.871398" elapsed="0.069396"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:01:36.871267" elapsed="0.069559"/>
</for>
<for flavor="IN">
<iter>
<kw name="Wait Until Read Finishes" owner="BulkomaticKeywords">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.952437" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:36.952139" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:36.952510" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:36.952674" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:36.951790" elapsed="0.000909"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.959682" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.959412" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.960131" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.959885" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:36.970180" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:36.970246" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:36 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:36 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782896,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:36.970343" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:36.962431" elapsed="0.007937"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:36.960241" elapsed="0.010171"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.970612" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.970438" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.960223" elapsed="0.010475"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.974604" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782896,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.971754" elapsed="0.002921"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:36.971511" elapsed="0.003213"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.971493" elapsed="0.003265"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.978787" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:36.975152" elapsed="0.003705"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:36.974836" elapsed="0.004070"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.974812" elapsed="0.004129"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.979731" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:36.979174" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.980200" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.979869" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.980988" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:36.980561" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:36.980315" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.979843" elapsed="0.001262"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.981894" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:36.981352" elapsed="0.000581"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.982361" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:36.982032" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.983132" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:36.982720" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:36.982473" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.982007" elapsed="0.001239"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:36.983457" elapsed="0.000501"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:36.984593" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:36.984190" elapsed="0.000441"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:36.984848" elapsed="0.002895"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:36.971091" elapsed="0.016715"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:36.987983" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T01:01:36.987877" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:36.987858" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:36.988217" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:36.988288" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:36.990701" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782896,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:36.953031" elapsed="0.037699"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:36.990783" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:36.990936" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782896,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:36.951323" elapsed="0.039639"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.991942" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782896, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:36.991530" elapsed="0.000441"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:36.992059" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:36.992218" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782896, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:36.991185" elapsed="0.001059"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:36.992626" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:36.992426" elapsed="0.000225"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.993152" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:36.992830" elapsed="0.000353"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.993639" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:36.993358" elapsed="0.000307"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:36.994190" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:36.993841" elapsed="0.000421">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:36.946705" elapsed="0.047669">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:38.008121" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:38.007595" elapsed="0.000572"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:38.008249" elapsed="0.000056"/>
</return>
<msg time="2026-04-10T01:01:38.008495" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:38.006995" elapsed="0.001597"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:38.017448" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:38.017107" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:38.017960" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:38.017696" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:38.028179" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:38.028269" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:38 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:38 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782898,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:38.028415" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:38.020708" elapsed="0.007736"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:38.018094" elapsed="0.010416"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:38.028825" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:38.028591" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:38.018068" elapsed="0.010850"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:38.032952" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782898,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:38.030192" elapsed="0.002821"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:38.029918" elapsed="0.003149"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:38.029896" elapsed="0.003203"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:38.036675" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:38.033417" elapsed="0.003336"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:38.033166" elapsed="0.003642"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:38.033145" elapsed="0.003700"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:38.037787" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:38.037135" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:38.038373" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:38.037973" elapsed="0.000486"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:38.039340" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:38.038870" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:38.038612" elapsed="0.000827"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:38.037913" elapsed="0.001560"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:38.040365" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:38.039758" elapsed="0.000649"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:38.040907" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:38.040519" elapsed="0.000478"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:38.041787" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:38.041295" elapsed="0.000533"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:38.041034" elapsed="0.000849"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:38.040490" elapsed="0.001426"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:38.042157" elapsed="0.000598"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:38.043590" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:38.043051" elapsed="0.000587"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:38.043882" elapsed="0.004066"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:38.029373" elapsed="0.018657"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:38.048245" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T01:01:38.048123" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:38.048099" 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-04-10T01:01:38.048533" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:38.048627" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T01:01:38.051069" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782898,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:38.009108" elapsed="0.041992"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:38.051154" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:38.051314" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782898,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:38.006055" elapsed="0.045288"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:38.052606" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782898, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:38.052027" elapsed="0.000615"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:38.052697" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T01:01:38.052903" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782898, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:38.051627" elapsed="0.001304"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:38.053343" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:38.053146" elapsed="0.000223"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:38.053892" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:38.053574" elapsed="0.000346"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:38.054433" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:38.054127" elapsed="0.000332"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:38.055036" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:38.054668" elapsed="0.000443">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:37.995408" elapsed="0.059819">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:39.067469" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:39.067039" elapsed="0.000467"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:39.067587" elapsed="0.000045"/>
</return>
<msg time="2026-04-10T01:01:39.067765" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:39.066659" elapsed="0.001132"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:39.075036" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:39.074756" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:39.075565" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:39.075249" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:39.083394" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:39.083487" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:39 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:39 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782899,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:39.083615" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:39.077885" elapsed="0.005758"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:39.075694" elapsed="0.007995"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:39.083881" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:39.083719" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:39.075672" elapsed="0.008297"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:39.087793" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782899,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:39.085042" elapsed="0.002808"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:39.084811" elapsed="0.003078"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:39.084792" elapsed="0.003124"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:39.091760" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:39.088218" elapsed="0.003611"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:39.087978" elapsed="0.003902"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:39.087959" elapsed="0.003957"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:39.092793" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:39.092178" elapsed="0.000656"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:39.093282" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:39.092937" elapsed="0.000474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:39.094214" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:39.093765" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:39.093462" elapsed="0.000848"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:39.092911" elapsed="0.001430"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:39.095153" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:39.094604" elapsed="0.000590"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:39.095693" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:39.095298" elapsed="0.000490"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:39.096515" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:39.096055" elapsed="0.000526"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:39.095824" elapsed="0.000811"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:39.095272" elapsed="0.001394"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:39.096895" elapsed="0.000501"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:39.098176" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:39.097755" elapsed="0.000459"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:39.098440" elapsed="0.003139"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:39.084344" elapsed="0.017312"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:39.101865" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-10T01:01:39.101740" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:39.101718" 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-04-10T01:01:39.102130" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:39.102205" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:39.104675" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782899,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:39.068181" elapsed="0.036525"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:39.104763" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:39.104933" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782899,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:39.066129" elapsed="0.038832"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:39.106150" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782899, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:39.105644" elapsed="0.000536"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:39.106230" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:01:39.106391" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782899, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:39.105215" elapsed="0.001203"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:39.106807" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:39.106619" elapsed="0.000214"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:39.107373" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:39.107031" elapsed="0.000372"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:39.108066" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:39.107786" elapsed="0.000307"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:39.108827" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:39.108268" elapsed="0.000632">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:39.056900" elapsed="0.052131">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:40.120367" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:40.119997" elapsed="0.000407"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:40.120462" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:01:40.120649" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:40.119623" elapsed="0.001052"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:40.127929" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:40.127436" elapsed="0.000553"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:40.128404" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:40.128155" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:40.137862" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:40.138052" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:40 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:40 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782900,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:40.138205" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:40.130764" elapsed="0.007490"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:40.128532" elapsed="0.009789"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:40.138633" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:40.138363" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:40.128508" elapsed="0.010251"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:40.144123" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782900,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:40.140425" elapsed="0.003771"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:40.140044" elapsed="0.004203"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:40.140015" elapsed="0.004268"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:40.147745" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:40.144759" elapsed="0.003046"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:40.144364" elapsed="0.003478"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:40.144340" elapsed="0.003528"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:40.148484" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:40.148068" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:40.148897" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:40.148609" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:40.149462" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:40.149150" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:40.148983" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:40.148590" elapsed="0.000974"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:40.150161" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:40.149729" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:40.150502" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:40.150262" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:40.151095" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:40.150767" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:40.150604" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:40.150244" elapsed="0.000938"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:40.151342" elapsed="0.000380"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:40.152211" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:40.151909" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:40.152400" elapsed="0.002573"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:40.139324" elapsed="0.015722"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:40.155235" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-10T01:01:40.155121" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:40.155102" 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-04-10T01:01:40.155492" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:40.155582" elapsed="0.000017"/>
</return>
<msg time="2026-04-10T01:01:40.158029" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782900,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:40.121042" elapsed="0.037090"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:40.158189" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:01:40.158352" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782900,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:40.119067" elapsed="0.039312"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:40.159514" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782900, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:40.159080" elapsed="0.000480"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:40.159613" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:40.159774" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782900, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:40.158681" elapsed="0.001119"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:40.160215" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:40.160008" elapsed="0.000234"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:40.160787" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:40.160422" elapsed="0.000392"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:40.161292" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:40.161016" elapsed="0.000302"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:40.161872" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:40.161492" elapsed="0.000452">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:40.109924" elapsed="0.052150">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:41.173243" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:41.172748" elapsed="0.000538"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:41.173362" elapsed="0.000053"/>
</return>
<msg time="2026-04-10T01:01:41.173610" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:41.172215" elapsed="0.001432"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:41.182477" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:41.182190" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:41.182949" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:41.182702" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:41.189705" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:41.189766" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:41 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:41 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782901,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:41.189861" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:41.185241" elapsed="0.004647"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:41.183068" elapsed="0.006864"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:41.190122" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:41.189961" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:41.183047" elapsed="0.007162"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:41.193852" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782901,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:41.191279" elapsed="0.002622"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:41.191057" elapsed="0.002941"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:41.191039" elapsed="0.002985"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:41.196815" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:41.194336" elapsed="0.002532"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:41.194082" elapsed="0.002830"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:41.194064" elapsed="0.002879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:41.197525" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:41.197129" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:41.197884" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:41.197644" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:41.198477" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:41.198133" elapsed="0.000371"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:41.197967" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:41.197625" elapsed="0.000962"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:41.199119" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:41.198750" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:41.199473" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:41.199215" elapsed="0.000533"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:41.200422" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:41.200011" elapsed="0.000447"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:41.199784" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:41.199198" elapsed="0.001337"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:41.200771" elapsed="0.000478"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:41.201903" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:41.201482" elapsed="0.000457"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:41.202157" elapsed="0.003506"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:41.190632" elapsed="0.015122"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:41.205999" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-10T01:01:41.205852" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:41.205827" elapsed="0.000295"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:41.206353" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:41.206452" elapsed="0.000021"/>
</return>
<msg time="2026-04-10T01:01:41.209780" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782901,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:41.174235" elapsed="0.035585"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:41.209891" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T01:01:41.210100" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782901,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:41.171476" elapsed="0.038659"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:41.211275" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782901, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:41.210857" elapsed="0.000456"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:41.211371" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T01:01:41.211566" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782901, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:41.210488" elapsed="0.001148"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:41.212001" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:41.211818" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:41.212501" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:41.212201" elapsed="0.000326"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:41.212985" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:41.212719" elapsed="0.000304"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:41.213613" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:41.213242" elapsed="0.000444">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:41.163051" elapsed="0.050748">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:42.226799" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:42.226392" elapsed="0.000440"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:42.226891" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:01:42.227067" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:42.226026" elapsed="0.001066"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:42.234034" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:42.233771" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:42.234486" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:42.234239" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:42.242684" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:42.242746" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:42 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:42 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782902,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:42.242840" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:42.236785" elapsed="0.006081"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:42.234619" elapsed="0.008289"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:42.243091" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:42.242935" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:42.234598" elapsed="0.008576"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:42.246881" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782902,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:42.244240" elapsed="0.002691"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:42.244002" elapsed="0.002964"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:42.243984" elapsed="0.003006"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:42.250371" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:42.247271" elapsed="0.003166"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:42.247047" elapsed="0.003438"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:42.247030" elapsed="0.003488"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:42.251354" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:42.250797" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:42.251847" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:42.251490" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:42.252676" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:42.252218" elapsed="0.000496"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:42.251987" elapsed="0.000953"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:42.251465" elapsed="0.001515"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:42.253758" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:42.253211" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:42.254223" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:42.253895" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:42.255001" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:42.254584" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:42.254336" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:42.253870" elapsed="0.001247"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:42.255330" elapsed="0.000507"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:42.256496" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:42.256093" elapsed="0.000440"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:42.256779" elapsed="0.003449"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:42.243534" elapsed="0.016789"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:42.260564" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T01:01:42.260425" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:42.260399" 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-04-10T01:01:42.260814" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:42.260885" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:42.263291" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782902,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:42.227450" elapsed="0.035870"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:42.263374" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T01:01:42.263525" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782902,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:42.225514" elapsed="0.038051"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:42.264601" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782902, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:42.264173" elapsed="0.000457"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:42.264680" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:42.264836" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782902, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:42.263800" elapsed="0.001063"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:42.265222" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:42.265042" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:42.265746" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:42.265423" elapsed="0.000350"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:42.266210" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:42.265947" elapsed="0.000289"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:42.266791" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:42.266408" elapsed="0.000454">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:42.214919" elapsed="0.052055">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:43.279241" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:43.278745" elapsed="0.000625"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:43.279451" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T01:01:43.279707" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:43.278223" elapsed="0.001520"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:43.288510" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:43.288226" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:43.288984" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:43.288739" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:43.296529" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:43.296619" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:43 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782903,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:43.296732" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:43.291250" elapsed="0.005511"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:43.289102" elapsed="0.007708"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:43.297025" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:43.296843" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:43.289081" elapsed="0.008033"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:43.300824" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782903,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:43.298240" elapsed="0.002634"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:43.298003" elapsed="0.002906"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:43.297983" elapsed="0.002950"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:43.306327" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:43.301213" elapsed="0.005188"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:43.300989" elapsed="0.005465"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:43.300972" elapsed="0.005521"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:43.307440" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:43.306842" elapsed="0.000638"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:43.307974" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:43.307617" elapsed="0.000444"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:43.308809" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:43.308337" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:43.308096" elapsed="0.000806"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:43.307588" elapsed="0.001346"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:43.309753" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:43.309169" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:43.310245" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:43.309898" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:43.311066" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:43.310629" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:43.310365" elapsed="0.000792"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:43.309872" elapsed="0.001315"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:43.311418" elapsed="0.000536"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:43.312638" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:43.312198" elapsed="0.000580"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:43.313014" elapsed="0.003065"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:43.297512" elapsed="0.018637"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:43.316332" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T01:01:43.316223" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:43.316204" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:43.316594" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:43.316666" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:43.319053" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782903,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:43.280222" elapsed="0.038859"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:43.319133" elapsed="0.000028"/>
</return>
<msg time="2026-04-10T01:01:43.319284" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782903,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:43.277506" elapsed="0.041804"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:43.320319" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782903, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:43.319923" elapsed="0.000424"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:43.320395" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:43.320589" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782903, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:43.319561" elapsed="0.001063"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:43.321028" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:43.320824" elapsed="0.000236"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:43.321581" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:43.321251" elapsed="0.000370"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:43.322061" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:43.321797" elapsed="0.000290"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:43.322669" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:43.322258" elapsed="0.000487">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:43.267898" elapsed="0.054959">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:44.335067" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:44.334682" elapsed="0.000419"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:44.335162" elapsed="0.000047"/>
</return>
<msg time="2026-04-10T01:01:44.335339" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:44.334299" elapsed="0.001064"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:44.342662" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:44.342348" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:44.343125" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:44.342877" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:44.350337" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:44.350459" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:44 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782904,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:44.350579" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:44.345534" elapsed="0.005073"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:44.343249" elapsed="0.007403"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:44.350837" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:44.350682" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:44.343226" elapsed="0.007700"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:44.355499" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782904,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:44.352074" elapsed="0.003553"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:44.351844" elapsed="0.003843"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:44.351825" elapsed="0.003904"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:44.359835" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:44.356165" elapsed="0.003737"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:44.355826" elapsed="0.004138"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:44.355798" elapsed="0.004210"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:44.360876" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:44.360284" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:44.361350" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:44.361016" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:44.362251" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:44.361720" elapsed="0.000573"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:44.361465" elapsed="0.000879"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:44.360990" elapsed="0.001384"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:44.363138" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:44.362624" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:44.363697" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:44.363273" elapsed="0.000514"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:44.364473" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:44.364048" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:44.363820" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:44.363249" elapsed="0.001350"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:44.364757" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:44.365587" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:44.365277" elapsed="0.000338"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:44.365773" elapsed="0.002636"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:44.351310" elapsed="0.017164"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:44.368673" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-10T01:01:44.368562" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:44.368527" elapsed="0.000242"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:44.368919" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:44.368990" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:44.371430" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782904,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:44.335800" elapsed="0.035719"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:44.371606" elapsed="0.000035"/>
</return>
<msg time="2026-04-10T01:01:44.371791" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782904,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:44.333813" elapsed="0.038006"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:44.372808" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782904, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:44.372392" elapsed="0.000445"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:44.372886" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:44.373042" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782904, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:44.372047" elapsed="0.001021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:44.373429" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:44.373249" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:44.373955" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:44.373650" elapsed="0.000331"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:44.374417" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:44.374155" elapsed="0.000287"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:44.374980" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:44.374630" elapsed="0.000422">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:44.323851" elapsed="0.051313">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:45.388673" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:45.388265" elapsed="0.000442"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:45.388770" elapsed="0.000046"/>
</return>
<msg time="2026-04-10T01:01:45.388947" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:45.387886" elapsed="0.001087"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:45.396862" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:45.396422" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:45.397593" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:45.397173" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:45.409092" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:45.409158" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:45 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782905,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:45.409262" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:45.401024" elapsed="0.008265"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:45.397778" elapsed="0.011557"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:45.409586" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:45.409366" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:45.397747" elapsed="0.011934"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:45.413615" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782905,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:45.410826" elapsed="0.002878"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:45.410583" elapsed="0.003235"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:45.410559" elapsed="0.003286"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:45.417913" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:45.414142" elapsed="0.003843"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:45.413905" elapsed="0.004134"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:45.413886" elapsed="0.004188"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:45.418995" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:45.418349" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:45.419505" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:45.419145" elapsed="0.000478"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:45.420399" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:45.419907" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:45.419660" elapsed="0.000849"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:45.419118" elapsed="0.001447"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:45.421373" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:45.420817" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:45.422028" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:45.421650" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:45.423075" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:45.422397" elapsed="0.000738"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:45.422154" elapsed="0.001061"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:45.421608" elapsed="0.001655"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:45.423601" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:45.424473" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:45.424157" elapsed="0.000343"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:45.424679" elapsed="0.002749"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:45.410101" elapsed="0.017418"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:45.427753" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-10T01:01:45.427624" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:45.427603" elapsed="0.000253"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:45.428014" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:45.428106" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T01:01:45.430556" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782905,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:45.389328" elapsed="0.041261"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:45.430643" elapsed="0.000031"/>
</return>
<msg time="2026-04-10T01:01:45.430801" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782905,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:45.387287" elapsed="0.043539"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:45.431906" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782905, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:45.431455" elapsed="0.000480"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:45.431983" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:45.432173" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782905, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:45.431077" elapsed="0.001192"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:45.432856" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:45.432458" elapsed="0.000456"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:45.434213" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:45.433333" elapsed="0.000943"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:45.434916" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:45.434644" elapsed="0.000297"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:45.435483" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:45.435118" elapsed="0.000461">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:45.376187" elapsed="0.059517">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:46.444850" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:46.444367" elapsed="0.000523"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:46.444963" elapsed="0.000052"/>
</return>
<msg time="2026-04-10T01:01:46.445176" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:46.443906" elapsed="0.001303"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:46.454990" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:46.454620" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:46.456230" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:46.455270" elapsed="0.001078"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:46.468878" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:46.468955" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:46 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:46 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782906,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:46.469067" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:46.461744" elapsed="0.007350"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:46.456529" elapsed="0.012616"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:46.469359" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:46.469179" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:46.456480" elapsed="0.012968"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:46.473430" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782906,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:46.470628" elapsed="0.002855"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:46.470365" elapsed="0.003155"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:46.470344" elapsed="0.003219"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:46.476500" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:46.473860" elapsed="0.002704"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:46.473625" elapsed="0.002977"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:46.473607" elapsed="0.003030"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:46.477496" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:46.476907" elapsed="0.000630"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:46.478032" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:46.477672" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:46.478883" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:46.478399" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:46.478156" elapsed="0.000906"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:46.477644" elapsed="0.001455"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:46.479982" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:46.479347" elapsed="0.000676"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:46.480488" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:46.480133" elapsed="0.000466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:46.481334" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:46.480882" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:46.480636" elapsed="0.000794"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:46.480105" elapsed="0.001357"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:46.481723" elapsed="0.000578"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:46.483115" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:46.482589" elapsed="0.000580"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:46.483465" elapsed="0.003922"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:46.469892" elapsed="0.017601"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:46.487900" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-10T01:01:46.487720" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:46.487682" elapsed="0.000359"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:46.488270" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:46.488377" elapsed="0.000023"/>
</return>
<msg time="2026-04-10T01:01:46.490907" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782906,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:46.445690" elapsed="0.045246"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:46.490990" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:46.491147" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782906,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:46.443233" elapsed="0.047941"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:46.492421" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782906, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:46.491913" elapsed="0.000539"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:46.492507" elapsed="0.000033"/>
</return>
<msg time="2026-04-10T01:01:46.492700" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782906, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:46.491416" elapsed="0.001313"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:46.493156" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:46.492946" elapsed="0.000239"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:46.493791" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:46.493404" elapsed="0.000416"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:46.494338" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:46.494041" elapsed="0.000325"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:46.495009" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:46.494589" elapsed="0.000501">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:46.436621" elapsed="0.058607">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:47.508616" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:47.508222" elapsed="0.000511"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:47.508796" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:01:47.508969" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:47.507851" elapsed="0.001143"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:47.516021" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:47.515731" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:47.516584" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:47.516270" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:47.525453" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:47.525520" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:47 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:47 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782907,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:47.525647" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:47.518991" elapsed="0.006683"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:47.516712" elapsed="0.009008"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:47.526042" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:47.525749" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:47.516689" elapsed="0.009448"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:47.530035" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782907,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:47.527327" elapsed="0.002761"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:47.527089" elapsed="0.003035"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:47.527070" elapsed="0.003078"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:47.534438" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:47.530434" elapsed="0.004078"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:47.530205" elapsed="0.004387"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:47.530188" elapsed="0.004441"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:47.535480" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:47.534901" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:47.536038" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:47.535652" elapsed="0.000475"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:47.536968" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:47.536412" elapsed="0.000597"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:47.536163" elapsed="0.000901"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:47.535625" elapsed="0.001471"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:47.537948" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:47.537336" elapsed="0.000652"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:47.538447" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:47.538094" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:47.539453" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:47.538978" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:47.538598" elapsed="0.000972"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:47.538067" elapsed="0.001538"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:47.539839" elapsed="0.000525"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:47.541066" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:47.540639" elapsed="0.000561"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:47.541443" elapsed="0.002935"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:47.526630" elapsed="0.017819"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:47.544649" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-10T01:01:47.544522" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:47.544504" elapsed="0.000241"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:47.544897" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:47.544969" elapsed="0.000016"/>
</return>
<msg time="2026-04-10T01:01:47.547440" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782907,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:47.509348" elapsed="0.038121"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:47.547524" elapsed="0.000041"/>
</return>
<msg time="2026-04-10T01:01:47.547695" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":1,"timestamp":1775782907,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:47.507310" elapsed="0.040412"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:47.548752" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782907, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:47.548330" elapsed="0.000451"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:47.548829" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:47.548985" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 1, 'timestamp': 1775782907, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:47.547963" elapsed="0.001048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:47.549370" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:47.549190" elapsed="0.000206"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:47.549962" level="INFO">${value} = 1</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:47.549586" elapsed="0.000407"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:47.550456" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:47.550187" elapsed="0.000295"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<msg time="2026-04-10T01:01:47.551201" level="FAIL">'1' does not start with '2'</msg>
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="FAIL" start="2026-04-10T01:01:47.550682" elapsed="0.000619">'1' does not start with '2'</status>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="FAIL" start="2026-04-10T01:01:47.496177" elapsed="0.055285">'1' does not start with '2'</status>
</kw>
<kw name="Operation Status Check" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.563030" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:48.562473" elapsed="0.000604"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:48.563158" elapsed="0.000055"/>
</return>
<msg time="2026-04-10T01:01:48.563399" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:48.561924" elapsed="0.001513"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.573441" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:48.573076" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.574128" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:48.573760" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:48.583333" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:48.583491" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/ReadOpStatus 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:48 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:48 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782908,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:48.583648" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:48.577352" elapsed="0.006332"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:48.574298" elapsed="0.009442"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.583983" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:48.583777" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.574266" elapsed="0.009864"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.588870" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782908,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:48.585532" elapsed="0.003406"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:48.585230" elapsed="0.003756"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.585205" elapsed="0.003814"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.592698" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:48.589400" elapsed="0.003360"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:48.589096" elapsed="0.003708"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.589074" elapsed="0.003761"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.593611" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:48.593075" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.594060" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:48.593744" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.594804" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:48.594384" elapsed="0.000455"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:48.594168" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.593719" elapsed="0.001193"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.595617" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:48.595125" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.596062" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:48.595740" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.596786" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:48.596378" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:48.596167" elapsed="0.000700"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.595717" elapsed="0.001179"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:48.597102" elapsed="0.000478"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:48.598184" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:48.597805" elapsed="0.000413"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:48.598423" elapsed="0.003225"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:48.584661" elapsed="0.017053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:48.601898" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-10T01:01:48.601785" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.601766" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.602142" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:48.602212" elapsed="0.000015"/>
</return>
<msg time="2026-04-10T01:01:48.604734" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782908,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:48.563987" elapsed="0.040835"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:48.604893" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T01:01:48.605080" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"ReadOpStatus","type":"read"},"value":2,"timestamp":1775782908,"status":200}</msg>
<var>${data}</var>
<arg>${op_status_uri}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:48.561114" elapsed="0.044001"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.606403" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782908, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:48.605895" elapsed="0.000545"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:48.606506" elapsed="0.000057"/>
</return>
<msg time="2026-04-10T01:01:48.606740" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'ReadOpStatus', 'type': 'read'}, 'value': 2, 'timestamp': 1775782908, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:48.605417" elapsed="0.001359"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:48.607253" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:48.607015" elapsed="0.000272"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.607953" level="INFO">${value} = 2</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:48.607526" elapsed="0.000463"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.608622" level="INFO">${two} = 2</msg>
<var>${two}</var>
<arg>2</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-10T01:01:48.608246" elapsed="0.000410"/>
</kw>
<kw name="Should Start With" owner="BuiltIn">
<arg>${value}</arg>
<arg>${two}</arg>
<doc>Fails if the string ``str1`` does not start with the string ``str2``.</doc>
<status status="PASS" start="2026-04-10T01:01:48.608888" elapsed="0.000397"/>
</kw>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Checks to see if read or write operation is successfull in controller node.</doc>
<status status="PASS" start="2026-04-10T01:01:48.552450" elapsed="0.056912"/>
</kw>
<arg>${timeout}</arg>
<arg>1s</arg>
<arg>BulkomaticKeywords.Operation Status Check</arg>
<arg>${jolokia_read_op_status}</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-10T01:01:36.946106" elapsed="11.663321"/>
</kw>
<arg>${index}</arg>
<arg>${timeout}</arg>
<doc>Wait Until Read operation status is OK in member ${controller_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:36.945705" elapsed="11.663806"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:01:36.941015" elapsed="11.668559"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:01:36.940873" elapsed="11.668749"/>
</for>
<for flavor="IN">
<iter>
<kw name="Verify Flow Count" owner="BulkomaticKeywords">
<kw name="Get Bulk Flow Count" owner="BulkomaticKeywords">
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.624638" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:48.624207" elapsed="0.000467"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:48.624737" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T01:01:48.624936" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:48.623707" elapsed="0.001262"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.634053" level="INFO">/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:48.633720" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.634663" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:48.634323" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:48.642811" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 path_url=/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:48.642889" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter/FlowCount 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:48 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:48 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782908,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:48.643016" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:48.637746" elapsed="0.005305"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:48.634816" elapsed="0.008291"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.643353" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:48.643144" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.634790" elapsed="0.008780"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.648501" level="INFO">{"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782908,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:48.645045" elapsed="0.003541"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:48.644737" elapsed="0.003895"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.644712" elapsed="0.003952"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.652502" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:48.649033" elapsed="0.003549"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:48.648738" elapsed="0.003889"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.648717" elapsed="0.003941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.653393" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:48.652894" elapsed="0.000533"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.653855" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:48.653520" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.654581" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:48.654179" elapsed="0.000437"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:48.653961" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.653497" elapsed="0.001195"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.655375" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:48.654908" elapsed="0.000501"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.655821" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:48.655499" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.656595" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:48.656190" elapsed="0.000441"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:48.655926" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.655476" elapsed="0.001233"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:48.656916" elapsed="0.000452"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:48.657986" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:48.657614" elapsed="0.000405"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:48.658226" elapsed="0.003215"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:48.644146" elapsed="0.017380"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-10T01:01:48.661775" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T01:01:48.661637" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.661613" elapsed="0.000279"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.662086" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-10T01:01:48.662174" elapsed="0.000020"/>
</return>
<msg time="2026-04-10T01:01:48.665275" level="INFO">${response_text} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782908,"status":200}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:48.625420" elapsed="0.039891"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:48.665377" elapsed="0.000036"/>
</return>
<msg time="2026-04-10T01:01:48.665598" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782908,"status":200}</msg>
<var>${data}</var>
<arg>${jolokia_flow_count_status}</arg>
<arg>${controller_index}</arg>
<doc>Send a GET with the supplied uri to member ${member_index}.</doc>
<status status="PASS" start="2026-04-10T01:01:48.623082" elapsed="0.042552"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-10T01:01:48.665694" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T01:01:48.665881" level="INFO">${data} = {"request":{"mbean":"org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter","attribute":"FlowCount","type":"read"},"value":0,"timestamp":1775782908,"status":200}</msg>
<var>${data}</var>
<arg>${controller_index}</arg>
<doc>Get Flow count in member 2. New Flow Count is available after Get Bulk Flow operation.</doc>
<status status="PASS" start="2026-04-10T01:01:48.617100" elapsed="0.048881"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.667288" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782908, 'status': 200}</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:48.666778" elapsed="0.000547"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:48.667387" elapsed="0.000038"/>
</return>
<msg time="2026-04-10T01:01:48.667613" level="INFO">${json} = {'request': {'mbean': 'org.opendaylight.openflowplugin.applications.bulk.o.matic:type=FlowCounter', 'attribute': 'FlowCount', 'type': 'read'}, 'value': 0, 'timestamp': 1775782908, 'status': 200}</msg>
<var>${json}</var>
<arg>${data}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:48.666294" elapsed="0.001355"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:48.668412" level="INFO">${value} = 0</msg>
<var>${value}</var>
<arg>${json}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:48.667889" elapsed="0.000585"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.669598" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${value}</arg>
<arg>${flow_count}</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-10T01:01:48.668924" elapsed="0.000799"/>
</kw>
<arg>${flow_count}</arg>
<arg>${index}</arg>
<doc>Verify Flow Count in member ${controller_index} matches 0.</doc>
<status status="PASS" start="2026-04-10T01:01:48.616480" elapsed="0.053376"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:01:48.609872" elapsed="0.060062"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:01:48.609694" elapsed="0.060310"/>
</for>
<arg>${temp_json_config_get}</arg>
<arg>${operation_timeout}</arg>
<arg>${flow_count_after_del}</arg>
<arg>${Inventory_Leader_List}</arg>
<doc>Get Bulk Flow and Verify Flow Count in ${controller_index_list} matches ${flow_count}.</doc>
<status status="PASS" start="2026-04-10T01:01:36.869050" elapsed="11.801077"/>
</kw>
<doc>Verifying No FLows in Cluster after Flows Deletion</doc>
<status status="PASS" start="2026-04-10T01:01:36.445086" elapsed="12.225299"/>
</test>
<test id="s1-s4-t12" name="PreLeader Verification" line="128">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-10T01:01:48.676337" elapsed="0.000344"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-10T01:01:48.675919" 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-04-10T01:01:48.678282" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:48.678112" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.678085" elapsed="0.000301"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:48.684927" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:48.684817" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.684799" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.686021" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-10T01:01:48.685626" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.686515" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-10T01:01:48.686209" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-10T01:01:48.686603" elapsed="0.000032"/>
</return>
<msg time="2026-04-10T01:01:48.686763" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-10T01:01:48.685229" elapsed="0.001558"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:48.692379" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:48.692270" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.692251" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:48.693656" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:48.693513" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.693496" elapsed="0.000229"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:48.694173" level="INFO">${karaf_connection_index} = 471</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:48.693871" elapsed="0.000329"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T01:01:48.694609" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T01:01:48.694360" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T01:01:48.728175" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T01:01:48.695140" elapsed="0.033155"/>
</kw>
<msg time="2026-04-10T01:01:48.728617" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T01:01:48.728666" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:48.694800" elapsed="0.033905"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T01:01:48.789769" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "P "r "e "L "e "a "d "e "[78Cr "[A[78C
 "V "e "r "i "f "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T01:01:48.729267" elapsed="0.060720"/>
</kw>
<msg time="2026-04-10T01:01:48.790201" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T01:01:48.790248" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:48.728898" elapsed="0.061388"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.790744" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:48.790401" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.790367" elapsed="0.000465"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.791351" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "P "r "e "L "e "a "d "e "[78Cr "[A[78C
 "V "e "r "i "f "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:48.790981" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.791769" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:48.791504" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.791486" elapsed="0.000370"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T01:01:48.791894" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:48.793498" elapsed="0.000798"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T01:01:48.794594" elapsed="0.000686"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T01:01:48.795579" 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-04-10T01:01:48.792838" elapsed="0.003245"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T01:01:48.792232" elapsed="0.003916"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T01:01:48.693211" elapsed="0.103037"/>
</kw>
<msg time="2026-04-10T01:01:48.796341" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:48.796384" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:48.692614" elapsed="0.103808"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T01:01:48.796622" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-10T01:01:48.796499" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.796481" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.797119" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.797461" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T01:01:48.797533" elapsed="0.000030"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T01:01:48.691932" elapsed="0.105725"/>
</kw>
<msg time="2026-04-10T01:01:48.797750" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:48.797794" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:48.687167" elapsed="0.110663"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.798220" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:48.797967" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.797948" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-10T01:01:48.687020" elapsed="0.111300"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:48.804061" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:48.803951" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.803932" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:48.805368" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:48.805261" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.805244" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:48.805910" level="INFO">${karaf_connection_index} = 473</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:48.805605" elapsed="0.000331"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T01:01:48.806319" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T01:01:48.806095" elapsed="0.000250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T01:01:48.843965" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T01:01:48.806861" elapsed="0.037224"/>
</kw>
<msg time="2026-04-10T01:01:48.844260" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T01:01:48.844306" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:48.806504" elapsed="0.037838"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T01:01:48.896065" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "P "r "e "L "e "a "d "e "[78Cr "[A[78C
 "V "e "r "i "f "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T01:01:48.844928" elapsed="0.051369"/>
</kw>
<msg time="2026-04-10T01:01:48.896520" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T01:01:48.896592" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:48.844530" elapsed="0.052102"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.897089" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:48.896759" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.896719" elapsed="0.000458"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:48.897729" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "P "r "e "L "e "a "d "e "[78Cr "[A[78C
 "V "e "r "i "f "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:48.897323" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.898098" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:48.897879" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.897862" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T01:01:48.898211" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:48.899914" elapsed="0.000793"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T01:01:48.900992" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T01:01:48.901756" 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-04-10T01:01:48.899161" elapsed="0.003057"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T01:01:48.898561" elapsed="0.003722"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T01:01:48.804958" elapsed="0.097499"/>
</kw>
<msg time="2026-04-10T01:01:48.902573" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:48.902620" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:48.804283" elapsed="0.098374"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T01:01:48.902848" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-10T01:01:48.902739" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.902720" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.903347" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.905535" elapsed="0.000054"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T01:01:48.905641" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T01:01:48.803444" elapsed="0.102318"/>
</kw>
<msg time="2026-04-10T01:01:48.905857" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:48.905901" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:48.798615" elapsed="0.107323"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:48.906269" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:48.906013" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.905996" elapsed="0.000349"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-10T01:01:48.798454" elapsed="0.107914"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:48.912971" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:48.912859" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.912839" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-10T01:01:48.914248" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:48.914141" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:48.914124" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:48.914806" level="INFO">${karaf_connection_index} = 475</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:48.914462" elapsed="0.000373"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-10T01:01:48.915230" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-10T01:01:48.914999" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-10T01:01:48.949134" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "w "p "l "u "g "i "n "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-10T01:01:48.915810" elapsed="0.033584"/>
</kw>
<msg time="2026-04-10T01:01:48.949671" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-10T01:01:48.949724" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "p "e "n "f "l "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:48.915418" elapsed="0.034345"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-10T01:01:48.999371" level="INFO">"t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "P "r "e "L "e "a "d "e "[78Cr "[A[78C
 "V "e "r "i "f "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-10T01:01:48.950499" elapsed="0.049249"/>
</kw>
<msg time="2026-04-10T01:01:49.000052" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-10T01:01:49.000124" level="INFO">${message_wait} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:48.950033" elapsed="0.050145"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.000850" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:49.000347" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.000293" elapsed="0.000771"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.001692" level="INFO"> "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "e "r "m "[C "V "e "r "i "f "i "c "a "t "i "o "n "[C "3 "N "o "d "e "[C "C "l "u "s "t "e "r ". "P "r "e "L "e "a "d "e "[78Cr "[A[78C
 "V "e "r "i "f "i "c "a "t "i "o "n "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:49.001264" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.002183" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:49.001869" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.001836" elapsed="0.000464"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-10T01:01:49.002354" elapsed="0.000057"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:49.004635" elapsed="0.000873"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-10T01:01:49.005911" elapsed="0.000657"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-10T01:01:49.006939" elapsed="0.000409"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-10T01:01:49.003699" elapsed="0.003826"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-10T01:01:49.002831" elapsed="0.004779"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-10T01:01:48.913838" elapsed="0.093879"/>
</kw>
<msg time="2026-04-10T01:01:49.007819" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:49.007866" level="INFO">${message} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:48.913207" elapsed="0.094697"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-10T01:01:49.008111" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-10T01:01:49.007989" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.007968" elapsed="0.000248"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.008675" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.009035" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-10T01:01:49.009117" elapsed="0.000024"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-10T01:01:48.912463" elapsed="0.096788"/>
</kw>
<msg time="2026-04-10T01:01:49.009355" level="INFO">${status} = PASS</msg>
<msg time="2026-04-10T01:01:49.009402" level="INFO">${output} =  "t "e "r "i "n "g "- "b "u "l "k "o "m "a "t "i "c ". "t "x "t ". "C "l "u "s "t "e "r "[C "C "u "r "r "e "n "t "[C "T "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:48.906660" elapsed="0.102782"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.009797" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:49.009520" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.009502" elapsed="0.000376"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-10T01:01:48.906499" elapsed="0.103403"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-10T01:01:48.686844" elapsed="0.323095"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-10T01:01:48.684426" elapsed="0.325575"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-10T01:01:48.677678" elapsed="0.332384"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-10T01:01:48.676994" elapsed="0.333126"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-10T01:01:48.672403" elapsed="0.337783"/>
</kw>
<kw name="Get_Last_Index_Of_Shard_At_Member">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.014489" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:49.014146" elapsed="0.000372"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:49.014588" elapsed="0.000034"/>
</return>
<msg time="2026-04-10T01:01:49.014752" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:49.013663" elapsed="0.001115"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.019106" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:49.014849" elapsed="0.004330"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.014832" elapsed="0.004372"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T01:01:49.019890" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T01:01:49.019782" elapsed="0.000172"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T01:01:49.020016" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:49.019978" elapsed="0.000077"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.019764" elapsed="0.000314"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.020229" elapsed="0.000022"/>
</kw>
<msg time="2026-04-10T01:01:49.020351" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T01:01:49.019478" elapsed="0.000898"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.020967" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:49.020581" elapsed="0.000413"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.021626" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:49.021152" elapsed="0.000502"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.027334" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:49.027074" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.027835" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:49.027587" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:49.038254" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:49.038320" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:49 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:49 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":124217,"SnapshotIndex":451828,"InMemoryJournalLogSize":656,"ReplicatedToAllIndex":451828,"Leader":"member-2-shard-inventory-config","LastIndex":452484,"RaftState":"Leader","LastApplied":451829,"LastCommittedTransactionTime":"2026-04-10 01:01:35.412","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":452484,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.172","active":true,"matchIndex":452101,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":452102},{"timeSinceLastActivity":"00:00:00.216","active":true,"matchIndex":452067,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":452068}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"635.7 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":15,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":451829,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10006,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":499480},"timestamp":1775782909,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:49.038449" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:49.030206" elapsed="0.008269"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:49.027963" elapsed="0.010557"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.038757" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:49.038570" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.027942" elapsed="0.010968"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.042668" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":124217,"SnapshotIndex":451828,"InMemoryJournalLogSize":656,"ReplicatedToAllIndex":451828,"Leader":"member-2-shard-inventory-config","LastIndex":452484,"RaftState":"Leader","LastApplied":451829,"LastCommittedTransactionTime":"2026-04-10 01:01:35.412","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":452484,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.172","active":true,"matchIndex":452101,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":452102},{"timeSinceLastActivity":"00:00:00.216","active":true,"matchIndex":452067,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":452068}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"635.7 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":15,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":451829,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10006,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":499480},"timestamp":1775782909,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:49.039999" elapsed="0.002744"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:49.039773" elapsed="0.003007"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.039755" elapsed="0.003050"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.046299" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:49.043087" elapsed="0.003278"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:49.042861" elapsed="0.003555"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.042844" elapsed="0.003606"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.047248" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:49.046711" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.047775" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:49.047416" elapsed="0.000441"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.048565" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:49.048119" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:49.047890" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.047391" elapsed="0.001299"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.049435" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:49.048925" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.049925" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:49.049594" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.050704" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:49.050266" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:49.050041" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.049568" elapsed="0.001252"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:49.051036" elapsed="0.000537"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:49.052208" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:49.051809" elapsed="0.000435"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:49.052462" elapsed="0.003428"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:49.039293" elapsed="0.016662"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:01:49.056131" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:49.056025" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.056007" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:01:49.059410" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:01:49.056348" elapsed="0.003131"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:01:49.059535" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T01:01:49.059721" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:49.022525" elapsed="0.037223"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:49.059805" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T01:01:49.059954" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T01:01:49.021871" elapsed="0.038108"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.061040" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782909, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:49.060570" elapsed="0.000499"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:49.061118" elapsed="0.000029"/>
</return>
<msg time="2026-04-10T01:01:49.061300" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782909, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:49.060206" elapsed="0.001121"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:49.061711" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 451829, 'CommittedTransactionsCount': 15, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': Tru...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:49.061485" elapsed="0.000253"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:49.062105" level="INFO">${raft_property} = 452484</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:49.061897" elapsed="0.000234"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T01:01:49.062179" elapsed="0.000027"/>
</return>
<msg time="2026-04-10T01:01:49.062331" level="INFO">${LastIndex} = 452484</msg>
<var>${LastIndex}</var>
<arg>LastIndex</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${Inventory_Leader}</arg>
<arg>${verify_restconf}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T01:01:49.010816" elapsed="0.051539"/>
</kw>
<return>
<value>${LastIndex}</value>
<status status="PASS" start="2026-04-10T01:01:49.062409" elapsed="0.000026"/>
</return>
<msg time="2026-04-10T01:01:49.062571" level="INFO">${LastIndex} = 452484</msg>
<var>${LastIndex}</var>
<doc>Find a leader and followers in the inventory config shard</doc>
<status status="PASS" start="2026-04-10T01:01:49.010350" elapsed="0.052247"/>
</kw>
<kw name="Get_Last_Applied_Of_Shard_At_Member">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.066474" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:49.066172" elapsed="0.000329"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-10T01:01:49.066562" elapsed="0.000030"/>
</return>
<msg time="2026-04-10T01:01:49.066713" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-10T01:01:49.065820" elapsed="0.000918"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.070937" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:49.066806" elapsed="0.004204"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.066789" elapsed="0.004246"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-10T01:01:49.071686" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-10T01:01:49.071577" elapsed="0.000174"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-10T01:01:49.071812" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:49.071774" elapsed="0.000079"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.071558" elapsed="0.000318"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.072026" elapsed="0.000021"/>
</kw>
<msg time="2026-04-10T01:01:49.072148" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-10T01:01:49.071266" elapsed="0.000907"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.072747" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:49.072347" elapsed="0.000488"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.073467" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:49.073000" elapsed="0.000495"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.079465" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:49.079130" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.079955" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:49.079704" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-10T01:01:49.089146" level="INFO">GET Request : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-10T01:01:49.089231" level="INFO">GET Response : url=http://10.30.170.169:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Fri, 10 Apr 2026 01:01:49 GMT', 'Expires': 'Fri, 10 Apr 2026 00:01:49 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":124260,"SnapshotIndex":451828,"InMemoryJournalLogSize":656,"ReplicatedToAllIndex":451828,"Leader":"member-2-shard-inventory-config","LastIndex":452484,"RaftState":"Leader","LastApplied":451829,"LastCommittedTransactionTime":"2026-04-10 01:01:35.412","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":452484,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.172","active":true,"matchIndex":452101,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":452102},{"timeSinceLastActivity":"00:00:00.216","active":true,"matchIndex":452067,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":452068}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"635.7 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":15,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":451829,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10006,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":499480},"timestamp":1775782909,"status":200} 
 </msg>
<msg time="2026-04-10T01:01:49.089375" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-10T01:01:49.082435" elapsed="0.006968"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:49.080081" elapsed="0.009379"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.089745" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:49.089497" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.080058" elapsed="0.009819"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.097600" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":124260,"SnapshotIndex":451828,"InMemoryJournalLogSize":656,"ReplicatedToAllIndex":451828,"Leader":"member-2-shard-inventory-config","LastIndex":452484,"RaftState":"Leader","LastApplied":451829,"LastCommittedTransactionTime":"2026-04-10 01:01:35.412","PeerAddresses":"member-1-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.170.165:2550\/user\/shardmanager-config\/member-1-shard-inventory-config, member-3-shard-inventory-config: pekko:\/\/opendaylight-cluster-data@10.30.171.151:2550\/user\/shardmanager-config\/member-3-shard-inventory-config","LastLogIndex":452484,"LastLeadershipChangeTime":"2026-04-10 00:56:32.510","FollowerInitialSyncStatus":true,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.172","active":true,"matchIndex":452101,"voting":true,"id":"member-1-shard-inventory-config","nextIndex":452102},{"timeSinceLastActivity":"00:00:00.216","active":true,"matchIndex":452067,"voting":true,"id":"member-3-shard-inventory-config","nextIndex":452068}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"635.7 μs","CurrentTerm":7,"LastTerm":7,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-2-shard-inventory-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":15,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-inventory-config: true, member-3-shard-inventory-config: true","LastLogTerm":7,"StatRetrievalError":null,"CommitIndex":451829,"SnapshotTerm":7,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10006,"ShardName":"member-2-shard-inventory-config","LeadershipChangeCount":3,"InMemoryJournalDataSize":499480},"timestamp":1775782909,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:49.091677" elapsed="0.006094"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:49.091286" elapsed="0.006580"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.091219" elapsed="0.006713"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.103107" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-10T01:01:49.098703" elapsed="0.004491"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:49.098090" elapsed="0.005357"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.098042" elapsed="0.005455"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.104543" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:49.103882" elapsed="0.000726"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.105111" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:49.104734" elapsed="0.000463"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.105992" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:49.105495" elapsed="0.000539"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:49.105236" elapsed="0.000855"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.104701" elapsed="0.001425"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.106957" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:49.106379" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.107500" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-10T01:01:49.107111" elapsed="0.000496"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.108351" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-10T01:01:49.107899" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-04-10T01:01:49.107646" elapsed="0.000802"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.107083" elapsed="0.001400"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-10T01:01:49.108753" elapsed="0.000518"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-10T01:01:49.109974" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:49.109519" elapsed="0.000494"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-10T01:01:49.110249" elapsed="0.003902"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-10T01:01:49.090531" elapsed="0.023725"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-10T01:01:49.114531" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-10T01:01:49.114367" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-10T01:01:49.114339" elapsed="0.000326"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-10T01:01:49.119660" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-10T01:01:49.114901" elapsed="0.004805"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-10T01:01:49.119787" elapsed="0.000051"/>
</return>
<msg time="2026-04-10T01:01:49.120037" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-10T01:01:49.074393" elapsed="0.045685"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-10T01:01:49.120166" elapsed="0.000040"/>
</return>
<msg time="2026-04-10T01:01:49.120389" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 177578...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-10T01:01:49.073730" elapsed="0.046699"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.122055" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782909, 'valu...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-10T01:01:49.121340" elapsed="0.000760"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-10T01:01:49.122174" elapsed="0.000043"/>
</return>
<msg time="2026-04-10T01:01:49.122451" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-inventory-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775782909, 'valu...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-10T01:01:49.120806" elapsed="0.001780"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:49.123171" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 451829, 'CommittedTransactionsCount': 15, 'CurrentTerm': 7, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': Tru...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:49.122837" elapsed="0.000402"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-10T01:01:49.123822" level="INFO">${raft_property} = 451829</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-10T01:01:49.123489" elapsed="0.000373"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-10T01:01:49.123935" elapsed="0.000042"/>
</return>
<msg time="2026-04-10T01:01:49.124172" level="INFO">${LastApplied} = 451829</msg>
<var>${LastApplied}</var>
<arg>LastApplied</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${Inventory_Leader}</arg>
<arg>${verify_restconf}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-10T01:01:49.063151" elapsed="0.061060"/>
</kw>
<return>
<value>${LastApplied}</value>
<status status="PASS" start="2026-04-10T01:01:49.124293" elapsed="0.000039"/>
</return>
<msg time="2026-04-10T01:01:49.124514" level="INFO">${LastApplied} = 451829</msg>
<var>${LastApplied}</var>
<doc>Find a leader and followers in the inventory config shard</doc>
<status status="PASS" start="2026-04-10T01:01:49.062742" elapsed="0.061829"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-04-10T01:01:49.125373" level="FAIL">452484 != 451829</msg>
<arg>${LastIndex}</arg>
<arg>${LastApplied}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="FAIL" start="2026-04-10T01:01:49.124841" elapsed="0.000636">452484 != 451829</status>
</kw>
<kw name="Add Table In Node" owner="BulkomaticKeywords">
<arg>${temp_json_config_table}</arg>
<arg>${Follower_Node_1}</arg>
<arg>${operation_timeout}</arg>
<doc>Add Table Flow in member ${controller_index} and wait until operation is completed.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.132887" elapsed="0.000041"/>
</kw>
<kw name="Get_Last_Index_Of_Shard_At_Member">
<var>${LastIndex}</var>
<doc>Find a leader and followers in the inventory config shard</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.133172" elapsed="0.000035"/>
</kw>
<kw name="Get_Last_Applied_Of_Shard_At_Member">
<var>${LastApplied}</var>
<doc>Find a leader and followers in the inventory config shard</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.133402" elapsed="0.000033"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${LastIndex}</arg>
<arg>${LastApplied}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-04-10T01:01:49.133722" elapsed="0.000033"/>
</kw>
<doc>Verifying LastIndex and LastApplied and compare both are equal</doc>
<status status="FAIL" start="2026-04-10T01:01:48.671206" elapsed="0.462774">452484 != 451829</status>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-10T01:01:49.135069" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-10T01:01:49.134942" elapsed="0.000467"/>
</kw>
<doc>Test suite for OF-18 Spurious Leader Election verification of term change while flows are added/deleted</doc>
<status status="FAIL" start="2026-04-10T00:58:35.052162" elapsed="194.083318"/>
</suite>
<status status="FAIL" start="2026-04-10T00:48:15.885717" elapsed="813.251425"/>
</suite>
<statistics>
<total>
<stat pass="102" fail="1" skip="0">All Tests</stat>
</total>
<tag>
</tag>
<suite>
<stat name="openflowplugin-clustering-bulkomatic.txt" id="s1" pass="102" fail="1" skip="0">openflowplugin-clustering-bulkomatic.txt</stat>
<stat name="Cluster Reconcilliation Multi DPN" id="s1-s1" pass="18" fail="0" skip="0">openflowplugin-clustering-bulkomatic.txt.Cluster Reconcilliation Multi DPN</stat>
<stat name="Cluster HA Data Recovery BulkFlow 2Node Cluster" id="s1-s2" pass="30" fail="0" skip="0">openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow 2Node Cluster</stat>
<stat name="Cluster HA Data Recovery BulkFlow Single Switch" id="s1-s3" pass="43" fail="0" skip="0">openflowplugin-clustering-bulkomatic.txt.Cluster HA Data Recovery BulkFlow Single Switch</stat>
<stat name="Cluster Current Term Verification 3Node Cluster" id="s1-s4" pass="11" fail="1" skip="0">openflowplugin-clustering-bulkomatic.txt.Cluster Current Term Verification 3Node Cluster</stat>
</suite>
</statistics>
<errors>
</errors>
</robot>
